initial RAM disk
Linux初始RAM磁盤(initrd)是在系統(tǒng)引導過程中掛載的一個臨時根文件系統(tǒng),用來支持兩階段的引導過程。initrd文件中包含了各種可執(zhí)行程序和驅(qū)動程序,它們可以用來掛載實際的根文件系統(tǒng),然后再將這個 initrd RAM磁盤卸載,并釋放內(nèi)存。在很多嵌入式Linux系統(tǒng)中,initrd 就是最終的根文件系統(tǒng)。本文將探索 Linux 2.6 的初始 RAM磁盤,包括如何創(chuàng)建以及如何在Linux內(nèi)核中使用。
什么是初始 RAM 磁盤
初始RAM磁盤(initrd)是在實際根文件系統(tǒng)可用之前掛載到系統(tǒng)中的一個初始根文件系統(tǒng)。initrd與內(nèi)核綁定在一起,并作為內(nèi)核引導過程的一部分進行加載。內(nèi)核然后會將這個 initrd文件作為其兩階段引導過程的一部分來加載模塊,這樣才能稍后使用真正的文件系統(tǒng),并掛載實際的根文件系統(tǒng)。
initrd 中包含了實現(xiàn)這個目標所需要的目錄和可執(zhí)行程序的最小集合,例如將內(nèi)核模塊加載到內(nèi)核中所使用的 insmod 工具。
在桌面或服務器Linux 系統(tǒng)中,initrd 是一個臨時的文件系統(tǒng)。其生存周期很短,只會用作到真實文件系統(tǒng)的一個橋梁。在沒有存儲設備的嵌入式系統(tǒng)中,initrd 是永久的根文件系統(tǒng)。本文將對這兩種情況進行探索。
Initrd開啟步驟
下面來看下如何打開initrd,這里我使用的是debian5操作系統(tǒng)
1.創(chuàng)建一個目錄,將/boot/initrd.img-2.6.18-6-amd64 復制到該目錄下.
代碼如下:
root@192.168.30.68:tmp# mkdir initrd
root@192.168.30.68:tmp# cd initrd/
root@192.168.30.68:initrd# ls
root@192.168.30.68:initrd# cp /boot/initrd.img-2.6.18-6-amd64 .
root@192.168.30.68:initrd# ls
initrd.img-2.6.18-6-amd64
2.將initrd文件名改為.gz文件,將其解壓縮.
代碼如下:
root@192.168.30.68:initrd# file initrd.img-2.6.18-6-amd64 #發(fā)現(xiàn)該文件是一個gzip壓縮過的文件
initrd.img-2.6.18-6-amd64: gzip compressed data, from Unix, last modified: Thu Sep 24 18:21:40 2009
root@192.168.30.68:initrd# mv initrd.img-2.6.18-6-amd64 initrd.img-2.6.18-6-amd64.gz
root@192.168.30.68:initrd# file initrd.img-2.6.18-6-amd64.gz
initrd.img-2.6.18-6-amd64.gz: gzip compressed data, from Unix, last modified: Thu Sep 24 18:21:40 2009
root@192.168.30.68:initrd# gunzip initrd.img-2.6.18-6-amd64.gz
3.使用file發(fā)現(xiàn)解壓縮過后的文件是一個cpid格式,是一種備份格式,使用cpio,參數(shù)'i' 代表解包 與'd' 代表在需要時自動建立第一層目錄.
代碼如下:
root@192.168.30.68:initrd# file initrd.img-2.6.18-6-amd64
initrd.img-2.6.18-6-amd64: ASCII cpio archive (SVR4 with no CRC)
root@192.168.30.68:initrd# cpio -id < initrd.img-2.6.18-6-amd64
32912 blocks
root@192.168.30.68:initrd# ls
bin conf etc init initrd.img-2.6.18-6-amd64 lib lib64 sbin scripts
root@192.168.30.68:initrd# rm initrd.img-2.6.18-6-amd64
rm: remove regular file `initrd.img-2.6.18-6-amd64'? y
root@192.168.30.68:initrd# ls
bin conf etc init lib lib64 sbin scripts
也可以直接通過zcat讀取gzip格式的文件,再將讀出來的結果由pipeline交給cpio解開
代碼如下:
root@192.168.30.68:initrd# zcat initrd.img-2.6.18-6-amd64 | cpio -id
32912 blocks
root@192.168.30.68:initrd# ls
bin conf etc init initrd.img-2.6.18-6-amd64 lib lib64 sbin scripts
以上就是initrd文件打開后的目錄架構,當kernel啟動加載initrd時,并沒有任何系統(tǒng)的目錄架構,這時會先以initrd所提供的目錄當做是系統(tǒng)的暫時目錄.
其中有個lib目錄:里面存放著許多的模塊,即現(xiàn)在系統(tǒng)所有的模塊,這代表目錄中所存放的模塊都是開機所必須加載的模塊.例如當kernel加載Initrd之后,initrd將會加相應的網(wǎng)絡模塊驅(qū)動,以便讓我們進入操作系統(tǒng)能夠識別到網(wǎng)卡.
代碼如下:
root@192.168.30.68:initrd# lsmod | grep bnx2 #本機網(wǎng)絡驅(qū)動
bnx2 183048 0
root@192.168.30.68:initrd# find . -name 'bnx2*' #initrd里bnx2對應的模塊
./lib/modules/2.6.18-6-amd64/kernel/drivers/net/bnx2.ko
./lib/firmware/bnx2-09-4.0.5.fw
./lib/firmware/bnx2-06-4.0.5.fw
假如臨時又添加了一塊最新的網(wǎng)卡,希望在開機時加載,這時只要修改initrd文件的內(nèi)容在打個包就可以了,比起重新編譯kernel或者安裝操作系統(tǒng)要方便多了.
下面介紹如何讓將修改后的initrd文件再重新打包起來.
1.在修改后的文件目錄下,使用find將所有的文件列出來,再通過pipeline,把所有清單交給cpio指令.cpio用到的參數(shù)'c'代表用新的SVR4可移植格式.'o'代表建立文件.最后用gzip以最佳的壓縮效率'-9'壓縮(默認是-6),使用'>'導出.
代碼如下:
root@192.168.30.68:initrd# ls
bin conf etc init lib lib64 sbin scripts
root@192.168.30.68:initrd# find | cpio -co | gzip -9 > initrd.img-2.6.18-6-amd64
32884 blocks
root@192.168.30.68:initrd# ls
bin conf etc init initrd.img-2.6.18-6-amd64 lib lib64 sbin scripts
root@192.168.30.68:initrd# file initrd.img-2.6.18-6-amd64
initrd.img-2.6.18-6-amd64: gzip compressed data, from Unix, last modified: Tue May 14 13:50:26 2013, max compression
2.將該文件copy到/boot/下.重啟機器生效.