- BIOS自檢
- 啓動GRUB/LILO
- 加載內核
- 執行init進程
- 通過/etc/inittab文件進行初始化
BIOS自檢
計算機在接通電源之後首先由BIOS進行自檢,即進行所謂的POST(Power On SelfTest),然後依據BIOS內設置的引導順序從硬盤、軟盤或CDROM中讀入“引導塊”。 在 PC 中,引導 Linux 是從 BIOS 中的地址 0xFFFF0 處開始的。BIOS 的第一個步驟是加電自檢(POST)。POST 的工作是對硬件進行檢測。BIOS 的第二個步驟是進行本地設備的枚舉和初始化。給定 BIOS
功能的不同用法之後,BIOS 由兩部分組成:POST 代碼和運行時服務。當 POST 完成之後,它被從內存中清理了出來,但是 BIOS 運行時服務依然保留在內存中,目標操作系統可以使用這些服務。
要引導一個操作系統,BIOS 運行時會按照 CMOS 的設置定義的順序來搜索處於活動狀態並且可以引導的設備。引導設備可以是軟盤、CD-ROM、硬盤上的某個分區、網絡上的某個設備,甚至是 USB 閃存。通常,Linux 都是從硬盤上引導的,其中主引導記錄(MBR)中包含主引導加載程序。MBR 是一個 512 字節大小的扇區,位於磁盤上的第一個扇區中(0 道 0 柱面 1 扇區)。當 MBR 被加載到 RAM
中之後,BIOS 就會將控制權交給 MBR。
提取 MBR 的信息
要查看 MBR 的內容,請使用下面的命令:
# dd if=/dev/hda of=mbr.bin bs=512 count=1 # od -xa mbr.bin
這個 dd 命令需要以 root 用戶的身份運行,它從 /dev/hda(第一個 IDE 盤) 上讀取前 512 個字節的內容,並將其寫入 mbr.bin 文件中。od 命令會以十六進制和 ASCII 碼格式打印這個二進制文件的內容。
啓動GRUB/LILO
GRUB和LILO都是引導加載程序。最簡單地講,引導加載程序(boot loader) 會引導操作系統。當機器引導它的操作系統時,BIOS 會讀取引導介質上最前面的 512 字節(即人們所知的 主引導記錄(master boot record,MBR))。在單一的 MBR 中只能存儲一個操作系統的引導記錄,所以當需要多個操作系統時就會出現問題。所以需要更靈活的引導加載程序。
GRUB 與 LILO 的比較
如本文開始處所述,所有引導加載程序都以類似的方式工作,滿足共同的目的。不過,LILO 和 GRUB 之間有很多不同之處:
* LILO 沒有交互式命令界面,而 GRUB 擁有。
* LILO 不支持網絡引導,而 GRUB 支持。
* LILO 將關於可以引導的操作系統位置的信息物理上存儲在 MBR 中。如果修改了 LILO 配置文件,必須將 LILO 第一階段引導加載程序重寫到 MBR。相對於 GRUB,這是一個更爲危險的選擇,因爲錯誤配置的 MBR 可能會讓系統無法引導。使用 GRUB,如果配置文件配置錯誤,則只是默認轉到 GRUB 命令行界面。
安全提示:
關於安全性,任何可以接觸到引導磁盤/CD 的人,只需要使用沒有設置安全性的 grub.conf 或 lilo.conf,就可以繞過本文中提及的所有安全措施。特別是使用 GRUB 時,因爲能夠引導到單用戶模式,所以是一個嚴重的安全漏洞。解決此問題的一個簡單方法是在機器的 BIOS 中禁止通過 CD 和軟盤進行引導,並確保爲 BIOS 設置了一個口令,使得其他人不能修改這些設置。
加載內核
當內核映像被加載到內存之後,內核階段就開始了。內核映像並不是一個可執行的內核,而是一個壓縮過的內核映像。通常它是一個 zImage(壓縮映像,小於 512KB)或一個 bzImage(較大的壓縮映像,大於 512KB),它是提前使用 zlib 進行壓縮過的。在這個內核映像前面是一個例程,它實現少量硬件設置,並對內核映像中包含的內核進行解壓,然後將其放入高端內存中,如果有初始 RAM 磁盤映像,就會將它移動到內存中,並標明以後使用。然後該例程會調用內核,並開始啓動內核引導的過程。
GRUB 中的手工引導
在 GRUB 命令行中,我們可以使用 initrd 映像引導一個特定的內核,方法如下:
[root@localhost hzh]# vi /etc/grub.conf 查看grub.conf的配置文件
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.
如果您不知道要引導的內核的名稱,只需使用斜線(/)然後按下 Tab 鍵即可。GRUB 會顯示內核和 initrd 映像列表。
執行init進程
init進程是系統所有進程的起點,內核在完成核內引導以後,即在本線程(進程)空間內加載init程序,它的進程號是1。init進程是所有進程的發起者和控制者。因爲在任何基於Unix的系統(比如Linux)中,它都是第一個運行的進程,所以init進程的編號(Process ID,PID)永遠是1。如果init出現了問題,系統的其餘部分也就隨之而垮掉了。
init進程有兩個作用。第一個作用是扮演終結父進程的角色。因爲init進程永遠不會被終止,所以系統總是可以確信它的存在,並在必要的時候以它爲參照。如果某個進程在它衍生出來的全部子進程結束之前被終止,就會出現必須以init爲參照的情況。此時那些失去了父進程的子進程就都會以init作爲它們的父進程。快速執行一下ps -af 命令,可以列出許多父進程ID(Parent Process ID,PPID)爲1的進程來。
init的第二個角色是在進入某個特定的運行級別(Runlevel)時運行相應的程序,以此對各種運行級別進行管理。它的這個作用是由/etc/inittab文件定義的。
通過/etc/inittab文件進行初始化
init的工作是根據/etc/inittab來執行相應的腳本進行系統初始化,如設置鍵盤、字體, 裝載模塊,設置網絡,等等。
對於RedhatLinux來說,執行的順序爲:
/etc/rc.d/rc.sysinit # 由init執行的第一個腳本
/etc/rc.d/rc.sysinit主要做在各個運行模式中相同的初始化工作,包括:
設置初始的$PATH變量。
配置網絡。
爲虛擬內存啓動交換。
設置系統的主機名。
檢查root文件系統,以進行必要的修復。
檢查root文件系統的配額。
爲root文件系統打開用戶和組的配額。
以讀/寫的方式重新裝載root文件系統。
清除被裝載的文件系統表/etc/mtab。
把root文件系統輸入到mtab。
使系統爲裝入模塊做準備。
查找模塊的相關文件。
檢查文件系統,以進行必要的修復。
加載所有其他文件系統。
清除幾個/etc文件:/etc/mtab、/etc/fastboot和/etc/nologin。
刪除UUCP的lock文件。
刪除過時的子系統文件。
刪除過時的pid文件。
設置系統時鐘。
打開交換。
初始化串行端口。
裝入模塊。
/etc/rc.d/rcX.d/[KS]
首先終止“K”開頭的服務,然後啓動“S”開頭的服務。