大家都知道initrd 是linux 啟動的記憶體檔案系統,那他裡面有都是什麼呢?今天就看看如何開啟這個檔案系統!
initrd = init ramdisk,是一個啟動時存在於記憶體的檔案系統。initrd的最初的目的是為了把kernel的啟動分成兩個階段:在kernel中保留最少最基本 的啟動代碼,然後把對各種各樣硬體裝置的支援以模組的方式放在initrd中,這樣就在啟動過程中可以從initrd所mount的根檔案系統中裝載需要 的模組。這樣的一個好處就是在保持kernel不變的情況下,通過修改initrd中的內容就可以靈活的支援不同的硬體。在啟動完成的最後階段,根檔案系 統可以重新mount到其他裝置上。
Linux啟動一定要用initrd麼?
不必,如果把需要的功能全都編譯到核心中(非模組方式),只需要一個核心檔案即可,initrd能夠減小啟動核心的體積並增加靈活性。如果你的核心以 模組方式支援某種檔案系統(例如ext3, UFS),而啟動階段的驅動模組(如jbd)放在這些檔案系統上,核心是無法讀取檔案系統的,從而只能通過initrd的虛擬檔案系統來裝載這些模組。
這裡有些人會問: 既然核心此時不能讀取檔案系統,那核心的檔案是怎麼裝入記憶體中的呢?答案很簡單,Grub是file-system sensitive的,能夠識別常見的檔案系統。
initrd檔案是怎麼產生的?
使用mkinitrd命令,這個命令其實是一個Bash指令碼
#file `which mkinitrd`
/sbin/mkinitrd: Bourne-Again shell script text executable
該指令碼先建立一個8M的空檔案,並在此上建立一個檔案系統,並拷貝相應的的檔案。
一個預設RedHat Fedora Core 2, 它的initrd是什麼內容
(跟系統的硬體相關)?
# file initrd-2.6.5-1.358.img
initrd-2.6.5-1.358.img: gzip compressed data, from Unix, max compression
# mv initrd-2.6.5-1.358.img initrd-2.6.5-1.358.gz
# gzip -d initrd-2.6.5-1.358.gz
# ll
-rw-r--r-- 1 root root 8192000 Jan 14 11:32 initrd-2.6.5-1.358
# mkdir /mnt/loop
# mount -o loop initrd-2.6.5-1.356 /mnt/loop
………… 中間修改此檔案系統,等等…………
# umount loop
# cd /boot
# gzip -9 initrd-2.6.5-1.356
# mv initrd-2.6.5-1.356.gz initrd-2.6.5-1.356.img
方法2:
mv initrd-2.6.5.13.58.img initrd.gz
gzip -d initrd.gz(這時候會解開檔案包。變成一個initrd的檔案)
mount -t proc initrd /mnt
cd /mnt
ls 就可以看到裡面的內容了!