BIOS自檢
計(jì)算機(jī)在接通電源之后首先由BIOS進(jìn)行自檢,即進(jìn)行所謂的POST(Power On Self
Test),然后依據(jù)BIOS內(nèi)設(shè)置的引導(dǎo)順序從硬盤、軟盤或CDROM中讀入“引導(dǎo)塊”。 在 PC 中,引導(dǎo) Linux 是從 BIOS中的地址 0xFFFF0 處開(kāi)始的。BIOS 的第一個(gè)步驟是加電自檢(POST)。POST 的工作是對(duì)硬件進(jìn)行檢測(cè)。BIOS的第二個(gè)步驟是進(jìn)行本地設(shè)備的枚舉和初始化。給定 BIOS 功能的不同用法之后,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ù)。
要引導(dǎo)一個(gè)操作系統(tǒng),BIOS 運(yùn)行時(shí)會(huì)按照 CMOS的設(shè)置定義的順序來(lái)搜索處于活動(dòng)狀態(tài)并且可以引導(dǎo)的設(shè)備。引導(dǎo)設(shè)備可以是軟盤、CD-ROM、硬盤上的某個(gè)分區(qū)、網(wǎng)絡(luò)上的某個(gè)設(shè)備,甚至是 USB閃存。通常,Linux 都是從硬盤上引導(dǎo)的,其中主引導(dǎo)記錄(MBR)中包含主引導(dǎo)加載程序。MBR 是一個(gè) 512字節(jié)大小的扇區(qū),位于磁盤上的第一個(gè)扇區(qū)中(0 道 0 柱面 1 扇區(qū))。當(dāng) MBR 被加載到 RAM 中之后,BIOS 就會(huì)將控制權(quán)交給MBR。
提取 MBR 的信息
要查看 MBR 的內(nèi)容,請(qǐng)使用下面的命令:
# dd if=/dev/hda of=mbr.bin bs=512 count=1 # od -xa mbr.bin
這個(gè) dd 命令需要以 root 用戶的身份運(yùn)行,它從 /dev/hda(第一個(gè) IDE 盤) 上讀取前 512 個(gè)字節(jié)的內(nèi)容,并將其寫入 mbr.bin 文件中。od 命令會(huì)以十六進(jìn)制和 ASCII 碼格式打印這個(gè)二進(jìn)制文件的內(nèi)容。
(2)啟動(dòng)GRUB/LILO
GRUB和LILO都是引導(dǎo)加載程序。最簡(jiǎn)單地講,引導(dǎo)加載程序(boot loader) 會(huì)引導(dǎo)操作系統(tǒng)。當(dāng)機(jī)器引導(dǎo)它的操作系統(tǒng)時(shí),BIOS 會(huì)讀取引導(dǎo)介質(zhì)上最前面的 512字節(jié)(即人們所知的 主引導(dǎo)記錄(master boot record,MBR))。在單一的 MBR中只能存儲(chǔ)一個(gè)操作系統(tǒng)的引導(dǎo)記錄,所以當(dāng)需要多個(gè)操作系統(tǒng)時(shí)就會(huì)出現(xiàn)問(wèn)題。所以需要更靈活的引導(dǎo)加載程序。
GRUB 與 LILO 的比較
如本文開(kāi)始處所述,所有引導(dǎo)加載程序都以類似的方式工作,滿足共同的目的。不過(guò),LILO 和 GRUB 之間有很多不同之處:
安全提示:
關(guān)于安全性,任何可以接觸到引導(dǎo)磁盤/CD 的人,只需要使用沒(méi)有設(shè)置安全性的 grub.conf 或lilo.conf,就可以繞過(guò)本文中提及的所有安全措施。特別是使用 GRUB時(shí),因?yàn)槟軌蛞龑?dǎo)到單用戶模式,所以是一個(gè)嚴(yán)重的安全漏洞。解決此問(wèn)題的一個(gè)簡(jiǎn)單方法是在機(jī)器的 BIOS 中禁止通過(guò) CD和軟盤進(jìn)行引導(dǎo),并確保為 BIOS 設(shè)置了一個(gè)口令,使得其他人不能修改這些設(shè)置。
(3)加載內(nèi)核
當(dāng)內(nèi)核映像被加載到內(nèi)存之后,內(nèi)核階段就開(kāi)始了。內(nèi)核映像并不是一個(gè)可執(zhí)行的內(nèi)核,而是一個(gè)壓縮過(guò)的內(nèi)核映像。通常它是一個(gè) zImage(壓縮映像,小于 512KB)或一個(gè)bzImage(較大的壓縮映像,大于 512KB),它是提前使用 zlib進(jìn)行壓縮過(guò)的。在這個(gè)內(nèi)核映像前面是一個(gè)例程,它實(shí)現(xiàn)少量硬件設(shè)置,并對(duì)內(nèi)核映像中包含的內(nèi)核進(jìn)行解壓,然后將其放入高端內(nèi)存中,如果有初始 RAM磁盤映像,就會(huì)將它移動(dòng)到內(nèi)存中,并標(biāo)明以后使用。然后該例程會(huì)調(diào)用內(nèi)核,并開(kāi)始啟動(dòng)內(nèi)核引導(dǎo)的過(guò)程。
GRUB 中的手工引導(dǎo)
在 GRUB 命令行中,我們可以使用 initrd 映像引導(dǎo)一個(gè)特定的內(nèi)核,方法如下:
grub> kernel /bzImage-2.6.14.2
[Linux-bzImage, setup=0x1400, size=0x29672e]
grub> initrd /initrd-2.6.14.2.img
[Linux-initrd @ 0x5f13000, 0xcc199 bytes]
grub> boot
Uncompressing Linux... Ok, booting the kernel.
如果您不知道要引導(dǎo)的內(nèi)核的名稱,只需使用斜線(/)然后按下 Tab 鍵即可。GRUB 會(huì)顯示內(nèi)核和 initrd 映像列表。
(4)執(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)程號(hào)是1。init進(jìn)程是所有進(jìn)程的發(fā)起者和控制者。因?yàn)樵谌魏位赨nix的系統(tǒng)(比如Linux)中,它都是第一個(gè)運(yùn)行的進(jìn)程,所以init進(jìn)程的編號(hào)(ProcessID,PID)永遠(yuǎn)是1。如果init出現(xiàn)了問(wèn)題,系統(tǒng)的其余部分也就隨之而垮掉了。
init進(jìn)程有兩個(gè)作用。第一個(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)程。快速執(zhí)行一下ps -af 命令,可以列出許多父進(jìn)程ID(Parent Process ID,PPID)為1的進(jìn)程來(lái)。
init的第二個(gè)角色是在進(jìn)入某個(gè)特定的運(yùn)行級(jí)別(Runlevel)時(shí)運(yùn)行相應(yīng)的程序,以此對(duì)各種運(yùn)行級(jí)別進(jìn)行管理。它的這個(gè)作用是由/etc/inittab文件定義的。
(5)通過(guò)/etc/inittab文件進(jìn)行初始化
init的工作是根據(jù)/etc/inittab來(lái)執(zhí)行相應(yīng)的腳本進(jìn)行系統(tǒng)初始化,如設(shè)置鍵盤、字體, 裝載模塊,設(shè)置網(wǎng)絡(luò),等等。
對(duì)于RedhatLinux來(lái)說(shuō),執(zhí)行的順序?yàn)椋?/p>
最后筆者使用圖1解釋全部過(guò)程。
圖1 Linux啟動(dòng)流程 |
總結(jié):與 Linux 本身非常類似,Linux 的啟動(dòng)引導(dǎo)過(guò)程也非常靈活,可以支持眾多的處理器和硬件平臺(tái)。LILO 引導(dǎo)加載程序?qū)σ龑?dǎo)能力進(jìn)行了擴(kuò)充,但是它卻缺少文件系統(tǒng)的感知能力。最新一代的引導(dǎo)加載程序,例如 GRUB將更加靈活。
聯(lián)系客服