在學(xué)習(xí)Linux內(nèi)核之前锦援,了解一些Linux的開機(jī)啟動(dòng)流程會(huì)對(duì)學(xué)習(xí)內(nèi)核有一定的幫助允粤。
第一步:BIOS
當(dāng)我們按下電源時(shí)朗和,計(jì)算機(jī)會(huì)自動(dòng)讀取主板中的“只讀內(nèi)存”(ROM)中的BIOS開機(jī)程序犯眠,BIOS中的程序開始進(jìn)行開機(jī)前的自檢(POST)行為,檢測(cè)各硬件是否具有開機(jī)的條件。
第二步:MBR
當(dāng)BIOS完成自檢后始鱼,若計(jì)算機(jī)的硬件具有開機(jī)啟動(dòng)的條件仔掸,那么,此刻BIOS會(huì)從自身的boot sequence(引導(dǎo)順序)中查找用于啟動(dòng)的設(shè)備医清。
如上圖所示起暮,BIOS會(huì)先從排在第一位的嘗試著啟動(dòng)系統(tǒng),若在此中找到了MBR的bootloader程序状勤,則直接根據(jù)boot loader去引導(dǎo)相應(yīng)的操作系統(tǒng)鞋怀,并且交出計(jì)算機(jī)的控制權(quán)双泪,若boot loader引導(dǎo)失敗持搜,則MBR不會(huì)訪問第二個(gè)用于啟動(dòng)的設(shè)備,標(biāo)志此次開機(jī)失敗焙矛。
對(duì)于硬盤設(shè)備的MBR:
446 byte :boot loader葫盼,引導(dǎo)程序
64 byte :分區(qū)表
2 byte :0x55 和0xAA
后2byte若不是0x55 和0xAA ,則表明此設(shè)備無(wú)法用于系統(tǒng)啟動(dòng)村斟,則BIOS按照boot sequence的順序?qū)ふ蚁乱粋€(gè)可用于啟動(dòng)的設(shè)備
第三步:boot loader
功能:boot loader是一段程序贫导。它的作用是尋找設(shè)備分區(qū)中的系統(tǒng)內(nèi)核,并將系統(tǒng)內(nèi)核加載到內(nèi)存中蟆盹,進(jìn)行加壓孩灯、展開,并將控制權(quán)交給內(nèi)核逾滥。
在linux系統(tǒng)中峰档,常用的boot loader是grub,當(dāng)設(shè)備上裝載多個(gè)系統(tǒng)時(shí)寨昙,grub能夠提供菜單讥巡,供用戶選擇加載某個(gè)特定的系統(tǒng)內(nèi)核。更多關(guān)于grub的知識(shí)舔哪,我后面會(huì)總結(jié)欢顷。
注:
在CentOS 6中,內(nèi)核的核心文件放在/boot的目錄下捉蚤。通常情況下抬驴,系統(tǒng)會(huì)將根文件系統(tǒng)掛載到LVM中,利于文件系統(tǒng)的擴(kuò)展缆巧,而/boot目錄掛載在普通格式的分區(qū)中布持。
原因:
grub中只有一些普通文件系統(tǒng)格式的驅(qū)動(dòng),并沒有LVM的驅(qū)動(dòng)盅蝗。放在普通的分區(qū)中鳖链,grub能夠讀取內(nèi)核的核心文件加載到內(nèi)存中。
問題出現(xiàn):
內(nèi)核除了位于/boot目錄下的核心文件,還有位于/lib/modules目錄中的模塊文件芙委。當(dāng)內(nèi)核需要掛載位于LVM中的根文件系統(tǒng)時(shí)逞敷,因?yàn)闆]有驅(qū)動(dòng),無(wú)法掛載根文件系統(tǒng)灌侣。而LVM的驅(qū)動(dòng)在根文件系統(tǒng)的/lib/modules目錄下推捐,這樣就出現(xiàn)了要掛載根文件系統(tǒng)就必須加載驅(qū)動(dòng),但是驅(qū)動(dòng)在文件系統(tǒng)中這樣的雞生蛋侧啼,蛋生雞的矛盾問題牛柒。
第四步:kernel
上一步加載完普通分區(qū)中的內(nèi)核核心文件到內(nèi)存中運(yùn)行時(shí),內(nèi)核會(huì)進(jìn)行以下操作痊乾。
(1)皮壁、自身初始化
(2)、探測(cè)可識(shí)別到的硬件設(shè)備
(3)哪审、加載硬件驅(qū)動(dòng)程序(此處可能會(huì)借`動(dòng)程序)
(4)蛾魄、以只讀式掛載根文件系統(tǒng),加載后運(yùn)行/sbin/init
在加載硬件的驅(qū)動(dòng)程序這一過程中遇到了麻煩湿滓,為了保證linux內(nèi)核容量的大小滴须,所以內(nèi)核中并沒有編譯進(jìn)一些設(shè)備的驅(qū)動(dòng)。那么此時(shí)叽奥,內(nèi)核該如何加載那些驅(qū)動(dòng)扔水,并且訪問相應(yīng)的設(shè)備呢?
解決辦法:
為了解決上一個(gè)步驟遺留下來的問題朝氓,在CentOS 6中魔市,我們引入了initramfs。initramfs文件存放到/boot目錄下膀篮,當(dāng)grub加載內(nèi)核的核心文件時(shí)嘹狞,initramfs可以設(shè)置被一并加載。initramfs會(huì)成為一個(gè)虛擬文件系統(tǒng)誓竿,為內(nèi)核訪問其他設(shè)備提供了所需要的驅(qū)動(dòng)程序磅网。
例如訪問根文件系統(tǒng)的驅(qū)動(dòng),這是內(nèi)核就可以對(duì)根文件系統(tǒng)操作了筷屡。
第五步:init
在內(nèi)核從initramfs中獲得根文件系統(tǒng)的驅(qū)動(dòng)后涧偷,會(huì)以只讀的方式掛載根文件系統(tǒng),接著啟動(dòng)第一個(gè)運(yùn)行程序/sbin/init程序毙死。程序啟動(dòng)后燎潮,會(huì)讀取/etc/inittab和/etc/init/*.conf文件進(jìn)行基本的設(shè)置。
根據(jù)/etc/inittab文件進(jìn)行系統(tǒng)運(yùn)行級(jí)別的設(shè)置扼倘。此處列出系統(tǒng)的運(yùn)行級(jí)別
0-6 : 7個(gè)級(jí)別
0:關(guān)機(jī)
1:單用戶模式(root ,無(wú)需登錄)确封,single 除呵,維護(hù)模式
2:多用戶模式,會(huì)啟動(dòng)網(wǎng)絡(luò)功能爪喘,不會(huì)啟動(dòng)網(wǎng)絡(luò)文件系統(tǒng)颜曾,維護(hù)模式
3.多用戶模式,正常模式秉剑,默認(rèn)為文本界面
4.預(yù)留級(jí)別
5.多用戶模式泛豪,正常模式,圖形界面
6.重啟系統(tǒng)
第六步:?jiǎn)?dòng)服務(wù)
當(dāng)?shù)谖宀皆O(shè)定好運(yùn)行級(jí)別后侦鹏,相應(yīng)級(jí)別目錄中(/etc/rc.d/rc#.d/)的鏈接文件被讀取诡曙。
鏈接文件名的含義:
1、S略水、K分別代表start和kill
2价卤、數(shù)字代表開啟或結(jié)束的順序。一般先開啟的會(huì)后結(jié)束聚请,因?yàn)榭赡鼙黄渌?wù)所依賴荠雕。
各個(gè)運(yùn)行級(jí)別的鏈接文件連接到/etc/init.d/下的每一個(gè)服務(wù)運(yùn)行腳本。
第七步:?jiǎn)?dòng)終端驶赏,登錄系統(tǒng)
在各服務(wù)均啟動(dòng)后,系統(tǒng)會(huì)讀取/etc/rc.d/rc.local文本文件既鞠,進(jìn)行登錄前的最后設(shè)定煤傍。所以當(dāng)有不便或不需寫為服務(wù)腳本放置于/etc/rc.d/init.d/目錄,且又想開機(jī)時(shí)自動(dòng)運(yùn)行的命令嘱蛋,可直接放置于/etc/rc.d/rc.local文件中蚯姆。最后,/bin/login啟動(dòng)洒敏,出現(xiàn)登錄界面龄恋。