1. 程式人生 > >Linux啟動 grub 虛擬檔案系統initrd詳解(二)

Linux啟動 grub 虛擬檔案系統initrd詳解(二)

上文我們分析了啟動和grub的一些東西,這節讓我們討論一些linux核心載入啟動和虛擬檔案系統initrd的問題。
首先還是grub的menu.lst

這裡寫圖片描述
其中關於default 和timeout的講解網上都有說明
這裡的root(hd0,0) 代表的以下的kernel和initrd檔案系統所在的位置是第一塊硬碟的第一個分割槽,這個可以根據自己核心存放位置設定,但是要注意grub的檔案系統型別。

kernel /vmlinuz..... ro root=.......

核心檔案後面跟著的引數就是核心引數,他會在進入系統後保留在/proc/cmdline裡面
這裡寫圖片描述
grub讀取到核心檔案之後,接著核心會自解壓到記憶體當中, 並利用核心功能去測試和驅動各硬體,重新檢查一次硬體。
由於部分的驅動程式位於硬碟的根分割槽下,這樣啟動過程中就要掛載根分割槽,實現動態載入核心模組。
So 問題來了,核心怎樣能認出你的硬碟並讀取你的硬碟呢? 之前是、BIOS中斷實現讀取硬碟MBR,核心並不會,但是核心還要載入硬碟中部分的驅動程式如/lib/modules下面的模組。
這就是initrd這個虛擬檔案系統的存在的目的。
來讓我們看一下這個initrd檔案到底是一個什麼東東:
這裡寫圖片描述


由上圖可以看出這個initrd是一個cpio 格式檔案並gzip壓縮過,我們把它解壓後可以看到其實就類似我們的根分割槽了,對,他就是一個模擬的根目錄。我們進入lib裡面看看:

 lib/modules/核心版本/kernel/

目錄裡面有很多的模組及相關驅動程式。
那麼這個檔案系統是怎樣執行的呢? initrd 被載入到記憶體,然後由核心解壓 解壓之後,會執行init指令碼,看 它是一個可執行檔案一個shell指令碼。
關於它的分析詳細請看http://blog.csdn.net/oldlinux/article/details/43243103
其實就是建立必要的掛載目錄,載入必要的模組,試著去掛載真正的根分割槽,找到/sbin/init 從而開啟第一個程序。
其實這裡如果你想在系統掛載根分割槽之前對硬碟操作都可以放到init腳本里面操作,也可以在initrd裡面加入自己的binary,所有的操作都是在記憶體中。
好的,接下來談一下/sbin/init之後的一些系統初始化操作。