歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux 初始 RAM 磁盤(initrd)概述

Linux 初始 RAM 磁盤(initrd)概述

日期:2017/2/28 16:12:01   编辑:Linux教程

學習 initrd 的剖析、創建以及在 Linux 引導過程中的用法

簡介: 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 映像中包含了支持 Linux 系統兩階段引導過程所需要的必要可執行程序和系統文件。

根據我們運行的 Linux 的版本不同,創建初始 RAM 磁盤的方法也可能會有所不同。在 Fedora Core 3 之前,initrd 是使用 loop 設備 來構建的。loop 設備 是一個設備驅動程序,利用它可以將文件作為一個塊設備掛載到系統中,然後就可以查看這個文件系統中的內容了。在您的內核中可能並沒有 loop 設備,不過這可以通過內核配置工具(make menuconfig)選擇 Device Drivers > Block Devices > Loopback Device Support 來啟用。我們可以按照下面的方法來查看 loop 設備的內容(initrd 文件的名字可能會稍有不同):


清單 1. 查看 initrd 的內容(適用於 FC3 之前的版本)

# mkdir temp ; cd temp
# cp /boot/initrd.img.gz .
# gunzip initrd.img.gz
# mount -t ext -o loop initrd.img /mnt/initrd
# ls -la /mnt/initrd
#

現在我們就可以查看 /mnt/initrd 子目錄中的內容了,這就代表了 initrd 文件的內容。注意,即使您的 initrd 映像文件不是以 .gz 結尾,它也可能是一個壓縮文件,您可以給這個文件添加上 .gz 後綴,然後再使用 gunzip 對其進行解壓。

從 Fedora Core 3 開始,默認的 initrd 映像變成了一個經過壓縮的 cpio 歸檔文件。我們不用再使用 loop 設備來將 initrd 作為壓縮映像進行掛載,而是可以將其作為 cpio 歸檔文件來使用。要查看 cpio 歸檔文件的內容,可以使用下面的命令:

清單 2. 查看 initrd 的內容(適用於 FC3 及其以後的版本)

# mkdir temp ; cd temp
# cp /boot/initrd-2.6.14.2.img initrd-2.6.14.2.img.gz
# gunzip initrd-2.6.14.2.img.gz
# cpio -i --make-directories < initrd-2.6.14.2.img
#

結果會生成一個很小的根文件系統,如清單 3 所示。在 ./bin 目錄中有一組很少但卻非常必要的應用程序,包括 nash(即 not a shell,是一個腳本解釋器)、insmod(用來加載內核模塊)和 lvm(邏輯卷管理工具)。


清單 3. 默認的 Linux initrd 目錄結構

# ls -la
#
drwxr-xr-x  10 root root    4096 May 7 02:48 .
drwxr-x---  15 root root    4096 May 7 00:54 ..
drwxr-xr-x  2  root root    4096 May 7 02:48 bin
drwxr-xr-x  2  root root    4096 May 7 02:48 dev
drwxr-xr-x  4  root root    4096 May 7 02:48 etc
-rwxr-xr-x  1  root root     812 May 7 02:48 init
-rw-r--r--  1  root root 1723392 May 7 02:45 initrd-2.6.14.2.img
drwxr-xr-x  2  root root    4096 May 7 02:48 lib
drwxr-xr-x  2  root root    4096 May 7 02:48 loopfs
drwxr-xr-x  2  root root    4096 May 7 02:48 proc
lrwxrwxrwx  1  root root       3 May 7 02:48 sbin -> bin
drwxr-xr-x  2  root root    4096 May 7 02:48 sys
drwxr-xr-x  2  root root    4096 May 7 02:48 sysroot
#

清單 3 中比較有趣的是 init 文件就在根目錄中。與傳統的 Linux 引導過程類似,這個文件也是在將 initrd 映像解壓到 RAM 磁盤中時被調用的。在本文稍後我們將來探索這個問題。

Copyright © Linux教程網 All Rights Reserved