initrd 的英文含義是 boot loader initialized ram disk,就是由 boot loader 初始化的記憶體盤。在 linux核心啟動前,boot loader 會將儲存介質中的 initrd 檔案載入到記憶體,核心啟動時會在訪問真正的根檔案系統前先訪問該記憶體中的 initrd 檔案系統。在 boot loader 配置了 initrd 的情況下,核心啟動被分成了兩個階段,第一階段先執行 initrd 檔案系統中的"init or linuxrc",完成載入驅動模組等任務,第二階段才會執行真正的根檔案系統中的 /sbin/init, linux2.6既支援cpio-initrd,也支援image-initrd,但是cpio-initrd有著更大的優勢,在使用中我們應該優先 考慮使用cpio格式的initrd.
initrd 的主要用途
linux 發行版必須適應各種不同的硬體架構,將所有的驅動編譯進核心是不現實的,initrd 技術是解決該問題的關鍵技術。linux 發行版在核心中只編譯了基本的硬體驅動,在安裝過程中通過檢測系統硬體,生成包含安裝系統硬體驅動的 initrd,是一種即可行又靈活的解決方案。
1.解壓 initrd
# file initrd.`uname –r`.img (察看格式,不同的linux作業系統,這個檔案格式也有不同,這個檔案格式可能是cpio 也可能是ext2)
如果是cpio格式 :
# mkdir /mnt/tmp
# cd /mnt/tmp
# cpio -idmv 2 壓縮initrd
2.1 mkinitrd
#cd /lib/modules/`uname -r`
#mkinitrd /tmp/initrd.`uname -r`.img `uname -r`
#cd /tmp
#mv initrd.`uname –r`.img initrd.`uname –r`.img.gz(initrd使用gzip壓縮,如果不改名字的話,後面無法解壓縮)
#gunzip initrd.`uname -r`.img.gz
2.2 cpio
#假設當前目錄位於準備好的initrd檔案系統的根目錄下
bash# find . | cpio -c -o > ../initrd.img
bash# gzip ../initrd.img
2.3 gen_init_cpio
獲取 gen_init_cpio,工具 ,gen_init_cpio是編譯核心時得到的,
在核心源**的 usr 目錄下,我們可以通過 以下步驟獲取它,進入核心源** 執行 :
# make menuconfig
# make usr/
這樣即編譯好gen_init_cpio,
gen_initramfs_list.sh 在核心源**的 script 目錄下,
將這兩個 檔案 copy 到 /tmp 目錄下,/tmp/initrd 為 解壓好的 initrd 目錄,執行以下命令 製作initrd :
# gen_initramfs_list.sh initrd/ > filelist
# gen_init_cpio filelist >initrd.img
# gzip initrd.img
# mv initrd.img initrd-'uname –r』.img
只有用這個方式壓縮的initrd ,在linux系統重啟的時候才能 一正確的檔案格式 boot 起來,也可以用
這種方式修改安裝光碟的initrd檔案 然後 進行系統安裝。
3. 如何在 initrd 中新增新的驅動,以 ahci.ko 為例
3.1 gen_init_cpio
# cp initrd-『uname –r『.img /tmp/initrd;cd /tmp/initrd
#cpio –ivdum < initrd-『uname –r』.img;
# mv initrd-『uname –r』.img ../
#cd /tmp/initrd
#vim init加上一行 insmod /lib/ahci.ko
#cp ahci.ko lib/
#cd /tmp
# gen_initramfs_list.sh initrd/ > filelist
# gen_init_cpio filelist >initrd.img
# gzip initrd.img
# mv initrd.img initrd-『uname –r』.img
至此,新的initrd檔案initrd-『uname –r』.img中就包含了ahci的驅動程式了 ,這種方式是最簡單有效的。
3.2 mkinitrd
(1) add 「alias scsi_hostadapter ahci」 at /etc/modprobe.conf
(2) copy ahci.ko to 「/lib/module/$(kernel-version)」/kernel/drivers/scsi」
(3) mkinitrd initrd.img 『uname -r』
至此,新的initrd檔案initrd-『uname –r』.img中就包含了ahci的驅動程式了 .
ubuntu 解壓和打包
tar 解包 tar xvf filename.tar 打包 tar cvf filename.tar dirname 注 tar是打包,不是壓縮!gz解壓1 gunzip filename.gz 解壓2 gzip d filename.gz 壓縮 gzip filename tar.gz 和 tg...
initramfs 檔案系統打包進核心
把initramfs編譯到核心裡面去 使用initramfs最簡單的方式,莫過於用已經做好的cpio.gz把kernel裡面那個空的給換掉。這是2.6 kernel天生支援的,所以,你不用做什麼特殊的設定。kernel的config option裡面有一項config initramfs sourc...
linux 命令 解壓和打包
1.gzip壓縮 gzip a.txt 2.解壓 gunzip a.txt.gz gzip d a.txt.gz 3.bzip2壓縮 bzip2 a 4.解壓 bunzip2 a.bz2 bzip2 d a.bz2 5.將當前目錄的檔案打包 tar cvf bak.tar 將 etc passwor...