|
initrd 全称是 initial ramdisk,它的作用相当于内核到文件系统之间的一个桥梁,如下图所示:
如上图,在 GRUB 加载内核时,内核会在内存中创建一个 rootfs,接着内核将 initrd mount 到 rootfs 上。 接着,系统按照 initrd 中的脚本依次加载各驱动程序,最后进入实际的文件系统。
一般的,在 /boot 中能够找到 initrd ,如: $ ls /boot/
config-2.6.26-2-686 initrd.img-2.6.26-2-686 System.map-2.6.26-2-686
grub vmlinuz-2.6.26-2-686 用 file 命令看一下 initrd 文件的类型:
$ file /boot/initrd.img-2.6.26-2-686
/boot/initrd.img-2.6.26-2-686: gzip compressed data, from Unix, last modified: Sun Oct 31 16:19:26 2010 由此可见,initrd 原来是个 gzip 压缩文件。现在拷贝一份 initrd 到另外的目录,然后将其后缀名改为 gzip :
$ mv initrd.img-2.6.26-2-686 initrd.img-2.6.26-2-686.gz 接着,解压缩它:
$ gunzip initrd.img-2.6.26-2-686.gz
$ ls
initrd.img-2.6.26-2-686 再用 file 查看一下解压缩后的文件属性:
$ file initrd.img-2.6.26-2-686
initrd.img-2.6.26-2-686: ASCII cpio archive (SVR4 with no CRC) 现在文件是 cpio 格式了。cpio 是一种备份格式。那现在就用 cpio 命令将文件还原:[email=beyes@debian:~/initrd$]beyes@debian:~/initrd$[/email] cpio -id < initrd.img-2.6.26-2-686
29214 blocks
[email=beyes@debian:~/initrd$]beyes@debian:~/initrd$[/email] ls
bin conf etc init initrd.img-2.6.26-2-686 lib sbin scripts 上面除了 initrd.img-2.6.26-2-686 外,都是还原出来的文件。另外,在 cpio 命令中,i 选项表示“解压缩”,d 选项表示“在需要时自动建立第一层目录”。
initrd 文件被还原后,根据发行版的不同,还原出来的目录结构和文件会有些许的不一样。但是里面一定会包含着许多的驱动模块,比如在 Debian 里会看到:$ ls lib/modules/2.6.26-2-686/kernel/drivers/
acpi block ide message net scsi usb
ata cdrom ieee1394 misc parport ssb video
base hid input mmc pcmcia thermal virtio 从上面的输出看到,探寻 lib 目录下的 drivers 目录,会发现底下有许多驱动程序目录,各个目录下所存放的模块都是开机时必须加载的模块。之所以把开机的模块放在 initrd 里,而不是直接在 kernel 里,那是因为设备是会越来越多的,相应的驱动也会越来越多,如果都将这些驱动都放在内核里,那就造成内核越来越大,那显然不是个法子。
如果在启动后系统找不到 initrd ,那么会导致 kernel panic 无法启动系统,原因可能是因为系统无法找到你的硬盘驱动程序。 |
|