一直使用linux系統(tǒng),卻對(duì)系統(tǒng)啟動(dòng)過(guò)程及系統(tǒng)初始化和各種服務(wù)的啟動(dòng)不太清楚。今天終于搞明白整個(gè)是怎么一回事了。本來(lái)想自己寫(xiě)篇文章,剛好在網(wǎng)上看到一篇不錯(cuò)的介紹,很詳細(xì),就直接拿來(lái)了。
Linux系統(tǒng)的啟動(dòng)過(guò)程:
BIOS自檢 —> grub引導(dǎo)程序 —> 加載內(nèi)核 —> 執(zhí)行init —> 啟動(dòng)shell —> login登陸系統(tǒng)
系統(tǒng)啟動(dòng)各個(gè)階段的詳細(xì)介紹:
一.BIOS自檢
計(jì)算機(jī)在接通電源之后首先由BIOS進(jìn)行POST自檢,然后依據(jù)BIOS內(nèi)設(shè)置的引導(dǎo)順序從硬盤(pán)、軟盤(pán)或CDROM中讀入引導(dǎo)塊。Linux系統(tǒng)是人BIOS中的地址oxFFFF0處開(kāi)始引導(dǎo)的。BIOS的第1個(gè)步驟是加電POST自檢。POST的工作是對(duì)硬件進(jìn)行檢測(cè)。BIOS的第2個(gè)步驟是進(jìn)行本地設(shè)備的枚舉和初始化。BIOS由兩部分組成:POST代碼和運(yùn)行時(shí)的服務(wù)。當(dāng)POST完成之后,它被從內(nèi)存中清理出來(lái),但是BIOS運(yùn)行時(shí)服務(wù)依然保留在內(nèi)存中,目標(biāo)操作系統(tǒng)可以使用這些服務(wù)。
BIOS運(yùn)行時(shí)會(huì)按照CMOS的設(shè)置定義的順序來(lái)搜索處于活動(dòng)狀態(tài)并且可以引導(dǎo)的設(shè)備。引導(dǎo)設(shè)備可以是軟盤(pán)、CD-ROM、硬盤(pán)上的某個(gè)分區(qū)、網(wǎng)絡(luò)上的某個(gè)設(shè)備甚至是USB閃存。通常,Linux系統(tǒng)都是從硬盤(pán)上引導(dǎo)的,其中主引導(dǎo)記錄(MBR)中包含主引導(dǎo)加載程序。MBR是一個(gè)512字節(jié)大小的扇區(qū),位于磁盤(pán)上的第一個(gè)扇區(qū)(0道0柱面1扇區(qū))。當(dāng)MBR被加載到RAM中之后,BIOS就會(huì)將控制權(quán)交給MBR。
如果要查看MBR的內(nèi)容,用戶需要以root用戶的身份運(yùn)行如下命令:
#dd if=http://www.3lian.com/dev/had of=mbr.bin bs=512 count=1
讀入了1+0個(gè)塊
輸出了1+0個(gè)塊
#od –xa mbr.bin
… …
它從/dev/had(第一個(gè)IDE盤(pán))上讀取前512個(gè)字節(jié)的內(nèi)容,并將其寫(xiě)入mbr.bin文件中。od命令會(huì)以十六進(jìn)制和ASCII碼格式打印這個(gè)二進(jìn)制文件的內(nèi)容。
二.啟動(dòng)GRUB/LILO
GRUB和LILO都是引導(dǎo)加載程序。引導(dǎo)加載程序用于引導(dǎo)操作系統(tǒng)啟動(dòng)。當(dāng)機(jī)器引導(dǎo)它的操作系統(tǒng)時(shí),BIOS會(huì)讀取引導(dǎo)介質(zhì)上最前面的512字節(jié)(主引導(dǎo)記錄)。在單一的MBR中只能存儲(chǔ)一個(gè)操作系統(tǒng)的引導(dǎo)記錄,所以當(dāng)需要多個(gè)操作系統(tǒng)時(shí)就會(huì)出現(xiàn)問(wèn)題,需要更靈活的引導(dǎo)加載程序。
所有引導(dǎo)加載程序都以類似的方式工作,滿足共同的目的,但LILO和GRUB之間也有很多不同之處:
LILO沒(méi)有交互式命令界面,而GRUB擁有;
LILO不支持網(wǎng)絡(luò)引導(dǎo),而GRUB支持;
LILO將可以引導(dǎo)操作系統(tǒng)的信息存儲(chǔ)在MBR中。
如果修改了LILO配置文件,必須將LILO第一階段引導(dǎo)加載程序重寫(xiě)到MBR。相對(duì)于GRUB,這是一個(gè)更為危險(xiǎn)的選擇,因?yàn)殄e(cuò)誤配置的MBR可能會(huì)讓系統(tǒng)無(wú)法引導(dǎo)。使用GRUB時(shí),如果配置文件配置錯(cuò)誤,則只是默認(rèn)轉(zhuǎn)到GRUB命令行界面。
三.加載內(nèi)核
接下來(lái)的步驟就是加載內(nèi)核映像到內(nèi)存中,內(nèi)核映像并不是一個(gè)可執(zhí)行的內(nèi)核,而是一個(gè)壓縮過(guò)的內(nèi)核映像。通常它是一個(gè)zImage(壓縮映像,小于512KB)或是一個(gè)bzImage(較大的壓縮映像,大于512KB),它是提前使用zlib壓縮過(guò)的。在這個(gè)內(nèi)核映像前面是一個(gè)例程,它實(shí)現(xiàn)少量硬件設(shè)置,并對(duì)內(nèi)核映像中包含的內(nèi)核進(jìn)行解壓縮,然后將其放入高端內(nèi)存中。如果有初始RAM磁盤(pán)映像,系統(tǒng)就會(huì)將它移動(dòng)到內(nèi)存中,并標(biāo)明以后使用。然后該例程會(huì)調(diào)用內(nèi)核,并開(kāi)始啟動(dòng)內(nèi)核引導(dǎo)的過(guò)程。
四.執(zhí)行init進(jìn)程
init進(jìn)程是系統(tǒng)所有進(jìn)程的起點(diǎn),內(nèi)核在完成核內(nèi)引導(dǎo)以后,即在本進(jìn)程空間內(nèi)加載init程序,它的進(jìn)程呈是1。Init進(jìn)程是所有進(jìn)程的發(fā)起者和控制者。因?yàn)樵谌魏位贚inux的系統(tǒng)中,它都是第一個(gè)運(yùn)行的進(jìn)程,所以init進(jìn)程的編號(hào)(PID)永遠(yuǎn)是1。
init進(jìn)程有以下兩個(gè)作用。
init進(jìn)程的第一個(gè)作用是扮演終結(jié)父進(jìn)程的角色。因?yàn)閕nit進(jìn)程永遠(yuǎn)不會(huì)被終止,所以系統(tǒng)總是可以確信它的存在,并在必要的時(shí)候以它為參照。如果某個(gè)進(jìn)程在它衍生出來(lái)的全部子進(jìn)程結(jié)束之前被終止,就會(huì)出現(xiàn)必須以init為參照的情況。此時(shí)那些失去了父進(jìn)程的子進(jìn)程就都會(huì)以init作為它們的父進(jìn)程。
init的第二個(gè)作用是在進(jìn)入某個(gè)特定的運(yùn)行級(jí)別時(shí)運(yùn)行相應(yīng)的程序,以此對(duì)各種運(yùn)行級(jí)別進(jìn)行管理。它的這個(gè)作用是由/etc/inittab文件定義的。
五.通過(guò)/etc/inittab文件進(jìn)行初始化
Init的工作是根據(jù)/etc/inittab來(lái)執(zhí)行相應(yīng)的腳本,進(jìn)行系統(tǒng)初始化,如設(shè)置鍵盤(pán)、字體、裝載模塊,設(shè)置網(wǎng)絡(luò)等。
1./etc/rc.d/rc.sysinit
在init的配置文件中有如下一行:
si::sysinit:/etc/rc.d/rc.sysinit