img映象的製作
initrd對於嵌入式來說就是最終的檔案系統了。但是對於在桌面或伺服器Linux 系統中,initrd 是一個臨時的檔案系統,這樣的話initrd就可以引導真實的檔案系統。
現在我們已經瞭解瞭如何構建並使用定製的初始 RAM磁碟,本節將探索核心是如何識別 initrd 並將其作為根檔案系統進行掛載的。我們將介紹啟動鏈中的幾個主要函式,並解釋一下到底在進行什麼操作。 引導載入程式,例如 GRUB,定義了要載入的核心,並將這個核心映像以及相關的 initrd 拷貝到記憶體中。我們可以在 Linux核心原始碼目錄中的 ./init 子目錄中找到很多這種功能。 在核心和 initrd映像被解壓並拷貝到記憶體中之後,核心就會被呼叫了。它會執行不同的初始化操作,最終您會發現自己到了init/main.c:init()(subdir/file:function)函式中。這個函式執行了大量的子系統初始化操作。此處會執行一個對init/do_mounts.c:prepare_namespace() 的呼叫,這個函式用來準備img:一般製作檔案系統映象,有四種種方式(cpio和dd if=/dev/null of=a.img bs=1024 count=4000)包括initrd(驅動,遮蔽了對不同硬體的適配,沒必要把所有的驅動編譯到核心中去)、和ram的檔案系統製作檔案系統映象
第一種:cpio方式
解開一個cpio initrd:
> mkdir work
> cp /boot/initrd.img ./initrd.img.gz
> gunzip -c initrd.img.gz
> cpio -i --make-directories < initrd.img
生成initrd
find
. | cpio -o -H newc | gzip >initrd.img
(注:-H newc 是必須的,否則核心會認為是ramdisk,而不是initramfs
也可以用mkyaffs2image這個工具製作到友善之臂http://www.arm9.net/ 網站下載根檔案系統製作工具mkyaffs2image.tgz。
也可以製作img檔案。使用命令mkyaffs2image rootfs rootfs.img生成根檔案系統映像檔案。
第二種:filesystem data
1、dd if=/dev/zero of=/tmp/ramdisk.img bs=1024 count=4000
2、/sbin/mke2fs -F -m 0 -b 1024 /tmp/ramdisk.img 4000
3、mount
/tmp/ramdisk.img /mnt/initrd -t ext2 -o loop
4、製作檔案的資料夾
mkdir /mnt/initrd/bin
mkdir /mnt/initrd/sys mkdir /mnt/initrd/dev mkdir /mnt/initrd/proc # Grabbusyboxand create the symbolic links pushd /mnt/initrd/bin cp /usr/local/src/busybox-1.1.1/busybox. ln -sbusybox ash ln -sbusybox mount ln -sbusybox echo ln -sbusybox ls ln -sbusybox cat ln -sbusybox ps ln -sbusybox sysctl popd # Grab the necessary dev files cp -a /dev/console /mnt/initrd/dev cp -a /dev/ramdisk /mnt/initrd/dev cp -a /dev/ram0 /mnt/initrd/dev cp -a /dev/null /mnt/initrd/dev cp -a /dev/tty1 /mnt/initrd/dev cp -a /dev/tty2 /mnt/initrd/dev # Equate sbin with bin pushd /mnt/initrd ln -s bin sbin popd # Create the init file cat >> /mnt/initrd/linuxrc << EOF //這個是第一個程序,當init程序不存在就會執行inuxrc檔案 #!/bin/ash echo echo "Simple initrd is active" echo mount -t proc /proc /proc mount -t sysfs none /sys /bin/ash --login EOF chmod +x /mnt/initrd/linuxrc # Finish up... umount /mnt/initrd 5、做成gzip格式 gzip -9 /tmp/ramdisk.img 6、拷貝到boot下面就可以使用了 cp /tmp/ramdisk.img.gz /boot/ramdisk.img.gz 第三種:mkinitrd工具