vmlinuxz initrd initrd.imd

 vmlinuz自然就是內核了,initrd.img是一個小的映象,包含一個最小的linux系統。通常的步驟是先啓動內核,然後內核掛載initrd.img,並執行裏面的腳本來進一步掛載各種各樣的模塊,然後發現真正的root分區,掛載並執行/sbin/init... ...。
initrd.img當然是可選的了,如果沒有initrd.img,內核就試圖直接掛載root分區。
之所以要有initrd,那是爲了啓動的時候有更大的靈活性。比如,你把ext3支持編譯成模塊了。偏偏你的root分區又是ext3的。這下就麻煩了。因爲內核需要掛載root分區之後才能加載ext3支持。但是沒有ext3支持就沒法掛載root分區。initrd就是用來解決這個問題的。
類似的用這個東西還可以做其他的事情,比如從usb盤啓動linux也會面臨上面類似的問題。用initrd就能搞定了。
甚至,我想在有些嵌入式設備裏面都不需要真正的root分區,用initrd就足夠搞定一切了。

 

kernel及initrd

kernel就是我們剛剛所提到的"vmlinuz"文件,只是文件名稱不是直接取名爲kernel罷了。一般系統在啓動時,kernel及initrd兩種文件都是要同時存在的(如圖2-15所示,啓動菜單中大部分都是kenel與initrd兩個選項同時存在的),因爲這兩者是相輔相成的文件,缺一不可,這也是爲何筆者會將kernel及initrd放在同一章節中做介紹的原因,這樣可以讓讀者直接將兩者做對照。當然,不同的系統應用模式或許可以省略掉initrd,但kernel就萬萬不可,因爲kernel是一個系統(不論系統的大小)中最基本的一個元素,缺了kernel,就無系統可言。

(點擊查看大圖)圖2-15:GRUB啓動菜單中某操作系統的細部選項

kernel

kernel是操作系統的核心程序,也是操作系統最重要的一支程序,所有的軟、硬件都通過kernel做交互的操作,因此,若這段程序寫得不好,將會造成操作系統易宕機的狀況,甚至找不到設備或適配器都有可能。

用戶和kernel之間,最常會遇到的一種狀況,就是當計算機使用一段時間(可能是2~3年內),就會發現許多硬件或軟件功能都已經不再被既有的操作系統所支持,像USB 2.0剛出現或是須要使用新的文件系統(kernel中有關USB 2.0的配置如圖2-16所示),都要通過kernel的更新做配合,因爲軟、硬件技術都已經全面更新。

【config-kernel版本】文件的意義,就在於記錄kernel所支持的項目有哪些,以及支持的方式(像直接支持或是模塊化),當然每一版kernel的config文件都會不太一樣。

舉例來說,近幾年的Intel南橋芯片組依序爲ICH5、ICH6、ICH7、ICH8、ICH9,一直到現在的ICH10,如果用戶在ICH10剛推出就安裝Fedora 7,啓動時一定會有許多兼容性的問題發生,因爲芯片組有可能部分功能不被Fedora 7支持所致。

 
(點擊查看大圖)圖2-16:在/boot/config-XXX文件中有關USB 2.0與NTFS的配置

解決的方法,並不是一定得苦等到更新版本的出現,而是可以在既有的Fedora 7直接從網絡上下載較新的kernel版本,再將舊的kernel取代掉即可,只要新的kernel支持該芯片組,便可以繼續使用原來的Linux,完全不需重新安裝或增刪其他任何資料。

initrd

initrd的全名是initial ram disk,顧名思義就是啓動系統所需加載的虛擬磁盤。要了解kernel與initrd之關係,纔會真正知道initrd存在的意義及它執行時對系統所帶來的影響,這是非常重要的。

以圖2-17爲例,kernel 、initrd與系統硬盤中所存有的模塊(System Module)有各自所負責的領域,這三者依啓動時的順序被依序加載,因爲啓動過程需要很多硬件的協助,所以在順序上是不能混亂的,在圖2-17中爲了讓讀者比較好分辨出各硬件與這三者的關係,所以用不同

 
(點擊查看大圖)圖2-17:kernel、initrd與模塊間的關係

的顏色深淺來標明(大致的範圍,僅供參考使用),同顏色箭頭所指向的系統文件負責該區域,這三個系統文件依啓動順序分別爲:kernel、initrd及System Module,以下分別介紹其負責的部分有哪些。

灰色框:kernel所負責的主要是北橋、南橋、CPU及內存,從硬件角度來看,若kernel有問題,當然是整個系統都會出錯,因爲會影響到整部主機最重要的硬件核心部分。

白色框:initrd大部分所支持的都是一些關鍵(會影響啓動)的外部硬件,如SATA、SCSI、USB等硬件外設,可視情況調整支持的多少。

黑色框:系統中所存在的模塊,是與支持和啓動無很大關係的硬件,大部分是一些應用方面的硬件設備,如聲卡、網卡、顯示卡等,沒有這些硬件的支持還是可以正常啓動進入Linux,只是會有功能上的缺陷,所以纔會以模塊文件方式存在於文件系統中。

initrd的目的就是在kernel加載系統認識CPU、內存等信息之後,像接力賽般地讓系統進一步知道"還有哪些硬件是啓動所必須使用到的",若和啓動無關的,就可以丟給接下來用戶自行配置的系統模塊。

但什麼時候需要在initrd文件中放入額外的模塊(或拿掉模塊),答案是當主機多了一個在啓動操作系統之前就要先找到的設備。

如果該硬設備可以等進入操作系統再使用,就可以直接以modprobe的方式載入模塊使用,而無須去修改initrd文件,因爲這樣只會增加啓動時所要加載的文件數目。但要注意的是,在initrd文件中所放入的模塊,必須是與操作系統同一版本kernel所編譯的模塊,這樣纔可使用。

 

 

Initrd

名稱
initrd -- 由啓動加載器進行初始化的RAM DISK

描述
/dev/initrd這個特殊文件是一個只讀的塊設備文件。/dev/initrd設備文件是一個在內核被啓動之前由啓動加載器進行初始化的RAM disk。
隨後,內核利用/dev/initrd設備文件的內容進行兩個階段的(系統)自舉。
在(系統)自舉的第一個階段,內核進行初始化,根據/dev/initrd的內容掛載一個原始根文件系統。
在第二個階段,一些附加的驅動或者其他模塊從原始的根設備中被加載。在加載完附加模塊後,一個新的根文件系統(也就是常規的根文件系統)從別的設備被掛載。

自舉操作流程
使用initrd進行系統自舉,系統初始化如下:

1.啓動加載器把內核程序以及/dev/initrd的內容加載到內存

2.在內核初始化過程中,內核把/dev/initrd設備的內容解壓縮並拷貝到/dev/ram0設備上,隨之釋放被/dev/initrd佔用的內存空間

3.接着內核以可讀寫的方式把/dev/ram0設備掛載爲原始的根文件系統

4.如果(不知道如何翻譯indicated)常規根文件系統也是原始根文件系統(舉例來說,/dev/ram0),那麼內核跳至最後一步正常啓動

5.如果可執行文件/linuxrc存在於原始根文件系統上,/linuxrc就以uid爲0的帳戶身份被執行。(/linuxrc文件必須具有可執行屬性,它可以是包括shell腳本在內的任何有效的可執行文件)

6.如果/linuxrc沒有被執行或者當/linuxrc(的運行)終止時,常規根文件系統被掛載。(如果/linuxrc退出時在原始根文件系統上掛載了任意文件系統,那麼內核的行爲則是不定的。閱讀注意事項以確定當前的內核行爲)

7.如果常規根文件系統存在/initrd目錄,那麼/dev/ram0將從/移動到/initrd。否則如果/initrd目錄不存在,/dev/ram0將被卸載。(當從/移動到/initrd而/dev/ram0沒有被卸載時,會導致進程仍能從/dev/ram0運行)。如果/initrd目錄不存在,並且當/linuxrc退出時任何進程仍能從/dev/ram0運行,內核的行爲是不定的。閱讀注意事項以確定當前內核的行爲。)

8.正常的啓動過程(比如/sbin/init的調用)將在常規根文件系統上進行
...
注意事項
1.在當前內核下,當/dev/ram0從/被移動到/initrd時,任何已掛載的文件系統依然能被訪問。然而,/proc/mounts條目不會被更新。
2.在當前內核下,如果/initrd不存在,如果/dev/ram0被其他進程使用中或者有任何文件系統被掛載其上,/dev/ram0將不會被完全卸載。如果/dev/ram0沒有被完全卸載,那麼/dev/ram0將駐留在內存

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章