initrd 和 initramfs

原文:https://www.linux.com/learn/linux-training/92607-the-kernel-newbie-corner-qinitrdq-and-qinitramfsq-whats-up-with-that

initrd:initial ramdisk

initramfs:initial ram filesystem

    这两个东西都是我们经常会用到的,尽管我们平时可能没太注意。以前我也没在意过这两个究竟是干嘛的,甚至一度以为他们就是一个东西……委屈 后来有一次用到了,才越来越发现这两个是需要知道的。

    首先,initrd 和 initramfs肯定是两个不同的东西,但他们的作用几乎是一样的:都是在系统启动的初期,为系统提供一个早期的根文件系统。这个早期的根文件系统功能很局限,它仅仅是为了能在内核启动的过程中,为内核提供一些驱动之类的东西,使系统能顺利运行(比如说硬件 RAID 控制器,网络,NFS 等)。

    以上的整个过程是:bootloader 把控制权连同“initrd”一起移交给内核,内核挂载上“initrd”,并从中得到需要的东西,最后内核用真正的根文件系统替代掉“initrd”。


initrd

    在grub的配置文件中,我们经常看到这样的启动信息:

title  Arch Linux
root   (hd0,2)
kernel /boot/vmlinuz26 root=/dev/sda3 ro
initrd /boot/kernel26.img
    这里的kernel26.img(很多其他的发行版是 initrd-x.x.xx.img 或者 initrd.gz)就是我的系统启动所用到的initrd。以前,这种文件通常是一个ext2格式的文件系统的压缩文件。现在这种文件通常是一个cpio格式的文件,然后再压缩成.gz的格式。我们可以解压来看看里边有什么东西:

# cp /boot/kernel26.img /tmp
# cd /tmp
# mv kernel26.img kernel26.gz
# gunzip kernel26.gz
# cpio -idmv < kernel26
... ...
# ls
bin  config  dev  etc  hooks  init  init_functions  kernel26  lib  new_root  proc  run  sbin  sys  test  tmp  usr  VERSION
    实际上这是一个简单的文件系统。通常我们在安装好一个新的内核以后,会自动产生一个匹配的 initrd 文件。当然,我们也可以用 mkinitrd 命令来生成一个。也可以自己从系统中复制或者新建一些关键的文件自己用 cpio 做一个,也可以直接用 busybox 生成一个文件系统,然后压缩。


initramfs

    initramfs是需要编到内核中的一种根文件系统。我们在编内核的时候,可以通过 Initramfs source file(s) 来设置需要编入内核的文件系统的路径。

General setup --->
[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
()    Initramfs source file(s)

    如果编内核的时候选上了 Initial RAM filesystem and RAM disk (initramfs/initrd) support 这一项,而没有指定 initramfs 的路径,那么内核会自动生成一个默认的 initramfs。 我们可以读一下内核 shell 脚本 scripts/gen_initramfs_list.sh,可以发现这个默认的 initramfs 是怎么生成的。

default_initramfs() {
     cat <<-EOF >> ${output}
         # This is a very simple, default initramfs

         dir /dev 0755 0 0
         nod /dev/console 0600 0 0 c 5 1
         dir /root 0700 0 0
         # file /kinit usr/kinit/kinit 0755 0 0
         # slink /init kinit 0755 0 0
     EOF
 }
    这个默认的 initramfs 包含两个文件:/root 目录和 /dev/console 设备文件。

你可能感兴趣的:(shell,网络,脚本,File,disk,output)