initrd

bootloader會在開機時載入kernel跟initrd, 如果可以對initrd做修改, 就可以控制開機時的行為.

 initrd現在多用cpio封裝.

cpio是一種將檔案封裝的方法, 可以封裝當然也可以解開封裝.

封裝的方法是 find . | cpio –quiet -H newc -o | gzip -9 -n > imagefile.img

用 find . 的原因是要把子目錄全部東西都放進去.

-H的意思是 Use given archive FORMAT

FORMAT有以下幾種(參見http://www.gnu.org/software/cpio/manual/cpio.html)

Use archive format format. The valid formats are listed below with file size limits for individual files in parentheses; the same names are also recognized in all-caps. The default in copy-in mode is to automatically detect the archive format, and in copy-out mode is ‘bin’.
‘bin’
The obsolete binary format. (2147483647 bytes)
‘odc’
The old (POSIX.1) portable format. (8589934591 bytes)
‘newc’
The new (SVR4) portable format, which supports file systems having more than 65536 i-nodes. (4294967295 bytes)
‘crc’
The new (SVR4) portable format with a checksum added.
‘tar’
The old tar format. (8589934591 bytes)
‘ustar’
The POSIX.1 tar format. Also recognizes GNU tar archives, which are similar but not identical. (8589934591 bytes)
‘hpbin’
The obsolete binary format used by HPUX’s cpio (which stores device files differently).
‘hpodc’
The portable format used by HPUX’s cpio (which stores device files differently).

-o的意思是 Create the archive (run in copy-out mode)

–quiet的意思是 Do not print the number of blocks copied

 

gzip的部份,

-9 表示最佳壓縮,

-n 表示do not save or restore the original name and time stamp.

 

也就是先由cpio 進行封裝, 再由gzip進行壓縮.

解開封裝的時候, 指令如下:

gunzip -dc imagefile.img | cpio -idm

-dc的意思是decompress與write on standard output, keep original files unchanged.

cpio的-idm則是

-i是extract files from an archive (run in copy-in mode)

-d是create leading directories where needed

-m是 Retain previous file modification times when creating files

由gzip解壓之後是cpio的封裝檔, 再由cpio進行解封裝的動作.

 

使用Ubuntu 12.04.3 LTS 來做實驗

1

可以發現image檔案 initrd.img-3.8.0-29-generic解開後變成一堆目錄跟一個可執行的init檔.

為什麼知道是這個檔案呢? 到 /boot/grub/grub.cfg 找 menuentry, 會看到開機選單的選項, 預設值是第0個, 這要看你的grub.cfg才知道有沒有改過, 沒改過就是0. 看一下就會看到

initrd /boot/initrd.img-3.8.0-29-generic

1

來看看解開後的init檔案內容:

參見http://linux.cn/home-space-uid-5312-do-blog-id-772.html 對相關變數的說明:

  1. break       由 maybe_break 函數使用。若 break 的值跟 maybe_break 的参数相同, maybe_break函數會呼叫 panic 函數, panic 函數和 panic 變量是不同的東西, 不要誤會。 如果 panic 變數的內容是字串”0″,則 panic函數會把電腦重新啟動。
  2.     init        此變數指定在這個script最後要執行的東西。 /sbin/init 是系统上所有程序的父程序.
  3.     quiet     若不是”y”,就會顯示一些開機訊息。
  4.     rootmnt     最後進入系統後, 根目錄要掛在哪個分割區。
  5.     readonly    如果這個變數的內容是字串”y”, 就會在掛載 roomnt 指定分割區時, 用唯讀的方式掛載
  6.     debug       debug mode
  7.     cryptopts   不知道
  8.     ROOTDELAY   在 mountroot 函數中使用,root設備在ROOTDELAY所指定的秒數內必須準備好, 否則mountroot會呼叫panic把電腦重開機. 預設值是180秒。
  9.     panic       見break参數說明。

 

開機的時候, 資料夾跟開機後不一樣, 東西是放在{rootmnt}底下.

像是dev會放在${rootmnt}/dev

 

參考資料

http://kezeodsnx.pixnet.net/blog/post/25371285-%E6%88%91%E4%B9%9F%E4%BE%86%E5%AF%ABinitrd

http://blog.linux.org.tw/~jserv/archives/001954.html

http://linux.cn/home-space-uid-5312-do-blog-view-me.html

http://unixboy.iteye.com/blog/157717

Leave a Reply

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *