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
其中的參數
- initrd-2.6.18-92.ELsmp.img 這就是建立後的 initrd image 檔
- 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 模組.
在 RHEL 6 下面我找不到 /etc/modprobe.conf 這個檔案這是怎麼一回事呢!!RHEL6 採用新的方式 dracut 請自行參考 http://benjr.tw/10594