天天看點

linux引導過程

從打開計算機的電源開始啟動redhat linux 系統到使用者可以登入為止,共經曆了

1.初始化bios

2.執行啟動加載程式

3.載入核心

4.啟動init服務(rc.sysinit->rc->rc.local->建立使用環境)

計算機在接通電源之後首先由bios進行post自檢,然後依據BIOS内設定的引導順序從硬碟,軟硬或cdrom中讀入引導塊

BIOS的第一個步驟是加電post自檢,post的工作是對硬體進行檢測,BIos的第二個步驟是進行本地裝置的枚舉和初始化。BIOS

由2部分組成:POST代碼和運作時的服務,當POST完成之後,它被從記憶體中清理出來,但是BIOS運作時服務依然保留在記憶體中,目标作業系統可以使用這些服務

BIOS運作時會按照CMOS的設定定義的順序來搜尋處于活動狀态并且可以引導的裝置,引導裝置可以是軟碟,CD-ROM,硬碟上的某個分區,

網絡上的某個裝置甚至是USB閃存。

通常,linux都是從硬碟上引導的,其中主引導記錄(MBR)中包含主引導加載程式,

MBR是一個512位元組大小的扇區,位于磁盤上的第一個扇區,(0道0柱面1扇區).當MBR被加載到RAM中之後,BIOS就會将控制權交給

MBR

啟動加載程式

在RED HAT linux 中,預設的加載程式是GRUB.引導加載程式用于引導作業系統啟動,當機器引導它的作業系統時,BIOS會讀取引導媒體上最前面的512位元組

(主引導記錄)。在單一的MBR中隻能存儲一個作業系統的引導記錄,是以當需要啟動多個作業系統的時就會出現問題,需要更加靈活的引導加載程式

所有的引導加載程式都以類似的方式工作,linux系統支援常用的引導加載程式:LILO和grub

載入核心

接一下的步驟就是加載核心映像到記憶體中,記憶體映像并不是一個可執行的核心,而是一個壓縮過的記憶體映像,通常它是一個zImage(壓縮映像,小于512KB)

或是一個bzImage(較大的壓縮映像,大于512KB),它是提前使用zlib壓縮過的,在這個核心映像前面是一個例程,它實作少量硬體設定,

并對核心映像中包含的核心進行解壓縮,然後将其高端的記憶體中。如果有初始化RAM磁盤映像,系統就會将它移動到記憶體中,并标明以後使用。

然後該例程會調用核心,并開始啟動核心引導的過程

linu核心啟動後,會執行以下幾項工作

1.檢測所有的硬體裝置

linux核心首先會向BIOS查詢計算機的所有的硬體裝置的資訊,然後自己接手管理這些硬體裝置,以便提供給red hat linux系統使用

2。驅動硬體裝置

接着linux核心便會驅動計算機的硬體裝置,要驅動硬體裝置,redhat linux就必須加載硬體的驅動程式,redhat linux的驅動程式可分為

編譯在核心鏡像檔案中的靜态驅動程式與核心子產品(kernel module)的動态驅動程式2種,其中的核心子產品全部都存儲在系統中

由于此時的Linux系統尚未挂載任何檔案系統,因而無法使用存儲于檔案系統上的核心子產品,redhat linux 自然借助這些動态驅動程式來驅動硬體裝置,是以,

啟動Linux核心的階段隻會使用靜态驅動程式,驅動必要的硬體裝置

如果沒有提供驅動程式的硬體裝置,redhat linux會等到挂載根目錄檔案系統後,在逐一嘗試尚未安裝驅動程式的裝置的驅動程式

3.以隻讀的方式挂載根檔案系統

接着linux核心會試着去挂載根檔案系統(root file system).安裝适當的核心子產品,一便驅動某些硬體裝置或啟用某些功能,

啟動于存儲于根檔案系統中的 init服務,以便讓Init接手後續的啟動工作

要特别注意的是:此時,根檔案系統是采用隻讀(read-only)的方式進行挂載的,也就是說,到目前為止,linux核心隻能讀取根檔案系統,無法改變其中的内容

這主要是因為此時的Linux核心仍在啟動階段,還不是很穩定,如果使用可讀可寫的方式挂載根檔案系統,萬一 系統不小心當機了,一來可能會破壞根檔案系統

上的資料,再者,redhat linux下次開機得花上很長的時間檢查并修複根檔案系統,為了避免這些問題的發生,redhat linux系統會以隻讀的方式來挂載根檔案系統

4.啟動Init服務

redhat linux核心啟動後的最後一個動作,就是從根檔案系統上找出并執行init服務,redhatlinux 核心會依照下列的順序尋找init服務,

1)找/sbin/是否有Init服務

2)/etc/init

3)/bin/init

4)都找不到,就會執行/bin/sh

在這個過程中,隻要有某一個步驟找到Init,linux就會去執行該目錄下中的init,如果到最後核心還是找不到init服務,redhat linux核心就會顯示 “kernel 

panic not syncing:Attempted to kill init!"的錯誤資訊

找到Init服務,redhat linux 就會讓init服務負責後續初始化使用的環境的工作。

接下來是執行init程序

初始化系統環境

啟動 init服務時,init服務會讀取/etc/initab 檔案,根據/etc/inittab中的設定資料進行初始化系統環境的工作,/etc/inittab 定義

init服務在red hat linux啟動過程中必須依序執行以下幾個script.

/etc/rc.d/rc.sysinit

/etc/rc.d/rc

/etc/rc.d/rc.local

由于這些script檔案名都是以rc開頭的,是以習慣上我們稱這些script為 "RC script".每一個RC Script負責的工作都不一樣

1./etc/rc.d/rc.sysinit

這個檔案主要的功能是設定系統的基本環境,當Init服務執行rc.sysinit時,會執行以下面幾項工作

a.啟動udev與selinux子系統

udev負責管理/dev/中的所有裝置檔案,而selinux則可以增強 red hat linux系統的安全性。當rc.sysinit執行時,必須啟動這2個子系統,才能進行其他的初始化

系統環境的工作

b.設定核心參數

rc.sysinit會執行sysctl -p ,以便從/etc/sysctl.conf設定redhat linux的核心參數

c.設定系統時間

rc.sysinit會将硬體時間設定成redhat linux的系統時間

d.加載鍵盤對應表

為了可以使用各式各樣的鍵盤,rc.sysinit也會加載鍵盤對應表,以便可以正确的輸入文字,符号。

e.啟用交換記憶體空間

rc.sysinit會執行swapon -a 指令,以便根據/etc/fstab的設定啟用所有的交換記憶體空間

f.設定主機名

rc.sysinit會根據/etc/sysconfig/network的Hostname參數設定redhat linux的主機名

g,檢查并挂載所有的檔案系統

rc.sysinit會檢查所有需要挂載的檔案系統,以確定這些檔案系統的完整性,檢查完畢後,rc.sysinit就會挂載所有的檔案系統

并且将根檔案系統的挂載參數修改為可讀可寫,以便讓我們可以在根檔案系統上寫入資料。

h.初始化硬體裝置

red hat linux 除了在啟動核心時以靜态驅動程式部分的硬體外,在執行rc.sysinit時,也會試着驅動剩餘的硬體裝置

i.啟動軟體磁盤陣列與Lvm

rc.sysinit也會啟用所有的軟體磁盤陣列,以及lvm的磁盤裝置

j,如有必要,解除安裝/initrd/

/initrd/用來挂載核心的初始化記憶體磁盤的資料,redhat linux可以通過初始化記憶體磁盤來加載必須的驅動程式,這樣才能讓red hat linux能在開機前驅動所需的

裝置,進而順利的進行啟動的工作

是以初始化記憶體磁盤隻有在啟用前有用,是以當redhat linux進入這個階段時,初始化記憶體磁盤已經沒有存在的價值了,是以rc.sysinit會視情況卸除初始化

記憶體磁盤,以節省更多的記憶體空間

k,初始化串行端口裝置

l,清除過期的鎖定檔案與IPC檔案

m,重新設定磁盤參數

這個腳本是用來建立runlevel的環境

如果需要在系統啟動的過程中執行某些工作,可以通過rc.sysinit,rc這2個腳本檔案來定義要執行的工作内容,但這2個檔案是啟動過程中非常重要的

啟動檔案,如果,rc.sysinit 或rc有錯誤的内容,輕則導緻系統啟動時出現無法預期的錯誤,嚴重則可能會造成redhat linux系統根本無法啟動。

是以,通常不能對這2個檔案進行修改

既然不能修改rc.sysinit,rc,那該如何讓redhat linux的系統在啟動時執行某些工作呢?此時請使用rc.local

rc.local是整個啟動過程中唯一可以修改的腳本檔案,如果希望在red hat linux啟動過程中執行某些指令,或者執行某些工作的話,那麼就可以

把這些工作的指令定義在這個檔案裡,當redhat linux開機并執行到rc.local時,就可以依照所定義的内容,完成系統的初始化工作。

本文轉自 xxl714 51CTO部落格,原文連結:http://blog.51cto.com/dreamgirl1314/973628,如需轉載請自行聯系原作者

繼續閱讀