什么是initrd
什么是initrd
initrd 的英文含義是 boot loader initialized RAM disk,就是由 boot loader 初始化的內(nèi)存盤。
在 linux內(nèi)核啟動前, boot loader 會將存儲介質(zhì)中的 initrd 文件加載到內(nèi)存,內(nèi)核啟動時會在訪問真正的根文件系統(tǒng)前先訪問該內(nèi)存中的 initrd 文件系統(tǒng)。
在 boot loader 配置了 initrd 的情況下,內(nèi)核啟動被分成了兩個階段,第一階段先執(zhí)行 initrd 文件系統(tǒng)中的"某個文件",完成加載驅(qū)動模塊等任務(wù),第二階段才會執(zhí)行真正的根文件系統(tǒng)中的 /sbin/init 進程。
這里提到的"某個文件",Linux2.6 內(nèi)核會同以前版本內(nèi)核的不同,所以這里暫時使用了"某個文件"這個稱呼,后面會詳細講到。
第一階段啟動的目的是為第二階段的啟動掃清一切障愛,最主要的是 加載根文件系統(tǒng)存儲介質(zhì)的驅(qū)動模塊。
initrd產(chǎn)生原因
要想明白initrd產(chǎn)生的原因,帶要從linux啟動說起。其實裝入本地linux系統(tǒng)時可以不用initrd,只要在kernel參數(shù)中加入root參數(shù)就可以了。
在boot loader如grub等裝入kernel后, kernel需要執(zhí)行系統(tǒng)中的/sbin/init, 讀取這個文件就必須先mount根文件系統(tǒng)。 早期是通過啟動時的root=參數(shù)告訴內(nèi)核根文件系統(tǒng)在哪個設(shè)備上。
隨著硬件和技術(shù)的發(fā)展,現(xiàn)在根文件系統(tǒng)可能位于一個網(wǎng)絡(luò)存儲如NFS上, 可能由于RAID而散布于多個設(shè)備上, 可能位于一個加密設(shè)備上需要提供用戶名和密碼,這時root=參數(shù)就顯得不夠了。
為了應(yīng)付這種局面, 先后出現(xiàn)兩種機制來作為boot loader裝載kernel到真正的/sbin/init執(zhí)行這個啟動過程的橋梁:initrd和initramfs。
兩者有類似的地方,比如都是由內(nèi)核執(zhí)行其上的某個程序(initrd是/linuxrc, initramfs是/init),由這個程序決定加載什么驅(qū)動以及如何裝載根文件系統(tǒng)。
例如,把linux裝入U盤中時,就要用到initrd。這里不是指把系統(tǒng)做成initrd直接加載成內(nèi)存式linux,而是像本地硬盤上那樣是非鏡像型的linux系統(tǒng)。
為什么必須要用initrd?我們可以從啟動過程來看。首先,由如GRUB的引導(dǎo)加載器加載內(nèi)核,這時可以識別U盤,如果你是從U盤啟動的,那么U盤為hd0。這一切都是GRUB可以識別U盤的存在。
當(dāng)內(nèi)核加載后情況就不一樣了,內(nèi)核之中一般是沒有U盤驅(qū)動的,那它就 找不到U盤,更不用說U盤中的系統(tǒng)了。所以就要用initrd來加載U盤驅(qū)動,并執(zhí)行系統(tǒng)中的/sbin/init。
initrd 的用途
1. linux 發(fā)行版的必備部件
linux 發(fā)行版必須適應(yīng)各種不同的硬件架構(gòu),將所有的驅(qū)動編譯進內(nèi)核是不現(xiàn)實的,initrd 技術(shù)是解決該問題的關(guān)鍵技術(shù)。Linux 發(fā)行版在內(nèi)核中只編譯了基本的硬件驅(qū)動,在安裝過程中通過檢測系統(tǒng)硬件,生成包含安裝系統(tǒng)硬件驅(qū)動的 initrd,無非是一種即可行又靈活的解決方案。
2. livecd 的必備部件
同 linux 發(fā)行版相比,livecd 可能會面對更加復(fù)雜的硬件環(huán)境,所以也必須使用 initrd。
3. 制作 Linux usb 啟動盤必須使用 initrd
usb 設(shè)備是啟動比較慢的設(shè)備,從驅(qū)動加載到設(shè)備真正可用大概需要幾秒鐘時間。如果將 usb 驅(qū)動編譯進內(nèi)核,內(nèi)核通常不能成功訪問 usb 設(shè)備中的文件系統(tǒng)。因為在內(nèi)核訪問 usb 設(shè)備時, usb 設(shè)備通常沒有初始化完畢。所以常規(guī)的做法是,在 initrd 中加載 usb 驅(qū)動,然后休眠幾秒中,等待 usb設(shè)備初始化完畢后再掛載 usb 設(shè)備中的文件系統(tǒng)。
4. 在 linuxrc 腳本中可以很方便地啟用個性化 bootsplash。