製作CPIO格式的INITRD
LINUX核心自從2.6版以後,就大力推薦CPIO-INITRD.
現在各大LINUX發行版的INITRD都是CPIO格式的.
這次主要說下如何製作CPIO-INITRD.
首先假設咱們已經用BUSYBOX或KLIBC或別的什麼做好了根檔案系統,位於~/rootfs下.
按照IBM DEVELOPERWORKS裡的文章說,可以用以下命令製作CPIO-INITRD:
cd ~/rootfs
find . | cpio -c -o > ../initrd.img
gzip ../initrd.img
其實這是不對的.
我用這幾條命令製作CPIO-INITRD,結果都是KERNEL PANIC.
參照我用的ARCHLINUX發行版的mkinitcpio命令的指令碼程式碼,應該是用gen_init_cpio命令來製作CPIO-INITRD.
gen_init_cpio命令原始碼通常與LINUX核心原始碼一塊兒打包,位於核心原始碼目錄的usr/下面.
編譯其原始碼得到gen_init_cpio可執行檔案,這還不夠.
gen_init_cpio的引數是一個文字檔案,這個檔案的內容類似於這種格式:
dir /sbin 755 0 0
slink /sbin/makedevs ../bin/busybox 777 0 0
slink /sbin/modprobe ../bin/busybox 777 0 0
slink /sbin/switch_root ../bin/busybox 777 0 0
slink /sbin/sysctl ../bin/busybox 777 0 0
slink /sbin/lsmod ../bin/busybox 777 0 0
slink /sbin/getty ../bin/busybox 777 0 0
slink /sbin/ifconfig ../bin/busybox 777 0 0
......
很明顯,這是個檔案列表.
手工製作這個檔案列表是不現實的,usr/目錄下還有個gen_initramfs_list.sh,這個指令碼就是用來自動生成檔案列表的.
好了,下面咱們就可以得出生成CPIO-INITRD的完整步驟了:
cd ~
gen_initramfs_list.sh rootfs/ > filelist
gen_init_cpio filelist > rootfs.cpio
gzip rootfs.cpio
最後得到的這個rootfs.cpio.gz,就是咱們要的CPIO-INITRD了.
在BOOTLOADER裡修改一下引數:
append initrd=rootfs.cpio.gz ramdisk_size=8192 vga=792
結果怎麼樣?
(全文完)
參考連結:
在已經做好的 rootfs 下
程式碼:
find . | cpio -H newc -o > /tmp/rootfs.cpio
cd /tmp
gzip -9 rootfs.cpio
-L 解除符號連線的關聯
-H newc 是採用新型 (SVR4) 跨平臺格式, 支援大於 65536 i 節點 的 文件系統,不能啟動主要是這
個,因為預設格式是老式的"bin"
經試,能成功啟動,這樣修改 initrd.gz 文件,比 mkinitramfs 形象、方便的多
cpio 解壓
首先,該檔案是一個經過壓縮的檔案,當然要先解壓了,這些大家都非常清楚的,就是用
#gunzip 檔名.cpio.gz
這樣檔案就解壓成為 "檔名.cpio" 了,然後再對它進行 cpio 操作
#cpio -idmv < 檔名.cpio
這樣就將 cpio 檔案徹底暴露在我們面前了。