1. 程式人生 > >img映象的製作

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() 的呼叫,這個函式用來準備
名稱空間
(掛載 dev檔案系統、RAID或 md、裝置以及最後的 initrd)。載入 initrd 是通過呼叫init/do_mounts_initrd.c:initrd_load() 實現的。 initrd_load()函式呼叫了init/do_mounts_rd.c:rd_load_image(),它通過呼叫init/do_mounts_rd.c:identify_ramdisk_image() 來確定要載入哪個 RAM磁碟。這個函式會檢查映像檔案的 magic 號來確定它是 minux、etc2、romfs、cramfs 或 gzip 格式。在返回到initrd_load_image 之前,它還會呼叫 init/do_mounts_rd:crd_load()。這個函式負責為 RAM磁碟分配空間,並計算
迴圈冗餘校驗碼
(CRC),然後對 RAM磁碟映像進行解壓,並將其載入到記憶體中。現在,我們在一個適合掛載的塊裝置中就有了這個 initrd 映像。 現在使用一個 init/do_mounts.c:mount_root()呼叫將這個塊裝置掛載到根檔案系統上。它會建立根裝置,並呼叫 init/do_mounts.c:mount_block_root()。在這裡呼叫init/do_mounts.c:do_mount_root(),後者又會呼叫 fs/namespace.c:sys_mount()來真正掛載根檔案系統,然後 chdir 到這個檔案系統中。這就是我們在清單 6 中所看到的熟悉訊息 VFS: Mounted root(ext2 file system). 的地方。 最後,返回到 init 函式中,並呼叫init/main.c:run_init_process。這會導致呼叫 execve 來啟動 init 程序(在本例中是/
linux
rc)。linuxrc 可以是一個可執行程式,也可以是一個指令碼(條件是它有指令碼直譯器可用)。 這些函式的呼叫層次結構如清單 7 所示。儘管此處並沒有列出拷貝和掛載初始 RAM磁碟所涉及的所有函式,但是這足以為我們提供一個整體流程的粗略框架。 。其生存週期很短,只會用作到真實檔案系統的一個橋樑。在沒有儲存裝置的嵌入式系統中,initrd 是永久根檔案系統

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工具

1、建立要載入ramdisk的映像檔案。mkinitrd(make initial ramdisk images)

2、語法:mkinitrd [-fv][--omit-scsi-modules][--version][--preload=<模組名稱>][--with=<模組名稱>][映像檔案][Kernel 版本] 3、mkinitrd可建立映像檔案,以供Linux開機時載入ramdisk。 4、引數說明: -f 若指定的映像問家名稱與現有檔案重複,則覆蓋現有的檔案。 -v  執行時顯示詳細的資訊。 --omit-scsi-modules 不要載入SCSI模組。 --preload=<模組名稱> 指定要載入的模組。 --with=<模組名稱> 指定要載入的模組。 --version 顯示版本資訊。 第四種工具:mkinitcpio