在Linux系統上開啟Initrd檔案系統的方法

來源:互聯網
上載者:User

initial RAM disk

Linux初始RAM磁碟(initrd)是在系統引導過程中掛載的一個臨時根檔案系統,用來支援兩階段的引導過程。initrd檔案中包含了各種可執行程式和驅動程式,它們可以用來掛載實際的根檔案系統,然後再將這個 initrd RAM磁碟卸載,並釋放記憶體。在很多嵌入式Linux系統中,initrd 就是最終的根檔案系統。本文將探索 Linux 2.6 的初始 RAM磁碟,包括如何建立以及如何在Linux核心中使用。
什麼是初始 RAM 磁碟

初始RAM磁碟(initrd)是在實際根檔案系統可用之前掛載到系統中的一個初始根檔案系統。initrd與核心綁定在一起,並作為核心引導過程的一部分進行載入。核心然後會將這個 initrd檔案作為其兩階段引導過程的一部分來載入模組,這樣才能稍後使用真正的檔案系統,並掛載實際的根檔案系統。
initrd 中包含了實現這個目標所需要的目錄和可執行程式的最小集合,例如將核心模組載入到核心中所使用的 insmod 工具。
在案頭或伺服器Linux 系統中,initrd 是一個臨時的檔案系統。其生存周期很短,只會用作到真實檔案系統的一個橋樑。在沒有存放裝置的嵌入式系統中,initrd 是永久的根檔案系統。本文將對這兩種情況進行探索。

Initrd開啟步驟

下面來看下如何開啟initrd,這裡我使用的是debian5作業系統

1.建立一個目錄,將/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 #發現該檔案是一個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發現解壓縮過後的檔案是一個cpid格式,是一種備份格式,使用cpio,參數'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時,並沒有任何系統的目錄架構,這時會先以initrd所提供的目錄當做是系統的暫時目錄.

其中有個lib目錄:裡面存放著許多的模組,即現在系統所有的模組,這代表目錄中所存放的模組都是開機所必須載入的模組.例如當kernel載入Initrd之後,initrd將會加相應的網路模組驅動,以便讓我們進入作業系統能夠識別到網卡.

代碼如下:
root@192.168.30.68:initrd# lsmod | grep bnx2 #本機網路驅動
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

假如臨時又添加了一塊最新的網卡,希望在開機時載入,這時只要修改initrd檔案的內容在打個包就可以了,比起重新編譯kernel或者安裝作業系統要方便多了.

下面介紹如何讓將修改後的initrd檔案再重新打包起來.

1.在修改後的檔案目錄下,使用find將所有的檔案列出來,再通過pipeline,把所有清單交給cpio指令.cpio用到的參數'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/下.重啟機器生效.

此外在initrd被kernel載入後的開機流程,是依照initrd檔案中的一個init檔案,由它所提供的指令碼一步一步往下做,包括實體硬碟載入實際的作業系統也是由這個檔案提供的.

代碼如下:
root@192.168.30.68:initrd# ls
bin conf etc init lib lib64 sbin scripts
root@192.168.30.68:initrd# cat init
#!/bin/sh

代碼如下:

echo "Loading, please wait..."

代碼如下:

[ -d /dev ] || mkdir -m 0755 /dev
[ -d /root ] || mkdir -m 0700 /root
[ -d /sys ] || mkdir /sys
[ -d /proc ] || mkdir /proc
[ -d /tmp ] || mkdir /tmp
mkdir -p /var/lock
mount -t sysfs -o nodev,noexec,nosuid none /sys
mount -t proc -o nodev,noexec,nosuid none /proc

代碼如下:

# Note that this only becomes /dev on the real filesystem if udev's scripts
# are used; which they will be, but it's worth pointing out
tmpfs_size="10M"
if [ -e /etc/udev/udev.conf ]; then
. /etc/udev/udev.conf
fi
mount -t tmpfs -o size=$tmpfs_size,mode=0755 udev /dev
[ -e /dev/console ] || mknod -m 0600 /dev/console c 5 1
[ -e /dev/null ] || mknod /dev/null c 1 3
> /dev/.initramfs-tools
mkdir /dev/.initramfs

代碼如下:

# Export the dpkg architecture
export DPKG_ARCH=
. /conf/arch.conf

代碼如下:

# Set modprobe env
export MODPROBE_OPTIONS="-qb"

代碼如下:

# Export relevant variables
export ROOT=
export ROOTDELAY=
export ROOTFLAGS=
export ROOTFSTYPE=
export break=
export init=/sbin/init
export quiet=n
export readonly=y
.....

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.