1. 程式人生 > >分析Linux系統的啟動過程

分析Linux系統的啟動過程

  一直使用linux系統,卻對系統啟動過程及系統初始化和各種服務的啟動不太清楚。今天終於搞明白整個是怎麼一回事了。本來想自己寫篇文章,剛好在網上看到一篇不錯的介紹,很詳細,就直接拿來了。

  Linux系統的啟動過程:

BIOS自檢 —> grub載入程式 —> 載入核心 —> 執行init —> 啟動shell —> login登陸系統

  系統啟動各個階段的詳細介紹:

一.BIOS自檢

  計算機在接通電源之後首先由BIOS進行POST自檢,然後依據BIOS內設定的引導順序從硬碟、軟盤或CDROM中讀入引導塊。Linux系統是人BIOS中的地址oxFFFF0處開始引導的。BIOS的第1個步驟是加電POST自檢。POST的工作是對硬體進行檢測

。BIOS的第2個步驟是進行本地裝置的列舉和初始化。BIOS由兩部分組成:POST程式碼和執行時的服務。當POST完成之後,它被從記憶體中清理出來,但是BIOS執行時服務依然保留在記憶體中,目標作業系統可以使用這些服務。

  BIOS執行時會按照CMOS的設定定義的順序來搜尋處於活動狀態並且可以引導的裝置。引導裝置可以是軟盤、CD-ROM、硬碟上的某個分割槽、網路上的某個裝置甚至是USB快閃記憶體。通常,Linux系統都是從硬碟上引導的,其中主引導記錄(MBR)中包含主引導載入程式。MBR是一個512位元組大小的扇區,位於磁碟上的第一個扇區(0道0柱面1扇區)。當MBR被載入到RAM中之後,BIOS就會將控制權交給MBR。

  如果要檢視MBR的內容,使用者需要以root使用者的身份執行如下命令:

  讀入了1+0個塊

  輸出了1+0個塊

  它從/dev/had(第一個IDE盤)上讀取前512個位元組的內容,並將其寫入mbr.bin檔案中。od命令會以十六進位制和ASCII碼格式列印這個二進位制檔案的內容。

二.啟動GRUB/LILO

  GRUB和LILO都是引導載入程式。引導載入程式用於引導作業系統啟動。當機器引導它的作業系統時,BIOS會讀取引導介質上最前面的512位元組(主引導記錄)。在單一的MBR中只能儲存一個作業系統的引導記錄,所以當需要多個作業系統時就會出現問題,需要更靈活的引導載入程式。

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

  LILO沒有互動式命令介面,而GRUB擁有;

  LILO不支援網路引導,而GRUB支援;

  LILO將可以引導作業系統的資訊儲存在MBR中。

  如果修改了LILO配置檔案,必須將LILO第一階段引導載入程式重寫到MBR。相對於GRUB,這是一個更為危險的選擇,因為錯誤配置的MBR可能會讓系統無法引導。使用GRUB時,如果配置檔案配置錯誤,則只是預設轉到GRUB命令列介面。

三.載入核心

  接下來的步驟就是載入核心映像到記憶體中,核心映像並不是一個可執行的核心,而是一個壓縮過的核心映像。通常它是一個zImage(壓縮映像,小於512KB)或是一個bzImage(較大的壓縮映像,大於512KB),它是提前使用zlib壓縮過的。在這個核心映像前面是一個例程,它實現少量硬體設定,並對核心映像中包含的核心進行解壓縮,然後將其放入高階記憶體中。如果有初始RAM磁碟映像,系統就會將它移動到記憶體中,並標明以後使用。然後該例程會呼叫核心,並開始啟動核心引導的過程。

四.執行init程序

  init程序是系統所有程序的起點,核心在完成核內引導以後,即在本程序空間內載入init程式,它的程序呈是1。Init程序是所有程序的發起者和控制者。因為在任何基於Linux的系統中,它都是第一個執行的程序,所以init程序的編號(PID)永遠是1

  init程序有以下兩個作用。

  init程序的第一個作用是扮演終結父程序的角色。因為init程序永遠不會被終止,所以系統總是可以確信它的存在,並在必要的時候以它為參照。如果某個程序在它衍生出來的全部子程序結束之前被終止,就會出現必須以init為參照的情況。此時那些失去了父程序的子程序就都會以init作為它們的父程序。

  init的第二個作用是在進入某個特定的執行級別時執行相應的程式,以此對各種執行級別進行管理。它的這個作用是由/etc/inittab檔案定義的。

五.通過/etc/inittab檔案進行初始化

  Init的工作是根據/etc/inittab來執行相應的指令碼,進行系統初始化,如設定鍵盤、字型、裝載模組,設定網路等。

在init的配置檔案中有如下一行: