Linux的啟動過程介紹

BTxigua發表於2007-08-18

使用者的登陸過程已經介紹,順便也從網上搜到的資料中總結一下Linux的啟動過程。

(1)BIOS自檢
BIOS自檢,BIOS 執行時會按照 CMOS 的設定定義的順序來搜尋處於活動狀態並且可以引導的裝置。載入程式主開機記錄MBR。MBR 是一個512位元組大小的扇區,位於磁碟上的第一個扇區中的0 道 0 柱面 1 扇區。
當MBR被載入到RAM中之後,BIOS就會將控制權交給MBR。
要檢視 MBR 的內容,請使用下面的命令:
  # dd if=/dev/hda of=mbr.bin bs=512 count=1
# od -xa mbr.bin


(2)載入載入程式GRUB和LILO
主開機記錄中的程式碼將檢查分割槽表(同樣位於主開機記錄內),鑑定活動分割槽(該分割槽已被標註為可引導的),再從這個活動分割槽內讀取引導區,後啟動引導區內的程式碼。該程式碼的作用是從分割槽內讀取並啟動核心。
但是用一個單獨的分割槽來儲存核心映像通常是沒有用的,該分割槽引導區內的程式碼不能連續讀取硬碟。所以常用LILO或者GRUB來動系統。
GRUB和LILO都是引導載入程式,它一般會直接讀取並啟動預設核心。
(3)載入核心
當核心映像被載入到記憶體之後,核心階段就開始了。核心映像並不是一個可執行的核心,而是一個壓縮過的核心映像。通常它是一個 zImage(壓縮映像,小於 512KB),它是提前使用 zlib 進行壓縮過的。所以第一步是自行解壓,實現少量硬體設定,核心映像的開始處有一個專門為此設計的小程式。解壓後將其放入高階記憶體中,如果有初始 RAM 磁碟映像,就會將它移動到記憶體中,並標明以後使用。
在這一過程中,核心檢查還存在哪些其他的硬體(硬碟、軟盤、網路介面卡等等),並配置相應的裝置驅動程式;在它進行這個步驟期間,它將輸出自己找到的資訊。
然後,核心將試著裝入根檔案系統。裝入點是在編輯時間或任何時候,利用LILO或GRUB配置的。檔案系統型別可以自動偵測。如果檔案系統裝入失敗了,比如說因為你忘了把相應的檔案系統驅動程式包括在核心內,核心停止不前了。
之後,核心便在後臺啟動init程式/sbin/init
(4)執行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檔案定義的。
(5)通過/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”開頭的服務。
  對每一個執行級別來說,在/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引數。
  執行/etc/ec.d/rc.local
  Redhat Linux中的執行模式2、3、5都把/etc/rc.d/rc.local做為初始化指令碼中的最後一個,所以使用者可以自己在這個檔案中新增一些需要在其他初始化工作之後,登入之前執行的命令。在維護Linux系統運轉的日子裡,肯定會遇到需要系統管理員對開機或者關機命令指令碼進行修改的情況。如果所做的修改只在引導開機的時候起作用,並且改動不大的話,可以考慮簡單地編輯一下/etc/rc.d/rc.local指令碼。這個命令指令碼程式是在引導過程的最後一步被執行的。
  執行 /bin/login 程式
  login 程式會提示使用者需輸入賬號及密碼, 接著編碼並確認密碼的正確性, 若二者相合, 則為使用者進行初始化環境, 並將控制權交給 shell,即等待使用者登入。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10867315/viewspace-194831/,如需轉載,請註明出處,否則將追究法律責任。

相關文章