1. 程式人生 > >《Linux啟動過程分析》之區別Initramfs與initrd

《Linux啟動過程分析》之區別Initramfs與initrd

  之前《Linux啟動過程分析》核心掛載根檔案系統一文,分析的rootfs、其實就是解決了Linux的VFS架構下初始掛載點的建立問題。

  下邊說的Initramfs/initrd則是填充(僅僅是釋放檔案到rootfs根目錄)/擴充(通過掛載其他檔案系統型別到rootfs指定目錄)rootfs的關鍵,以保證Linux系統的後續啟動。

  另外一個好處是,這樣配置可以將一些驅動編譯成核心模組、從而減小核心img的開銷。

一、簡介

1.initrd

  在早期的linux系統中,一般只有硬碟或者軟盤被用來作為linux根檔案系統的儲存裝置,因此也就很容易把這些裝置的驅動程式整合到核心中。但是現在的嵌入式系統中可能將根檔案系統儲存到各種儲存裝置上,包括scsi、sata,u-disk等等。因此把這些裝置的驅動程式碼全部編譯到核心中顯然就不是很方便。

  為了解決這一矛盾,於是出現了基於ramdisk的initrd( bootloader initialized RAM disk )。Initrd是一個被壓縮過的小型根目錄,這個目錄中包含了啟動階段中必須的驅動模組,可執行檔案和啟動指令碼。當系統啟動的時候,bootloader會把initrd檔案讀到記憶體中,然後把initrd檔案在記憶體中的起始地址和大小傳遞給核心。核心在啟動初始化過程中會解壓縮initrd檔案,然後將解壓後的initrd掛載為根目錄,然後執行根目錄中的/linuxrc指令碼(cpio格式的initrd為/init,而image格式的initrd<也稱老式塊裝置的initrd或傳統的檔案映象格式的initrd>為/initrc),您就可以在這個指令碼中載入realfs(真實檔案系統)存放裝置的驅動程式以及在/dev目錄下建立必要的裝置節點。這樣,就可以mount真正的根目錄,並切換到這個根目錄中來。

2.Initramfs

  在linux2.5中出現了initramfs,它的作用和initrd類似,只是和核心編譯成一個檔案(該initramfs是經過gzip壓縮後的cpio格式的資料檔案),該cpio格式的檔案被連結進了核心中特殊的資料段.init.ramfs上,其中全域性變數__initramfs_start和__initramfs_end分別指向這個資料段的起始地址和結束地址。核心啟動時會對.init.ramfs段中的資料進行解壓,然後使用它作為臨時的根檔案系統。

二、區別

1.核心配置

make menuconfig

支援Initramfs的核心配置:

General setup->Initial RAM filesystem and RAM disk(initramfs/initrd) support
General setup->Initramfs source file(s)

填寫根檔案系統的具體路徑,如:../out/target/product/tclm6/root

這時,根檔案系統編入核心vmlinux\zImage\uImage。

支援initrd的核心配置(需要核心支援記憶體盤驅動):

General setup->Initial RAM filesystem and RAM disk(initramfs/initrd) support
RamDisk記憶體盤驅動
Device Drivers->Block devices->RAM block device support
啟動引數
Boot options->Default kernel command string
填寫如下:mem=32M console=ttySAC0 root=/dev/ram initrd=0xc1000000,0x00600000 ramdisk_size=8192 rw