2010-11-16 45 views
4

我正在研究Linux中的啓動過程。我碰到這句話:「內存比軟盤快幾個數量級,所以系統操作從內存盤快速運行」爲什麼根文件系統加載到虛擬硬盤?

內核無論如何都會在RAM中加載根文件系統來執行它。所以我的問題爲什麼我們需要一個ramdisk加載根文件系統,如果內核加載根文件系統到RAM中?

+0

順便說一下,init ramdisks(如在基於RAM的_block_ devices中),也稱爲initrds,現代內核版本並未真正使用。它們已被基於RAM的文件系統(ramfs)所取代。 – thkala 2010-11-16 10:07:54

回答

8

documentation爲SUSE Linux提供的,爲什麼Linux是一個RAMDisk中啓動了很好的解釋:

只要Linux內核已經 引導和根文件系統(/) 安裝程序可以運行並且進一步的內核模塊可以被集成以提供 功能。 要裝入根文件 系統,某些條件必須爲 。內核需要相應的驅動程序訪問 設備,其中根文件系統 位於(特別是SCSI 驅動程序)。 內核還必須包含 讀取文件 系統(ext2,reiserfs,romfs等)所需的代碼。 也可以想象,根文件系統 已經被加密。在 這種情況下,需要密碼 安裝文件系統。

對於SCSI驅動程序的問題,一個 數不同的解決方案是 可能的。內核可能包含所有可以想象的驅動程序,但這可能是 的一個問題,因爲不同的驅動程序可能會相互衝突。而且, 內核因此會變得非常大 。 的另一種可能性是提供不同的內核,每個內核只包含一個或幾個SCSI驅動程序。此方法存在問題 需要大量不同的內核,然後由不同優化的內核(Athlon優化,SMP)增加 內核。 加載SCSI驅動程序 的想法模塊導致由初始 RAMDISK的概念解決了一般問題 :即使是根文件系統之前運行的用戶空間程序 是 安裝。

這防止在根文件系統不能被加載,直到它在其上位於可訪問的設備的電勢雞還是先有蛋的情況,但該裝置不能直到根文件系統被訪問已經被加載:

初始化內存(也稱爲initdisk或initrd的)解決精確上述問題。 Linux內核提供了一個選項,在安裝實際的根文件系統之前,將一個小文件系統加載到RAM磁盤並在那裏運行程序。 initrd的加載由引導加載程序(GRUB,LILO等)處理。引導加載程序只需要BIOS例程從引導介質加載數據。 如果引導加載程序能夠加載內核,它也可以加載初始ramdisk。不需要特殊的驅動程序。

當然,RAMDisk中不的引導過程中發生絕對必要。例如,您可以編譯內核,其中包含所有必要的硬件驅動程序和模塊以在啓動時加載。但顯然這對大多數人來說工作太多了,RAMDisk被證明是一個更簡單,更具擴展性的解決方案。

5

大多數Linux發行版在啓動時使用ramfs(initramfs)是因爲它的內容可以包含在內核文件中,或由bootloader提供。因此,它們在引導時立即可用,而內核不必從任何地方加載它們。

這允許內核運行用戶空間程序,例如,配置設備,加載模塊,設置包含所有文件系統的漂亮RAID陣列,甚至要求用戶輸入其加密根文件系統的密碼。

完成此配置後,將從(現在已配置且可用的)根文件系統中僅調用exec()s/sbin/init的第一個腳本。

我已經看到了很多系統,其中驅動程序爲磁盤控制器和rootfs通過initramfs中的模塊加載,而不是包含在內核映像中。

你不嚴格需要的initramfs爲了啓動 - 如果你的內核映像包含所有需要訪問根文件系統驅動程序,你不需要任何特殊配置或用戶輸入(如RAID陣列或加密文件系統)安裝它通常可以直接從rootfs啓動/ sbin/init。

參見:

http://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt

http://www.kernel.org/doc/Documentation/initrd.txt

作爲邊注,一些系統(救援盤,嵌入式和例如)可以使用RAMFS作爲根文件系統時的實際的根文件系統是在可能被刪除或不可寫的介質中(CD,Flash MTD等)。