1,313 瀏覽數

Linux – initrd

initrd – 必須在 Boot Loader “GRUB / LILO" 指定才會載入

initrd 主要的動作是先掛載系統必須的 modules 等.而載入 initrd 後會去執行 linuxrc (linuxrc 包在 initrd 檔裡面,下面會說明),我們先來看看 RedHat 安裝好後的 initrd 做些什麼.

[root@benjr ~]# ll /boot/*.img
-rw-r–r–     1   root   root  151233  Sep 6  20:27  initrd-2.4.20-8.img

先複製到 /root 下,改名稱為 .gz ,因為  initrd-2.4.20-8.img 檔是 gzip 壓縮過的檔案格式,所以要解壓縮.

[root@benjr ~]# cp /boot/initrd-2.4.20-8.img /root/initrd-2.4.20-8.img.gz
[root@benjr ~]# gunzip /root/initrd-2.4.20-8.img.gz

initrd 是影像檔,所以 mount 要加 -o loop 的參數

[root@benjr ~]# mount -o loop /root/initrd-2.4.20-8.img /mnt/tmp

Linux 2.6 核心採用新版的 initial RAM disks “initramfs" 有興趣的可以看下面連結所介紹的 http://blog.linux.org.tw/~jserv/archives/001954.html 壓法也些不同了所以要用下面的方式解開.

[root@benjr ~]# zcat initrd.img | cpio –div

壓縮的方式

[root@benjr ~]# find –type f | cpio –H newc –o | gzip -9 > ../initrd.img

現在可以看到 initrd 檔的內容

[root@benjr ~]# cd /mnt/tmp
[root@benjr ~]# ll
total 8
drwxr-xr-x    2 root     root         1024 Aug 12 02:45 bin
drwxr-xr-x    2 root     root         1024 Aug 12 02:45 dev
drwxr-xr-x    2 root     root         1024 Aug 12 02:45 etc
drwxr-xr-x    2 root     root         1024 Aug 12 02:45 lib
-rwxr-xr-x    1 root     root          829 Sep  6 20:26 linuxrc
drwxr-xr-x    2 root     root         1024 Aug 12 02:45 loopfs
drwxr-xr-x    2 root     root         1024 Aug 12 02:45 proc
lrwxrwxrwx    1 root     root            3 Aug 12 02:45 sbin -> bin
drwxr-xr-x    2 root     root         1024 Aug 12 02:45 sysroot

系統載入 initrd 時會先去執行 linuxrc 這個 script ,至於其他檔是做什麼的,請參考無磁碟系統.我們就來看看 linuxrc 寫了些什麼

[root@benjr ~]# cat linuxrc
#!/bin/nash
echo “Loading jbd.o module"
insmod /lib/jbd.o
echo “Loading ext3.o module"
insmod /lib/ext3.o
echo Mounting /proc filesystem
mount -t proc /proc /proc
echo Creating block devices
mkdevices /dev
echo Creating root device
mkrootdev /dev/root
echo 0×0100 > /proc/sys/kernel/real-root-dev
echo Mounting root filesystem
mount -o defaults –ro -t ext3 /dev/root /sysroot
pivot_root /sysroot /sysroot/initrd
umount /initrd/proc

這裡主要的動作是先掛載系統必須的 modules 等.

重新建立 initrd 檔

initrd 檔案主要是在開機時預先載入所需的模組,如硬碟的 HBA 卡的裝置,或是網路卡 HBA ,所以當我們硬體有所改變時就需要重新建立 initrd 檔.在重建 initrd 時系統會依據 /etc/modules.conf (2.4 kernel) 或是 /etc/modprobe.conf (2.6 kernel)檔來決定要上哪一些 modules.假如我們要系統載入時就載入 Intel ICH SATA H.D 的 module,我們就要在 /etc/modules.conf 加入這行

[root@benjr ~] # vi /etc/modprobe.conf
………………..略………………..
alias scsi_hostadapter2 ata_piix

使用指令 #mkinitrd 就可以重建 initrd

[root@benjr ~] # mkinitrd initrd-2.6.18-92.ELsmp.img 2.4.21-4.ELsmp

其中的參數

  1. initrd-2.6.18-92.ELsmp.img  這就是建立後的 initrd image 檔
  2. initrd-2.6.18-92.ELsmp 通常是目前核心的版本,可依據 /lib/modules/ 中 kernel-version 來決定核心,如果是要用現在目前的 kernel 可以直接始用 #uname -r 這個指令來獲取目前核心版本.
[root@benjr ~]# mkinitrd initrd-2.6.18-92.ELsmp.img `uname -r`

再來複製到 /boot 目錄下,開機時就會用這個 initrd 來預先載入所需的模組.

[root@benjr ~] # cp initrd-2.6.18-92.ELsmp.img   /boot/initrd-2.6.18-92.ELsmp.img

除了在 /etc/modprobe.conf 定義哪些模組需要載入,還可以在使用指令 #mkinitrd 時加入參數.

[root@benjr ~] # mkinitrd initrd-2.6.18-92.ELsmp.img `uname -r` –preload scsi_mode –with=qla2xxx

–preload scsi_mode –with=qla2xxx
主要是要載入 qla2xxx 模組,不過 qla2xxx 需要 scsi_mode 所以使用參數 –preload 在載入 qla2xxx 先行載入 scsi_mode 模組.

2 個網友的想法 “Linux – initrd

  1. 自動參照通知: 硬體裝置 | Benjr.tw

發表迴響