首先說明一下,這裡講的是LINUX引導經過的步驟,而不涉及KERNEL引導過程的內部細節。希望本文能對初學LINUX的朋友有所協助。
一、從BIOS到KERNEL
電腦在接通電源之後首先由BIOS進行自檢,即進行所謂的POST(Power On Self
Test),然後依據BIOS內設定的引導順序從硬碟、磁碟片或CDROM中讀入“引導塊”。
如通常BIOS中設的引導順序為C在最前面,那麼就把C盤(第一個IDE硬碟)的第0柱面
,第0頭的第1個扇區讀入記憶體,然後跳到那裡開始執行。這個扇區有一個大家熟悉的 名字——MBR(Main Boot
Record)。換句話說,MBR裡面存放的是一小段程式以及分
區表的資料。在使用WIN9X和DOS時,這裡面放的代碼就把分區表裡標記為Active的分
區的第一個扇區(一般存放著作業系統的引導代碼)讀入記憶體並跳轉到那裡開始執行。
而在用LILO引導LINUX時,有兩種選擇:
(1) 把LILO安裝在MBR。這時就由BIOS直接把LILO代碼調入記憶體,然後跳轉執行
LILO。即
BIOS——>LILO(在MBR中)——>KERNEL
(2) 把LILO安裝在LINUX分區,並把LINUX分區設為Active。這時,BIOS調入的是 WIN9X/DOS下的MBR代碼,然後由這段代碼來調入LILO的代碼(位於使用中的磁碟分割的第一個 扇區)。即
BIOS——>MBR——>LILO(在使用中的磁碟分割的第一個扇區)——>KERNEL
因為在讀入及執行MBR時,作業系統還沒有起來,所以只能用BIOS提供的INT13來進
行磁碟操作,而INT13隻能讀寫硬碟1024柱面之前的資料,由此可知任何作業系統的引
導代碼必須在1024柱面之前。對於LINUX來說,不管你使用方式(1)還是方式(2)啟動,
都要保證KERNEL放在1024柱面之前。只有在KERNEL起來以後,才有讀/寫1024柱面以後
資料的能力。因為LINUX不使用INT13來進行硬碟操作。從上面我們也可以看到,不存在
什麼“WIN95可以,而LINUX不可以”的問題,作為作業系統要能被正確引導,在現有
的BIOS下,它們的引導部分都必須在1024柱面之前。如果作業系統本身還是基於INT13
來進行磁碟操作的話,那麼它也只能讀/寫1024柱面之前的資料。
二、從KERNEL到login prompt
在KERNEL起來之後,將產生第一個進程——init,實際上是執行了/sbin/init。ini t的工作是根據/etc/inittab來執行相應的指令碼進行系統初始化,如設定鍵盤、字型, 裝載模組,設定網路,等等。
/etc/inittab檔案的每一行包括四個域:
id:runlevels:action:process
runlevel是運行模式,通常為0-6。模式0是halt,模式6是reboot,模式1是單使用者, 模式2/3是多使用者,模式5是運行xdm以圖形介面方式登入。id為標識符,通常為兩個 字母。process為需要執行的程式或指令碼。action包括有:
(1) defaultinit —— 指定預設的運行模式(runlevel)
(2) sysinit —— 指定啟動並執行第一個程式/指令碼,此時runlevels域不起作用。
(3) boot —— 在sysinit之後執行,runlevels域不起作用
(4) bootwait —— 同boot,但init會等待該命令結束
(5) once —— 在進入有runlevels指定的運行模式時運行
(6) wait —— 同上,但init會等待該命令結束
(7) respawn —— 在進入相應runlevel時執行,並且若該進程結束,init會再起 一個進程執行同樣的命令
(8) ctrlaltdel —— 指定在使用者按下Ctrl-Alt-Del時執行的命令
對於Redhat來說,執行的順序為:
/etc/rc.d/rc.sysinit # 由init執行的第一個指令碼
/etc/rc.d/rc $RUNLEVEL # $RUNLEVEL為預設的運行模式
/sbin/mingetty # 等待使用者登入
三、/etc/rc.d/rc.sysinit及/etc/rc.d/rc
在Redhat中,/etc/rc.d/rc.sysinit主要做在各個運行模式中相同的初始化工作,包括:
調入keymap以及系統字型
啟動swapping
設定主機名稱
設定NIS網域名稱
檢查(fsck)並mount檔案系統
開啟quota
裝載音效卡模組
設定系統時鐘
等等。
/etc/rc.d/rc則根據其參數指定的運行模式來執行相應目錄下的指令碼。凡是以Kxx開
頭的,都以stop為參數來調用;凡是以Sxx開頭的,都以start為參數來調用。調用的
順序按xx從小到大來執行。例如,假設預設的運行模式是3,/etc/rc.d/rc就會按上 述方式調用/etc/rc.d/rc3.d/下的指令碼。
值得一提的是,Redhat中的運行模式2、3、5都把/etc/rc.d/rc.local做為初始化腳 本中的最後一個,所以使用者可以自己在這個檔案中添加一些需要在其他初始化工作之 後,登入之前執行的命令。
四、init在等待/etc/rc.d/rc執行完畢之後(因為在/etc/inittab中/etc/rc.d/rc 的action是wait),將在指定的各個虛擬終端上運行/sbin/mingetty,等待使用者的登 錄。至此,LINUX的啟動結束。
五、對於Slackware,作為sysinit的指令碼是/etc/rc.d/rc.S,運行模式1的指令碼是
/etc/rc.d/rc.K,運行模式2、3、4、5的指令碼是/etc/rc.d/rc.M。另外,裝載模組
的命令都集中在/etc/rc.d/rc.modules中,/etc/rc.d/rc.local為登入前執行的最 後一個指令碼。