《一》:詳解Linux啟動流程及需要使用到的配置文件
POST加電自檢-->BIOS(Boot Sequence)->MBR(bootloader)->Kernel->initrd->rootfs(/sbin/init)
下面對每個啟動流程做詳細(xì)解釋:
POST(加電自檢)
計算機本身不執(zhí)行任何程序,所以系統(tǒng)必須要完成自舉的過程,在CPU的控制下,將RAM芯片中的某個程序映射到ROM地址空間,并執(zhí)其中的指令完成系統(tǒng)硬件健康狀況檢查,例如存儲設(shè)備、網(wǎng)卡、CPU、聲卡等其他硬件設(shè)備是否完好。當(dāng)檢查完成后,所有硬件或基本硬件、核心硬件沒有問題,則下一個啟動流程->BIOS
BIOS(Boot Sequence)
按照BIOS所設(shè)定的系統(tǒng)啟動流程,根據(jù)引導(dǎo)次序(Boot Sequence)自上而下的尋找對應(yīng)存儲設(shè)備上操作系統(tǒng)的MBR,如果MBR存在,則會讀取MBR中的bootloader
MBR(bootloader)
會根據(jù)MBR所指引的活動分區(qū)上尋找系統(tǒng)分區(qū)中的 bootloader,bootloader稱為是一段程序,占據(jù)446字節(jié)。在bootloader當(dāng)中配置了所要引導(dǎo)操作系統(tǒng)的內(nèi)核所在的位置,因此BIOS被載入內(nèi)存以后,當(dāng)它實現(xiàn)將控制權(quán)限轉(zhuǎn)交給bootloader以后,bootloader接收整個系統(tǒng)的控制權(quán)限,而后根據(jù)用戶的選擇去讀取相應(yīng)操作系統(tǒng)中的內(nèi)核,并將內(nèi)核裝載入內(nèi)存的某個空間位置,解壓縮,這時kernel就可以在內(nèi)存中活動,并根據(jù)kernel本身功能在內(nèi)存當(dāng)中探索硬件并加載硬件驅(qū)動程序并完成內(nèi)核初始化,bootloader會將控制權(quán)限轉(zhuǎn)交給內(nèi)核。
Kernel(初始化)
我們知道kernel是完成探索硬件及加載硬件驅(qū)動程序,并以讀寫的方式掛載根文件系統(tǒng)。那么這里就出現(xiàn)一個比較詭異的問題,是什么問題呢?
我們又知道,要想訪問真正的根文件系統(tǒng)(rootfs)的話,就必須加載根文件系統(tǒng)中的設(shè)備,這時根文件系統(tǒng)又沒有掛載,要掛載根文件系統(tǒng)又得加載根文件系統(tǒng)中的驅(qū)動程序,哪怎么辦呢?這是就用到了initrd文件了。
在來說下kernel初始化所要工作的內(nèi)容做下簡單總結(jié):
探測硬件->加載驅(qū)動(initrd)->掛載根文件系統(tǒng)->rootfs(/sbin/init)
initrd功能介紹
其實說白了initrd就是一個虛擬的文件系統(tǒng),里面有/、lib、bin、sbin、usr、proc、sys、var、dev、boot等一些目錄,其實你會發(fā)現(xiàn)里面的目錄有點像真的/對吧,所以我們稱之為虛擬的根文件系統(tǒng),作用就是將kernel和真的根文件系統(tǒng)建立關(guān)聯(lián)關(guān)系,讓kernel去initrd中加載根文件系統(tǒng)所需要的驅(qū)動程序,并以讀寫的方式掛載根文件系統(tǒng),并讓執(zhí)行用戶當(dāng)中第一個進程init。
/sbin/init(/etc/inittab)
/sbin/init啟動會用到/etc/inittab所定義的條目,如:默認(rèn)登陸級別id:3:initdefault:(這里就是默認(rèn)啟動3級別)
下面就來說下/etc/inittab所工作那些內(nèi)容:
/etc/inittab
默認(rèn)運行級別
0:halt
1: single user mode(單用戶維護模式)
2:multi user mode, without NFS(不支持NFS功能)
3: multi user mode, text mode(字符界面)
4:reserved (系統(tǒng)保留)
5: multi user mode, graphic mode (圖形化界面)
6: reboot (重啟)
系統(tǒng)初始化(/etc/rc.d/rc.sysinit)
檢測,并以讀寫方式掛載根文件系統(tǒng)
設(shè)定主機名
檢測并掛載/etc/fstab中其它文件系統(tǒng)
啟動swap分區(qū)
初始化外圍硬件設(shè)備驅(qū)動
根據(jù)/etc/sysctl.conf設(shè)定內(nèi)核參數(shù)
激活udev和selinux
激活LVM和RAID設(shè)備
清理過期鎖文件和PID文件
裝載鍵映射-->鍵盤上每個鍵的功能
運行指定級別的服務(wù)腳本
/etc/rc.d/init.d/
/etc/rc.d/rc#.d
rc0-rc6
K* ##只要是以K開頭的文件均執(zhí)行stop工作
S* ##只要是以S開頭的文件均執(zhí)行start工作
0-99 (執(zhí)行次序,數(shù)字越小越先被執(zhí)行)
init執(zhí)行/etc/rc.d/rc.local
init執(zhí)行中斷機模擬程序mingetty來啟動login進程,最后等待用戶登錄
下面在來說下/etc/inittab的語法及格式:
/etc/inittab格式及語法(:)
[設(shè)置選項]:[runlevel]:[init操作行為]:[命令選項]
設(shè)置選項:
代表init主要工作選項
運行級別
0-6
init操作行為:
initdefault:代表默認(rèn)運行級別
sysinit:代表系統(tǒng)初始化操作選項
ctrlaltdel:代表重啟的相關(guān)設(shè)置
wait:代表上一個命令執(zhí)行結(jié)束后方可執(zhí)行下面的操作
respawn:代表后面字段可以無限制再生(reboot)
命令選項
一些命令,不過通常都是腳本
init處理流程:
根據(jù)/etc/inittab設(shè)置進行處理:以默認(rèn)級別3說明:id:3:initdefault:
default runlevel->/etc/rc.d/rc.sysinit->/etc/rc.d/rc5.d->ctrlatdel->set "pf" and "pr"->mingetty->login
init處理系統(tǒng)初始化流程/etc/rc.d/rc.sysinit(設(shè)置系統(tǒng)環(huán)境)
取得網(wǎng)絡(luò)環(huán)境與主機類型->/etc/sysconfig/network
測試與掛載內(nèi)存設(shè)備/proc及/sys
SElinux
啟動系統(tǒng)的隨機數(shù)生成器
設(shè)置終端機字體
設(shè)置系統(tǒng)啟動過程中的歡迎界面
設(shè)置系統(tǒng)時間與時區(qū)設(shè)置/etc/sysconfig/clock
接口設(shè)備檢測
用戶自定義模塊加載->/etc/sysconfig/modules/*.modules
根據(jù)/etc/sysctl.conf設(shè)置內(nèi)核參數(shù)
初始化軟件磁盤陣列->/etc/mdadm.conf
初始化LVM文件系統(tǒng)功能
fsck檢測磁盤文件系統(tǒng)
磁盤配額
檢測,并以讀寫方式重新掛載根文件系統(tǒng)
清除清除過程當(dāng)中的臨時文件
將啟動的相關(guān)信息->/var/log/dmesg
啟動服務(wù)與相關(guān)啟動配置文件(/etc/rc.d/rc # &/etc/sysconfig )
以默認(rèn)級別3說明:id:3:initdefault:
l3:3:wait:/etc/rc.d/rc 3
找到/etc/rc.d/rc3.d
以K*開頭的文件,并運行/etc/rc.d/rc3.d/K* stop
以S*開頭的文件,并運行/etc/rc.d/rc3.d/S* start
/etc/rc.d/rc#.d/里面的文件鏈接的都是/etc/rc.d/init.d的文件
用戶自定義開機啟動程序(/etc/rc.d/rc.local)
可以根據(jù)自己的需求將一些執(zhí)行命令或是腳本寫到/etc/rc.d/rc.local里,當(dāng)開機時,就可以加載啦
根據(jù)mingetty程序調(diào)用login讓用戶登錄->用戶登錄(完成系統(tǒng)啟動)
|