許多人對Linux的啟動過程感到很神秘,因為所有的啟動信息都在屏幕上一閃而過。其實, Linux的啟動過程並不象啟動信息所顯示的那樣復雜,它主要分成兩個階段: 1.啟動內核。在這個階段,內核裝入內存並在初始化每個設備驅動器時打印信息。 2.執行程序init。裝入內核並初始化設備後,運行init程序。init程序處理所有程序的啟動, 包括重要系統精靈程序和其它指定在啟動時裝入的軟件。 下面以Red Hat為例簡單介紹一下Linux的啟動過程。 一、啟動內核 首先介紹啟動內核部分。電腦啟動時,BIOS裝載MBR,然後從當前活動分區啟動,LILO獲得引 導過程的控制權後,會顯示LILO提示符。此時如果用戶不進行任何操作,LILO將在等待制定 時間後自動引導默認的操作系統,而如果在此期間按下TAB鍵,則可以看到一個可引導的操作 系統列表,選擇相應的操作系統名稱就能進入相應的操作系統。 當用戶選擇啟動LINUX操作系統時,LILO就會根據事先設置好的信息從ROOT文件系統所在的分 區讀取LINUX映象,然後裝入內核映象並將控制權交給LINUX內核。LINUX內核獲得控制權後, 以如下步驟繼續引導系統: 1. LINUX內核一般是壓縮保存的,因此,它首先要進行自身的解壓縮。內核映象前面的一些 代碼完成解壓縮。 2. 如果系統中安裝有可支持特殊文本模式的、且LINUX可識別的SVGA卡,LINUX會提示用戶 選擇適當的文本顯示模式。但如果在內核的編譯過程中預先設置了文本模式,則不會提示選 擇顯示模式。該顯示模式可通過LILO或RDEV工具程序設置。 3. 內核接下來檢測其他的硬件設備,例如硬盤、軟盤和網卡等,並對相應的設備驅動程序 進行配置。這時,顯示器上出現內核運行輸出的一些硬件信息。 4. 接下來,內核裝載ROOT文件系統。ROOT文件系統的位置可在編譯內核時指定,也可通過 LILO或RDEV指定。文件系統的類型可自動檢測。如果由於某些原因裝載失敗,則內核啟動 失敗,最終會終止系統。 二、執行init程序 其次介紹init程序,利用init程序可以方便地定制啟動其間裝入哪些程序。init的任務是 啟動新進程和退出時重新啟動其它進程。例如,在大多數Linux系統中,啟動時最初裝入 六個虛擬的控制台進程,退出控制台窗口時,進程死亡,然後init啟動新的虛擬登錄控制台, 因而總是提供六個虛擬登陸控控制台進程。 控制init程序操作的規則存放在文件/etc/inittab中。Red Hat Linux缺省的inittab文 件如下: # #inittab This file describes how the INIT process should set up the system in a certain #run-level. # # #Default runlevel.The runlevels used by RHS are: #0-halt(Do NOT set initdefault to this) #1-Single user mode #2-Multiuser,without NFS(the same as 3,if you do not have networking) #3-Full multiuser mode #4-unused #5-X11 #6-reboot(Do NOT set initdefault to this) # id:3:initdefault: #system initialization si::sysinit:/etc/rc.d/rc.sysinit 10:0:wait:/etc/rc.d/rc 0 11:1:wait:/etc/rc.d/rc 1 12:2:wait:/etc/rc.d/rc 2 13:3:wait:/etc/rc.d/rc 3 14:4:wait:/etc/rc.d/rc 4 15:5:wait:/etc/rc.d/rc 5 16:6:wait:/etc/rc.d/rc 6 #Things to run in every runlevel ud:once:/sbin/update #Trap CTRL-ALT-DELETE ca::ctrlaltdel:/sbin/shutdown -t3 -r now #When our UPS tells us power has failed,assume we have a few minutes of power left.Schedule a #shutdown for 2 minutes from now. #This does,of course,assume you have powered installed and your UPS connected and working #correctly. pf::powerfail:/sbin/shutdown -f -h +2 "Power Restored;Shutdown Cancelled" #Run gettys in standard runlevels 1:12345:respawn:/sbin/minggetty tty1 2:2345:respawn:/sbin/minggetty tty2 3:2345:respawn:/sbin/minggetty tty3 4:2345:respawn:/sbin/minggetty tty4 5:2345:respawn:/sbin/minggetty tty5 6:2345:respawn:/sbin/minggetty tty6 #Run xdm in runlevel 5 x:5:respawn:/usr/bin/X11/xdm -nodaemon Linux有個運行級系統,運行級是表示系統當前狀態和init應運行哪個進程並保持在這種 系統狀態中運行的數字。在inittab文件中,第一個項目指定啟動時裝入的缺省運行級。 上例中是個多用戶控制台方式,運行級為3。然後,inittab文件中每個項目指定第二個 字段的項目用哪種運行級(每個字段用冒號分開)。因此,對運行級3,下列行是相關的: 13:3:wait:/etc/rc.d/rc 3 1:12345:respawn:/sbin/minggetty tty1 2:2345:respawn:/sbin/minggetty tty2 3:2345:respawn:/sbin/minggetty tty3 4:2345:respawn:/sbin/minggetty tty4 5:2345:respawn:/sbin/minggetty tty5 6:2345:respawn:/sbin/minggetty tty6 最後六行建立Linux提供的六個虛擬控制台。第一行運行啟動腳本/etc/rc.d/ rc 3; 這將運行目錄/etc/ rc.d/rc3.d中包含的所有腳本,這些腳本表示系統初始化時要啟動的程序。一般來說, 這些腳本不需要編輯或改變,是系統缺省的。