Linux 啓動過程詳解

   這是個很值得探討的問題,51CTO上就有很詳細的文章,自己就不寫相關博客了。這隻上傳一張圖片,以及貼一些連接....

 

   這張圖片很詳細的說明了Linux的啓動過程。

   更詳細的文字介紹鏈接如下:

   http://book.51cto.com/art/200906/127322.htm

   先貼部分:(其實整個章節都值得好好讀讀)

   第4章 Linux網絡服務和xinetd

本章要點

Linux啓動過程

Linux守護進程

xinetd

Linux服務管理工具

安全選擇Linux服務

.從BIOS到內核

(1)BIOS自檢

計算機在接通電源之後首先由BIOS進行自檢,即進行所謂的POST(Power On Self Test),然後依據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。

(2)提取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碼格式打印這個二進制文件的內容。

2.啓動GRUB/LILO

GRUB和LILO都是引導加載程序。簡單地講,引導加載程序(boot loader)會引導操作系統。當機器引導它的操作系統時,BIOS會讀取引導介質上最前面的512字節(主引導記錄,即master boot record,MBR)。在單一的MBR中只能存儲一個操作系統的引導記錄,所以當需要多個操作系統時就會出現問題,因此需要更靈活的引導加載程序。

所有引導加載程序都以類似的方式工作,滿足共同的目的。不過,LILO和GRUB之間有很多不同之處:

LILO沒有交互式命令界面,而GRUB擁有。

LILO不支持網絡引導,而GRUB支持。

LILO將關於可以引導的操作系統位置的信息在物理上存儲於MBR中。如果修改了LILO配置文件,必須將LILO第一階段的引導加載程序重寫到MBR。對於GRUB,這是一個危險的選擇,因爲錯誤配置的MBR可能會讓系統無法引導。使用GRUB,如果配置文件錯誤,則默認轉到GRUB命令行界面。

安全提示  關於安全性,任何可以接觸到引導磁盤/CD的人,只需要使用沒有設置安全性的grub.conf或lilo.conf,就可以繞過本節中提及的所有安全措施。特別是使用GRUB時,因爲能夠引導到單用戶模式,所以是一個嚴重的安全漏洞。解決此問題的一個簡單方法是在機器的BIOS中禁止通過CD和軟盤進行引導,並確保爲BIOS設置了口令,使得其他人不能修改這些設置。

3.加載內核

當內核映像被加載到內存之後,內核階段就開始了。內核映像並不是一個可執行的內核,而是一個壓縮過的內核映像。通常它是一個zImage(壓縮映像,小於512KB)或bzImage(較大的壓縮映像,大於512KB),它是提前使用zlib進行壓縮的。在這個內核映像前面是一個例程,它實現少量硬件設置,並對內核映像中包含的內核進行解壓,然後將其放入高端內存中,如果有初始RAM磁盤映像,就會將它移動到內存中,並標明以後使用。然後該例程會調用內核,並開始啓動內核引導的過程。

在GRUB命令行中,我們可以使用initrd映像引導一個特定的內核,方法如下:

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映像列表。

安全提示  通過MD5進行GRUB密碼加密,這樣會更安全。

① 原來GRUB的密碼是123456,所以先要用MD5對123456這個密碼進行加密。

# /sbin/grub-md5-crypt
Password: 在這裏輸入123456
Retype password: 再輸入一次123456
$1$7uDL20$eSB.XRPG2A2Fv8AeH34nZ0

$1$7uDL20$eSB.XRPG2A2Fv8AeH34nZ0就是通過grub-md5-crypt進行加密後產生的值。

② 修改配置文件/etc/grub.conf,加入"password --md5 $1$7uDL20$eSB.XRPG2A2Fv8AeH34nZ0"一行,注意在title之前。修改後的文件格式如下:

timeout=10
splashp_w_picpath=(hd0,7)/boot/grub/splash.xpm.gz
password --md5 $1$7uDL20$eSB.XRPG2A2Fv8AeH34nZ0
title Fedora Core (2.4.22-1.2061.nptl)
root (hd0,7)
kernel /boot/vmlinuz-2.4.22-1.2061.nptl ro root=LABEL=/
initrd /boot/initrd-2.4.22-1.2061.nptl.img
title WindowsXP
rootnoverify (hd0,0)
chainloader +1

4.執行init進程

init進程是系統所有進程的起點,內核在完成核內引導以後,即在本線程(進程)空間內加載init程序,它的進程號是1。init進程是所有進程的發起者和控制者。因爲在任何基於UNIX的系統(比如Linux)中,它都是第一個運行的進程,所以init進程的編號(Process ID,PID)永遠是1。如果init出現了問題,系統的其餘部分也就隨之不可用。

init進程有兩個作用:

① 扮演終結父進程的角色。因爲init進程永遠不會被終止,所以系統總是可以確信它的存在,並在必要的時候以它爲參照。如果某個進程在它衍生出來的全部子進程結束之前被終止,就會出現必須以init爲參照的情況。此時那些失去了父進程的子進程都會以init作爲它們的父進程。快速執行一下"ps-af"命令,可以列出許多父進程的編號(Parent Process ID,PPID)爲1的進程來。

② 在進入某個特定的運行級別(Runlevel)時運行相應的程序,以此對各種運行級別進行管理。它的這個作用是由/etc/inittab文件定義的。

5.通過/etc/inittab文件進行初始化

init的工作是根據/etc/inittab來執行相應的腳本進行系統初始化,如設置鍵盤、字體,裝載模塊,設置網絡等。對於Red Hat Linux來說,按以下順序執行。

(1)執行/etc/rc.d/rc.sysinit(由init執行的第一個腳本)

Red Hat Linux的/etc/rc.d/rc.sysinit要做在各個運行模式中相同的初始化工作,包括:

設置初始的$PATH變量。

配置網絡。

爲虛擬內存啓動交換。

設置系統的主機名。

檢查root文件系統,以進行必要的修復。

檢查root文件系統的配額。

爲root文件系統打開用戶和組的配額。

以讀/寫的方式重新裝載root文件系統。

清除被裝載的文件系統表/etc/mtab。

把root文件系統輸入到mtab。

使系統爲裝入模塊做準備。

查找模塊的相關文件。

檢查文件系統,以進行必要的修復。

加載所有其他文件系統。

清除幾個/etc文件,如/etc/mtab、/etc/fastboot和/etc/nologin。

刪除UUCP的lock文件。

刪除過時的子系統文件。

刪除過時的pid文件。

設置系統時鐘。

打開交換。

初始化串行端口。

裝入模塊。

(2)執行/etc/rc.d/rcX.d/[KS]

首先終止"K"開頭的服務,然後啓動"S"開頭的服務。

對每一個運行級別來說,在/etc/rc.d子目錄中都有一個對應的下級目錄。這些運行級別的下級子目錄的命名方法是rcX.d,其中X就是代表運行級別的數字。比如說,運行級別3的全部命令腳本程序都保存在/etc/rc.d/rc3.d子目錄中。在各個運行級別的子目錄中,都建立有到/etc/rc.d/init.d子目錄中命令腳本程序的符號鏈接,但是,這些符號鏈接並不使用命令腳本程序在/etc/rc.d/init.d子目錄中原來的名字。如果命令腳本程序是用來啓動一個服務的,其符號鏈接的名字就以字母"S"打頭;如果命令腳本程序是用來關閉一個服務的,其符號鏈接的名字就以字母"K"打頭。

許多情況下,這些命令腳本程序的執行順序都很重要。如果沒有預先配置網絡接口,就沒有辦法使用DNS服務解析主機名。爲了安排執行順序,在字母S或者K的後面緊跟着一個兩位數字,數值小的在數值大的前面執行。比如:/etc/rc.d/rc3.d/S50inet就會在 /etc/rc.d/rc3.d/S55named之前執行。存放在/etc/rc.d/init.d子目錄中的、被符號鏈接上的命令腳本程序是真正的實幹家,是它們完成了啓動或者停止服務的操作過程。當/etc/rc.d/rc通過每個特定的運行級別子目錄的時候,它會根據數字的順序依次調用各個命令腳本程序。它先運行以字母K打頭的命令腳本程序,然後再運行以字母S打頭的命令腳本程序。對以字母K打頭的命令腳本程序來說,會傳遞Stop參數;類似地對以字母S打頭的命令腳本程序來說,會傳遞Start參數。

(3)執行/etc/ec.d/rc.local

Red Hat Linux中的運行模式2、3、5都把/etc/rc.d/rc.local作爲初始化腳本中的最後一個文件,所以用戶可以自己在這個文件中添加一些需要在其他初始化工作之後,登錄之前執行的命令。在維護Linux系統運轉時,肯定會遇到需要系統管理員對開機或者關機命令腳本進行修改的情況。如果所做的修改只在引導開機的時候起作用,並且改動不大的話,可以考慮簡單地編輯一下/etc/rc.d/rc.local腳本。這個命令腳本程序是在引導過程的最後一步執行的。

(4)執行/bin/login

login程序會提示使用者需輸入賬號及密碼,接着編碼並確認密碼的正確性,若二者相合,則爲使用者進行初始化環境,並將控制權交給shell,即等待用戶登錄。到此爲止,Linux啓動過程全部結束。如圖4-1所示是Linux啓動流程圖。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章