一、/boot/initrd
initrd(initial ramdisk)是一个在Linux启动过程中内核使用的临时文件系统。该文件系统为挂载真正的文件系统做准备。要想看看里面都是什么东西,可以进行下面的操作:
# mkdir ~/initrd
# cp /boot/initrd ~/initrd
# cd ~/initrd
# mv initrd initrd.gz
# gunzip initrd.gz
# cpio -idmv < initrd
可以看出该文件系统首先用cpio压缩归档,再用gzip压缩。
Linux内核可以将设备
驱动以模块形式加载,但是模块本身可能存储在SCSI或者RADI上,要想访问这些设备又需要先加载驱动,这就出现了“鸡和蛋”问题。当然不用模块,全部编译进内核,就像早期Linux那样,就不会出现这个问题了。initrd的引入可以使我们既得到模块带来的好处又解决上述问题。initrd在grub引导时通过BIOS载入内存。initrd除了内核模块外,还有引导系统的bash脚本。
/sbin/installkernel中有这么几行,在编译完内核后重新制作initrd。其实编译完内核后不更新initrd也是可以的。要想知道怎么制作的initrd,可以看看bash脚本/sbin/mkinitrd。如果没有这两个命令,确认是否安装了mkinitrd软件包。
#
# Generate initial ramdisk
#
if [ -x /sbin/mkinitrd -a -d /lib/modules/$KERNEL_VERSION ]; then
/sbin/mkinitrd -k $BOOTFILE-$KERNEL_VERSION \
-i initrd-$KERNEL_VERSION \
-b $INSTALL_PATH
else
echo "You may need to create an initial ramdisk now."
fi
二、/boot/vmlinuz
静态链接的内核可执行文件,如果用源代码编译内核,对应文件是/usr/src/linux/arch/i386/boot/bzImage
三、/boot/System.map
该文件由命令nm /boot/vmlinuz得到,不过是经过处理的。重新编译新内核后,该文件需要更新,如果有多个内核的话,加上相应的版本号。如果/boot/System.map和系统不符,内核会使用/usr/src/linux/System.map。该文件是内核地址和变量名,函数名的对应。该文件在调试内核时很有帮助。
四、/boot/grub/menu.lst
default 0
timeout 5
title=Gentoo
root (hd0,2)
kernel /boot/kernel root=/dev/hda5 vga=791
initrd /boot/initrd
title=Windows
rootnoverify (hd0,0)
makeactive
chainloader +1
root (hd0,2)和root=/dev/hda5中的root是不一样的。但是如果没有给/boot单独划一个分区,那么他们是一样的。当然我们也可以不要root (hd0,2)这一行,不过就需要改成这个样子了。
kernel (hd0,2)/boot/kernel root=/dev/hda5 vga=791
initrd (hd0,2)/boot/initrd
五、/boot/grub/device.map
(hd0) /dev/hda
grub使用的设备名称和Linux的不太一样,这是一张映射表。
(hd0,2)对应/dev/hda3;(hd0,4)对应/dev/hda5