示範如何修改initrd image的內容。
發現我們自己做的block driver移植到Xen的環境上會有問題,我懷疑是因為移植的時候沒有把Xen相關的kernel module給包進initrd image,造成開機時缺乏那些module,使得相關的iscsi動作異常。所以我把重包過與系統原始的initrd image打開來比較,發現確實lib目錄中確實少了兩個xen相關的kernel module,init當然也沒有load到。所以將缺少的xen module複製進去,並修正的init之後,就可以把他們重包回initrd image試試看了。
動作示範:
因為initrd image其實是壓縮檔(可以使用file指令去驗證),所以必須先以gunzip解開之後,再經由cpio -i命令去解開。
file initrd-2.6.18-274.el5.img
initrd-2.6.18-274.el5.img: gzip compressed data, from Unix, last modified: Mon Oct 1 15:14:46 2012, max compression
# 在使用gunzip解壓縮前,先將檔案的副檔名改成.gz
mv initrd-2.6.18-274.el5.img initrd-2.6.18-274.el5.gz
gunzip initrd-2.6.18-274.el5.gz
cpio -i < initrd-2.6.18-274.el5
修改完initrd image的內容之後,再用cpio -o打包,並且用gzip壓縮起來。但是cpio的動作需要搭配find指令,所以這一串的動作可以用BASH pipeline的技巧完成。
find . | cpio --quiet -H newc -o | gzip -9 -n > /boot/initrd.img
以上的動作就是先透過find命令找出目錄下的所有(需要包進initrd image)檔案,丟給cpio打包,再經gzip壓縮成**/boot/initrd.img**,一氣呵成,乾淨俐落。
[系列文章]
我與BASH的每一天 - [1]利用bc命令來取得數字字串中的特定欄位值
我與BASH的每一天 - [2]直取字串變數中的特定欄位值
我與BASH的每一天 - [3] 利用awk來擷取特定欄位
我與BASH的每一天 - [4] 利用awk來擷取特定欄位-2
我與BASH的每一天 - [5] 利用awk來擷取特定欄位-3
我與BASH的每一天 - [6] 利用cut來擷取特定欄位
我與BASH的每一天 - [7] grep指令的妙用 - 1
我與BASH的每一天 - [8] grep指令的妙用 - 2
我與BASH的每一天 - [9] 正規化表示法 - 1
我與BASH的每一天 - [10] 正規化表示法 - 2
我與BASH的每一天 - [11] 正規化表示法 - 3
我與BASH的每一天 - [12] 正規化表示法 - 4
我與BASH的每一天 - [13] sed - 1
我與BASH的每一天 - [14] sed - 2
我與BASH的每一天 - [15] sed - 3
我與BASH的每一天 - [16] 多條件選擇 - case
我與BASH的每一天 - [17] 建立自動化的暫存檔 - mktemp
我與BASH的每一天 - [18] if 條件判斷的正規化用法
我與BASH的每一天 - [19] 複合式的條件判斷
我與BASH的每一天 - [20] 代表參數位置的特殊變數符號與shift
我與BASH的每一天 - [21] 特殊的參數變數符號: $@ 與 $*
我與BASH的每一天 - [22] while-loop與array的結合
我與BASH的每一天 - [23] 顯示程式執行的進度
我與BASH的每一天 - [24] 打包initrd image