我們在安裝新核心的時候,通常都會編輯lilo.conf 和grub.conf 檔案。裡面有一段“initrd=/boot/initrd-***.img”(其中的***表示核心的版本號碼)的我們都很少會注意到,有時候還會發現這 一行不要也可以正常開機。那這個initrd***.img究竟是用來幹什麼的呢? 其實initrd***.img是一個鏡像檔案,類似ramdisk,把一段程式打包到img裡,然後在開機的時候在記憶體裡開闢一段地區,一般是 2m,釋 放到那裡運行,都是一些初始化的程式,比如sisc_mod、ext3、sd_mod等模組和insmod、nash等命令。不同核心,初始化的img可 以相同,也可以不同,如果沒有,可以在grub.conf裡加上no initrd,它就跳過initrd的檢測和執行了,以前好像就沒有,後來才有的。 它的作用是在沒有mount /分區以前,系統要執行一些操作,比如掛載scsi驅動,它就把initrd釋放到記憶體裡,作一個虛擬/,然後執行其根目錄下的一個指令碼 “linuxrc”,運行insmod和nash命令掛裝模組。為什麼有的時候我們在lilo或grub的設定檔中不加入該行都可以正常開機呢。這是因 為我們一般的PC機都沒有使用scsi硬碟等需要先載入其驅動的裝置,所以就算沒有initrd***.img也可以正常開機。但是如果我們要在伺服器上 為其編譯新核心那就一定不要忘記也為其建立一個initrd檔案呀。 [color="#ff3f00"]好,下面來看看如何查看initrd***.img裡面的內容和如何為你的新核心建立一個新的initrd.img檔案。 [color="#a300a3"]查看initrd.img: initrd***.img雖然尾碼是“img”,但其實它是一個gz格式的檔案,我們可以先把它解壓,然後載掛裝到目錄下: 1、cp initrd.img initrd.gz 2、guzip initrd.gz 3、mount -o loop initrd /mnt/floppy 進入/mnt/floppy目錄,我們就可以看到initrd***.img檔案的廬山真面目了。 [color="#a300a3"]製作initrd檔案 當我們編譯了一個新的核心,也不要忘了為我們的scsi裝置做一個新的initrd鏡像: 文法: mkinitrd 檔案名稱 核心的目錄名 樣本: mkinitrd initrd-2.4.19.img 2.4.19 initrd-2.4.19.img檔案是自己任意取的,但最好對應自己的核心版本號碼。 2.4.19是在/lib/modules中的目錄名,對應核心的版本。 當然,我們也可以在掛裝了initrd***.img檔案後直接添加模組到/lib目錄中,然後修改linuxrc指令碼讓其開機進行掛裝。但必須具備一定的shell指令碼的能力才行。 IBM參考文檔: http://www-128.ibm.com/developerworks/cn/linux/l-k26initrd/index.html
Linux 下的 initrd 映像檔案初探 Wu Zhangjin 創作於 2015/06/18 評論 / 分享 by falcon of TinyLab.org2008/04/19 1 簡介 如果自己製作過嵌入式 Linux 檔案系統,那麼應該比較瞭解 initrd 映像檔案是個什麼東西了。initrd 即 initial RAM disk,在核心解壓之後,在真正的 root filesystem 被啟動之前,它被載入到記憶體中,做一些系統初始化的操作,比如載入核心模組,掛載新的 Root 檔案系統等。 initrd 本身是一個檔案,核心啟動時可以把它展開成一個檔案系統。 在 2.6 版本的核心以前,initrd 基於一種特殊的 Loop裝置,在展開成一個檔案系統前需要通過一種 Loop 裝置掛載起來,因為涉及到掛載操作,所以會涉及到一些操作許可權。不過在 2.6 版本核心之後出現了 initramfs,它和 initrd 實現同樣的功能,但是它基於一種 cpio 檔,無須掛載就可以展開成一個檔案系統,因此省去了各種相關的許可權,在自動化方面更方便了。 initrd 的一個特別有趣的應用是Live CD,比如 Knoppix,它通過 initrd 啟動一個初始化的檔案系統,然後再通過一個 Cloop 裝置掛載一個特別的壓縮檔,展開為一個新的 Root 檔案系統,這樣一個 700M 左右的光碟片就能夠裝下幾個 G 的東西,包含大部分的軟體和相應的核心模組,進而支援各種各樣的功能。 2 initrd/initramfs 製作 下面簡單介紹一下這兩種初始設定檔案系統(initrd 和 initramfs)的製作過程。 先準備一個測試的目錄。 $ cd /tmp $ mkdir initrd $ mkdir initrd/loop initrd/cpio 2.1 initrd (via a loop device) 首先通過 dd 命令產生一個指定大小的檔案。先來計算一下大小,比如要產生一個 1M 大小的檔案,那麼可以設定該檔案的資料區塊大小為 1024kbyte,然後弄上 1024 塊。 $ dd if=/dev/zero of=ramdisk bs=1024 count=1024 $ ls -lh ramdisk -rw-r--r-- 1 falcon falcon 1.0M 2008-04-19 14:59 ramdisk $ file ramdisk ramdisk: data 得到這樣一個檔案以後就可以把這個檔案系統格式化為 ext3 或者是 ext2 的檔案系統。 $ mkfs.ext2 ramdisk $ file ramdisk ramdisk: Linux rev 1.0 ext2 filesystem data 如果想往這個檔案系統裡頭新增內容(比如用 busybox 自動的建立一些內容,或者參照 Linux 的根檔案系統,從頭開始手動製作一個)那麼就需要先通過 Loop 裝置掛載一下。 不過掛載時需要 Root 使用者才行,所以如果你沒有 Root 使用者的許可權,做這個工作就不方便了,從這裡就可以看出之後要介紹的 initramfs 的好處了。 $ mount ramdisk /mnt/ -o loop |