一、/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