2009年12月8日

initrd

從之前提到的開機程序得知,grub會載入kernel,接著kernel會載入initrd這個檔案,在過去2.4他可能是個image file,或者現在的壓縮檔案
kernel會在記憶體中開啟一塊rootfs空間,再把initrd mount在這rootfs上,initrd會去載入一些kernel
事先沒有載入的檔案,比方說硬碟的驅動程式
initrd會建立一些目錄架構,跟著也會建立/dev,他用來存放設備檔案,/lib目錄用以存放一些module,接著還會載入很重要的init
如果有一些關於module的觀念就會知道,module可以藉由modprobe來載入,可是一般modprobe的時機是在作業系統載入之後,如果必須要在開機的時候就用到的還是必須修改initrd來達成

Fedora
在fedora自行製作initrd使用mkinitrd指令,如果預設使用mkinitrd,將會依照/etc/modprobe.conf (2.4使用/etc/modules.conf)去搜尋module,由/etc/fstab決定要掛載的directory

再使用mkinitrd之前必須確定,modules已經放到/lib/modules底下正確的位置
mkinitrd --with=ntfs initrd_new.img 2.6.18-1.2798.fc6
cp initrd_new.img /boot
vim /boot/grub/grub.conf
其實最後一步驟是修改grub的設定,將載入的initrd變成我們編譯出來的檔案,grub2或許會有些不同

Ubuntu
ubuntu早期也是使用mkinitrd,目前已經取代為initrd-tools內的工具,工具程式為mkinitramfs,將要載入的modules放到/lib/modules相對應的位置(依照kernel版本位置不大一樣),然後將要載入的module名稱增加到/etc/initramfs-tools/modules內,其他設定在/etc/initramfs-tools/initramfs.conf內最後執行
mkinitramfs -o /boot/initrd.img-2.6.12-9-386 /lib modules/2.6.12-9-386
剩下就是拷貝initrd到/boot下跟修改grub設定
可以參考範例

沒有留言: