鍍金池/ 教程/ Linux/ Linux 學(xué)習(xí)記錄--啟動(dòng)流程
Linux 學(xué)習(xí)記錄--開機(jī)掛載錯(cuò)誤
日志系統(tǒng)
數(shù)據(jù)流重定向
內(nèi)存交換空間的構(gòu)建
文件系統(tǒng)簡(jiǎn)介
Linux 學(xué)習(xí)記錄--軟件安裝 RPM|SRPM|YUM
文件特殊權(quán)限
目錄配置 FHS
文件內(nèi)容查閱
Boot Loader
文件壓縮
Linux 學(xué)習(xí)記錄--文件權(quán)限
Linux 命令縮寫
命令與文件的查詢
文件|目錄的默認(rèn)權(quán)限與隱藏權(quán)限
shell script
服務(wù)
Linux 學(xué)習(xí)記錄--程序編譯與函數(shù)庫(kù)
正則表達(dá)式與其應(yīng)用
關(guān)機(jī)相關(guān)指令
shell
vim 與 vi 常用命令
系統(tǒng)調(diào)用:進(jìn)程控制
文件系統(tǒng)簡(jiǎn)單操作
磁盤掛載與卸載
有名管道通訊
磁盤分區(qū),格式化與檢驗(yàn)
工作管理與進(jìn)程管理
匿名管道通訊
Linux 學(xué)習(xí)記錄--啟動(dòng)流程
文件與目錄管理
管道命令
命名別名與歷史命令
文件備份|還原
shell變量
Linux 學(xué)習(xí)記錄--ACL 權(quán)限控制
內(nèi)核|內(nèi)核模塊編譯
文件管理相關(guān)系統(tǒng)編程

Linux 學(xué)習(xí)記錄--啟動(dòng)流程

http://wiki.jikexueyuan.com/project/learn-linux-step-by-step/images/5.bmp" alt="" />

啟動(dòng)流程

系統(tǒng)的啟動(dòng)過(guò)程大致可以分為如下幾個(gè)步驟:

  1. 加載 BIOS 的硬件信息與進(jìn)行自我測(cè)試,并依據(jù)設(shè)置取得第一個(gè)可啟動(dòng)的設(shè)備
  2. 讀取并執(zhí)行第一個(gè)啟動(dòng)設(shè)備內(nèi) MBR 的 bootloader
  3. 依據(jù) boot loader 的設(shè)置加載 kernel,kernel 會(huì)開始檢測(cè)硬件與加載驅(qū)動(dòng)程序
  4. 在硬件驅(qū)動(dòng)成功后,Kernel 會(huì)主動(dòng)調(diào)用 init 進(jìn)程,而 init 進(jìn)程回去的 run-level 信息
  5. Init 執(zhí)行/etc/rc.d/rc.sysinit 文件來(lái)準(zhǔn)備軟件執(zhí)行的操作系統(tǒng)(網(wǎng)絡(luò),時(shí)區(qū)等)
  6. Init 執(zhí)行 run-level 的各個(gè)服務(wù)的啟動(dòng)
  7. Init 執(zhí)行/etc/rc.d/rc.local 文件
  8. Init 執(zhí)行終端機(jī)模擬程序 mingetty 來(lái)啟動(dòng) login 進(jìn)程,最后就等待用戶登錄

名詞解釋
BIOS:開機(jī)的時(shí)候計(jì)算機(jī)系統(tǒng)會(huì)主動(dòng)執(zhí)行的程序,它會(huì)識(shí)別第一個(gè)可開機(jī)的設(shè)備
MBR:第一個(gè)可開機(jī)設(shè)備的第一個(gè)扇區(qū)內(nèi)的主引導(dǎo)分區(qū),內(nèi)包含 bootloader
Boot loader:可進(jìn)行內(nèi)核與虛擬文件系統(tǒng)加載的軟件
虛擬文件系統(tǒng)(initrd):內(nèi)存中仿真的根目錄,用于當(dāng) loader 不能進(jìn)行根目錄掛載時(shí)使用

根據(jù)以上啟動(dòng)流程:我的理解上這樣的一個(gè)流程

設(shè)備通電開機(jī) èBIOS 執(zhí)行 è 認(rèn)識(shí)第一個(gè)開機(jī)設(shè)備 è 將 MBR 內(nèi)容載入內(nèi)存
èbootloader 執(zhí)行 è 載入內(nèi)核與 initrdè 根目錄掛載 èinitè 登陸系統(tǒng)

Bootloader 能夠識(shí)別操作系統(tǒng)文件格式,所以可以解壓縮內(nèi)核到內(nèi)存中執(zhí)行,內(nèi)核在執(zhí)行中進(jìn)行測(cè)試與驅(qū)動(dòng)各個(gè)設(shè)備,由于驅(qū)動(dòng)(內(nèi)核模塊)是掛載到/lib/modules 下,如要讀取必要先掛在根目錄,可掛載根目錄必須讀取驅(qū)動(dòng)。此處就產(chǎn)生的了矛盾,因此為了解決這個(gè)問(wèn)題引入了 initrd, BootLoader 將initrd 解壓縮到內(nèi)存并在內(nèi)存中形成一個(gè)仿真的根目錄,加載啟動(dòng)時(shí)是必需的驅(qū)動(dòng),如磁盤的驅(qū)動(dòng),并完成根目錄實(shí)際的掛載,以完成后續(xù)的操作

Init 處理流程

(此流程是針對(duì) centos,不同的 UNIX LIKE 流程不盡相同,但思路是一致的)
在內(nèi)核加載完驅(qū)動(dòng)后,硬件就已經(jīng)準(zhǔn)備完畢了,此時(shí)內(nèi)核會(huì)主動(dòng)調(diào)用第一個(gè)進(jìn)程,即,Init 進(jìn)程,init 進(jìn)程開始開始執(zhí)行軟件環(huán)境,如服務(wù)的開啟,網(wǎng)絡(luò)的設(shè)置等。Init 所以操作都會(huì)記錄在其配置文件中/etc/inittab

其大致流程如下
Initè 讀取 init 配置文件并執(zhí)行里面的命令 è 執(zhí)行 runlevelè 執(zhí)行相應(yīng)的服務(wù)和服務(wù)è登錄圖形頁(yè)面(runlevel 5)

init 配置文件

d:5:initdefault: =>默認(rèn)啟動(dòng)級(jí)別是5

# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit =>初始化操作

l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6

# Trap CTRL-ALT-DELETE => 重新啟動(dòng)組合鍵
ca::ctrlaltdel:/sbin/shutdown -t3 -r now

# When our UPS tells us power has failed, assume we have a few minutes
# of power left.  Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly.  
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"

# If power was restored before the shutdown kicked in, cancel it.
# If power was restored before the shutdown kicked in, cancel it.
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"

# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

# Run xdm in runlevel 5
x:5:respawn:/etc/X11/prefdm –nodaemon

init 處理工作

  1. 取得 runlevel 默認(rèn)級(jí)別。這里是5
  2. 執(zhí)行 script /etc/rc.d/rc.sysinit 進(jìn)行初始化
  3. 因?yàn)?run level 是5,所以執(zhí)行5:5:wait:/etc/rc.d/rc 5
  4. 設(shè)置重啟組合鍵[ctrl]+[alt]+[del]
  5. 設(shè)置不斷電系統(tǒng) pr 與 pf
  6. 啟動(dòng)6個(gè)終端機(jī)
  7. 啟動(dòng)圖形界面

runlevel 介紹

Init 配置文件(/etc/inittab)最重要的就是這個(gè)運(yùn)行時(shí)啟動(dòng)級(jí)別,對(duì)于 XWindow 來(lái)說(shuō)將 run level 分為7個(gè)等級(jí),每個(gè)等級(jí)只是所啟動(dòng)的服務(wù)不盡相同 0- halt:系統(tǒng)直接關(guān)機(jī)
1- single user mode:單用戶模式
2- multi user without NFS
3- full multi user mode: 命令行模式
4- unused
5- X11:圖形模式
6- rboot:重啟模式

舉例:

[root@bogon ~]# runlevel =>查看當(dāng)前運(yùn)行等級(jí)
N 5
[root@bogon ~]# init 3 =>執(zhí)行runlevel 3

http://wiki.jikexueyuan.com/project/learn-linux-step-by-step/images/6.bmp" alt="" />

runlevel 程序與服務(wù)

/etc/rc.d/下包含不同等級(jí)的 run level 的啟動(dòng)內(nèi)容,前面提到過(guò)不同的 run level 差別在于啟動(dòng)的服務(wù)不同

[root@bogon ~]# ll /etc/rc.d/rc5.d/
lrwxrwxrwx 1 root root 17 02-18 20:06 K01dnsmasq -> ../init.d/dnsmasq
lrwxrwxrwx 1 root root 19 02-18 20:14 K01rgmanager -> ../init.d/rgmanager
…..
lrwxrwxrwx 1 root root 16 02-18 20:07 S56xinetd -> ../init.d/xinetd
lrwxrwxrwx 1 root root 18 02-18 20:06 S80sendmail -> ../init.d/sendmail
…….
lrwxrwxrwx 1 root root 11 02-18 20:05 S99local -> ../rc.local
lrwxrwxrwx 1 root root 21 02-18 20:12 S99modclusterd -> ../init.d/modclusterd

上面可以看到的 runlevel 5下面啟動(dòng)的服務(wù)
K【數(shù)字】:K 代表停止。后面的數(shù)字代表的停止的順序
S【數(shù)字】:S 代表開啟。后面的數(shù)字代表的開啟的順序
在服務(wù)里面提到過(guò)為解決服務(wù)的依賴性因此需要制定服務(wù)啟動(dòng)停止的順序

用戶自定義開機(jī)啟動(dòng)程序(rc.local)

從上面服務(wù) runlevel5啟動(dòng)內(nèi)容中有一項(xiàng)是
lrwxrwxrwx 1 root root 11 02-18 20:05S99local -> ../rc.local
這個(gè) script 可以添加自定義的命令,從整個(gè)啟動(dòng)流程來(lái)看,它處于用戶登錄之前進(jìn)行的

#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

touch /var/lock/subsys/local

用戶執(zhí)行自定義命令位置點(diǎn)對(duì)比

~/.bash_profile 文件
文件加載時(shí)機(jī):用戶登錄完畢 。 特點(diǎn):只針對(duì)單一登錄用戶的個(gè)人設(shè)置

~./bash_loyout:
文件加載時(shí)機(jī):用戶注銷時(shí)。
特點(diǎn):只針對(duì)單一登錄用戶的個(gè)人設(shè)置

/etc/rc.local
文件加載時(shí)機(jī):init 啟動(dòng)流程。在用戶為登錄之前
特點(diǎn):不區(qū)分用戶的命令

/etc/init.d/
文件加載時(shí)機(jī):以服務(wù)的形式加載
特點(diǎn):可以針對(duì)不同的 runlevel 設(shè)置是否開啟服務(wù)

(此處無(wú)時(shí)機(jī)項(xiàng)目經(jīng)驗(yàn),只是簡(jiǎn)單對(duì)比,對(duì)于安全性方面無(wú)考慮)

虛擬文件系統(tǒng)(initrd)

前面提到了 initrd 的作用,現(xiàn)在查看下這個(gè)里面究竟包含什么

[root@localhost tmp]# mkdir /tmp/initrd
[root@localhost tmp]# cp /boot/initrd-2.6.18-371.el5.img /tmp/initrd/
[root@localhost tmp]# ll ./initrd/
-rw------- 1 root root 2748313 03-31 09:59 initrd-2.6.18-371.el5.img
[root@localhost tmp]# mv ./initrd/initrd-2.6.18-371.el5.img ./initrd/initrd-2.6.18-371.el5.gz
[root@localhost tmp]# ll ./initrd/
-rw------- 1 root root 2748313 03-31 09:59 initrd-2.6.18-371.el5.gz
[root@localhost tmp]# cd initrd/
[root@localhost initrd]# gzip -d ./initrd-2.6.18-371.el5.gz 
[root@localhost initrd]# ll

-rw------- 1 root root 6332928 03-31 09:59 initrd-2.6.18-371.el5
[root@localhost initrd]# file initrd-2.6.18-371.el5 
initrd-2.6.18-371.el5: ASCII cpio archive (SVR4 with no CRC)
[root@localhost initrd]# cpio -ivcdu <./initrd-2.6.18-371.el5 
…….
[root@localhost initrd]# ll
drwx------ 2 root root    4096 03-31 10:03 bin
drwx------ 3 root root    4096 03-31 10:03 dev
drwx------ 2 root root    4096 03-31 10:03 etc
-rwx------ 1 root root    2708 03-31 10:03 init
drwx------ 3 root root    4096 03-31 10:03 lib
drwx------ 2 root root    4096 03-31 10:03 proc
lrwxrwxrwx 1 root root       3 03-31 10:03 sbin -> bin
drwx------ 2 root root    4096 03-31 10:03 sys
drwx------ 2 root root    4096 03-31 10:03 sysroot
=>和根目錄結(jié)構(gòu)很像

 [root@localhost initrd]# cd ./lib/;ll
-rw------- 1 root root  31664 03-31 10:03 ata_piix.ko
-rw------- 1 root root  18060 03-31 10:03 dm-log.ko
……….
=>這里包含里就是啟動(dòng)時(shí)必需的內(nèi)核模塊

創(chuàng)建 initrd

正常安裝 unix like 版本是 initrd 是不需要額外創(chuàng)建的,但是有時(shí)候我們可能需要將一些其他的內(nèi)核模塊加到 initrd 中,此時(shí)就需要?jiǎng)?chuàng)建一個(gè)新的initrd

語(yǔ)法:mkinitrd [-v] [--with=模塊名稱] initrd 文件名內(nèi)核版本