boot loader裝入kernel, 然后kernel需要執(zhí)行/sbin/init, 讀取
這個文件就必須先mount根文件系統(tǒng), 早期是通過啟動時(shí)的root=
參數(shù)告訴內(nèi)核根文件系統(tǒng)在哪個設(shè)備上,  隨著硬件和技術(shù)的發(fā)展,
現(xiàn)在根文件系統(tǒng)可能位于一個網(wǎng)絡(luò)存儲如NFS上, 可能由于RAID而
散布于多個設(shè)備上, 可能位于一個加密設(shè)備上需要提供用戶名和密碼,
這時(shí)root=參數(shù)就顯得不夠了. 為了應(yīng)付這種局面, 先后出現(xiàn)兩種
機(jī)制來作為boot loader裝載kernel到真正的/sbin/init執(zhí)行這個啟動
過程的橋梁: initrd和initramfs, 兩者有類似的地方, 比如都是
由內(nèi)核執(zhí)行其上的某個程序(initrd是/linuxrc, initramfs是/init),
由這個程序決定加載什么驅(qū)動以及如何裝載根文件系統(tǒng). 下面一點(diǎn)
筆記總結(jié)initrd的缺點(diǎn)和initramfs的優(yōu)點(diǎn).
initrd:
ram disk是一個基于ram的塊設(shè)備,因此它占據(jù)了一塊固定的內(nèi)存,
而且事先要使用特定的工具比如mke2fs格式化,還需要一個文件系統(tǒng)
驅(qū)動來讀寫其上的文件。
如果這個disk上的空間沒有用完,這些未用的內(nèi)存就浪費(fèi)掉了,并且
這個disk的空間固定導(dǎo)致容量有限,要想裝入更多的文件就需要重新
格式化。
由于Linux的塊設(shè)備緩沖特性, ram disk上的數(shù)據(jù)被拷貝到page cache
(對于文件數(shù)據(jù))和dentry cache(對于目錄項(xiàng)), 這個也導(dǎo)致內(nèi)存浪費(fèi).
initramfs:
最初的想法是Linus提出的: 把cache當(dāng)作文件系統(tǒng)裝載. 他在一個叫
ramfs的cache實(shí)現(xiàn)上加了一層很薄的封裝, 其它內(nèi)核開發(fā)人員編寫了
一個改進(jìn)版tmpfs, 這個文件系統(tǒng)上的數(shù)據(jù)可以寫出到交換分區(qū), 而且
可以設(shè)定一個tmpfs裝載點(diǎn)的最大尺寸以免耗盡內(nèi)存. initramfs就是
tmpfs的一個應(yīng)用.
優(yōu)點(diǎn):
    (1)tmpfs隨著其中數(shù)據(jù)的增減自動增減容量.
    (2)在tmpfs和page cache/dentry cache之間沒有重復(fù)數(shù)據(jù).
    (3)tmpfs重復(fù)利用了Linux caching的代碼, 因此幾乎沒有增加內(nèi)核
     尺寸, 而caching的代碼已經(jīng)經(jīng)過良好測試, 所以tmpfs的代碼質(zhì)量
     也有保證.
    (4)不需要額外的文件系統(tǒng)驅(qū)動.
另外, initrd機(jī)制被設(shè)計(jì)為舊的"root="機(jī)制的前端, 而非其替代物,
它假設(shè)真正的根設(shè)備是一個塊設(shè)備, 而且也假設(shè)了自己不是真正的根設(shè)備,
這樣不便將NFS等作為根文件系統(tǒng), 最后/linuxrc不是以PID=1執(zhí)行的, 因?yàn)?br>1這個進(jìn)程ID是給/sbin/init保留的. initrd機(jī)制找到真正的根設(shè)備后將
其設(shè)備號寫入/proc/sys/kernel/real-root-dev, 然后控制轉(zhuǎn)移到內(nèi)核由
其裝載根文件系統(tǒng)并啟動/sbin/init.
initramfs則去掉了上述假設(shè), 而且/init以PID=1執(zhí)行, 由init裝載根文件
系統(tǒng)并用exec轉(zhuǎn)到真正的/sbin/init, 這樣也導(dǎo)致一個更為干凈漂亮的設(shè)計(jì).