歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux服務器 >> 在Linux系統上開啟Initrd文件系統的方法

在Linux系統上開啟Initrd文件系統的方法

日期:2017/3/2 16:25:47   编辑:Linux服務器

  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 復制到該目錄下.

  代碼如下:

  [email protected]:tmp# mkdir initrd

  [email protected]:tmp# cd initrd/

  [email protected]:initrd# ls

  [email protected]:initrd# cp /boot/initrd.img-2.6.18-6-amd64 .

  [email protected]:initrd# ls

  initrd.img-2.6.18-6-amd64

  2.將initrd文件名改為.gz文件,將其解壓縮.

  代碼如下:

  [email protected]: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

  [email protected]:initrd# mv initrd.img-2.6.18-6-amd64 initrd.img-2.6.18-6-amd64.gz

  [email protected]: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

  [email protected]:initrd# gunzip initrd.img-2.6.18-6-amd64.gz

  3.使用file發現解壓縮過後的文件是一個cpid格式,是一種備份格式,使用cpio,參數'i' 代表解包 與'd' 代表在需要時自動建立第一層目錄.

  代碼如下:

  [email protected]:initrd# file initrd.img-2.6.18-6-amd64

  initrd.img-2.6.18-6-amd64: ASCII cpio archive (SVR4 with no CRC)

  [email protected]:initrd# cpio -id < initrd.img-2.6.18-6-amd64

  32912 blocks

  [email protected]:initrd# ls

  bin conf etc init initrd.img-2.6.18-6-amd64 lib lib64 sbin scripts

  [email protected]:initrd# rm initrd.img-2.6.18-6-amd64

  rm: remove regular file `initrd.img-2.6.18-6-amd64'? y

  [email protected]:initrd# ls

  bin conf etc init lib lib64 sbin scripts

  也可以直接通過zcat讀取gzip格式的文件,再將讀出來的結果由pipeline交給cpio解開

  代碼如下:

  [email protected]:initrd# zcat initrd.img-2.6.18-6-amd64 | cpio -id

  32912 blocks

  [email protected]: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將會加相應的網絡模塊驅動,以便讓我們進入操作系統能夠識別到網卡.

  代碼如下:

  [email protected]:initrd# lsmod | grep bnx2 #本機網絡驅動

  bnx2 183048 0

  [email protected]: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),使用'>'導出.

  代碼如下:

  [email protected]:initrd# ls

  bin conf etc init lib lib64 sbin scripts

  [email protected]:initrd# find | cpio -co | gzip -9 > initrd.img-2.6.18-6-amd64

  32884 blocks

  [email protected]:initrd# ls

  bin conf etc init initrd.img-2.6.18-6-amd64 lib lib64 sbin scripts

  [email protected]: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文件,由它所提供的腳本一步一步往下做,包括實體硬盤加載實際的操作系統也是由這個文件提供的.

  代碼如下:

  [email protected]:initrd# ls

  bin conf etc init lib lib64 sbin scripts

  [email protected]: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

  .....

Copyright © Linux教程網 All Rights Reserved