製作initramfs鏡像

Linux kernel在自身初始化完成之後,需要能夠找到並運行第一個用戶程序(這個程序通常叫做“init”程序)。用戶程序存在於文件系統之中,因此,內核必須找到並掛載一個文件系統纔可以成功完成系統的引導過程。
在grub中提供了一個選項“root=”用來指定第一個文件系統,但隨着硬件的發展,很多情況下這個文件系統也許是存放在USB設備,SCSI設備等等多種多樣的設備之上,如果需要正確引導,USB或者SCSI驅動模塊首先需要運行起來,可是不巧的是,這些驅動程序也是存放在文件系統裏,因此會形成一個悖論。
爲解決此問題,Linux kernel提出了一個RAM disk的解決方案,把一些啓動所必須的用戶程序和驅動模塊放在RAM disk中,這個RAM disk看上去和普通的disk一樣,有文件系統,有cache,內核啓動時,首先把RAM disk掛載起來,等到init程序和一些必要模塊運行起來之後,再切到真正的文件系統之中。
上面提到的RAM disk的方案實際上就是initrd。如果仔細考慮一下,initrd雖然解決了問題但並不完美。比如,disk有cache機制,對於RAM disk來說,這個cache機制就顯得很多餘且浪費空間;disk需要文件系統,那文件系統(如ext2等)必須被編譯進kernel而不能作爲模塊來使用。
Linux 2.6 kernel提出了一種新的實現機制,即initramfs。顧名思義,initramfs只是一種RAM filesystem而不是disk。initramfs實際是一個cpio歸檔,啓動所需的用戶程序和驅動模塊被歸檔成一個文件。因此,不需要cache,也不需要文件系統。
更加詳細的initramfs的資料可以參考如下:
(1) 黃敬羣先生的blog:深入理解 Linux 2.6 的 initramfs 機制
http://blog.linux.org.tw/~jserv/archives/001954.html
(2) initramfs, a new model for initial RAM
http://www.linuxdevices.com/articles/AT4017834659.html
下面是一些使用initramfs的簡單幫助
1. 查看initramfs的內容
# mkdir temp ; cd temp
# cp /boot/initrd.img-2.6.24-16 initrd.img-2.6.24-16.gz
# gunzip initrd.img-2.6.24-16.gz
# cpio -i --make-directories 

2. 創建initramfs
命令:mkinitramfs, update-initramfs
1) mkinitramfs
# mkinitramfs -o /boot/initrd.img 2.6.24-16
Note: 2.6.24-16是需要創建initramfs的kernel版本號,如果是給當前kernel製作initramfs,可以用uname -r查看當前的版本號。提供kernel版本號的主要目的是爲了在initramfs中添加指定kernel的驅動模塊。mkinitramfs會把/lib/modules/${kernel_version}/ 目錄下的一些啓動會用到的模塊添加到initramfs中。
2)update-initramfs
更新當前kernel的initramfs
# update-initramfs -u
在添加模塊時,initramfs tools只會添加一些必要模塊,用戶可以通過在/etc/initramfs-tools/modules文件中加入模塊名稱來指定必須添加的模塊。
                
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章