「Linux Kernel」- initrd(initial ram disk),initramfs(initial RAM file system)

问题描述

该笔记将记录:与 initrd、initramfs 相关的内容。

解决方案

技术的诞生是为了解决问题。

如果把所有的内核模块(驱动)都编译到内核中,将增加内核的大小,载入时将消耗等多内存,加载速度变慢,设置还会出现其他不确定性问题。

还有很多更复杂的场景,比如需要从 Software RAID、LVM、NFS 中加载系统盘,这些特殊情况如果都加到内核中,对内核来说将是场灾难。

initrd, inital ram disk

initrd,为此而生

它是个文件系统,很多发行版使用 ext2 格式,
其中包含各种内核模块及某些特殊功能代码;
Bootloader 将其加载到内存,Kernel 将其解压到内存中,并将其作为文件系统挂载,以从中获取或执行必要文件。
Kernel 为了识别 initrd 这个文件系统,需要相关的驱动(中间文件系统驱动)。

查看 initrd 内容:linux – Why is it that my initrd only has one directory, namely, ‘kernel’? – Unix & Linux Stack Exchange

initramfs, initial RAM file system

initramfs,initial RAM file system,是 initrd(Initial Ramdisk)的接替者,since Kernel 2.5.46(自 Linux 2.6.13 起可用)。

这个镜像包含初始文件系统,是经过 gzip 的 cpio 归档(可选压缩),其中包含在启动时所有必要硬件的内核模块、初始化脚本、块驱动等等等等。
initramfs 包含在内核镜像(vmlinuz)中,Kernel 将归档文件解压到特殊的 tmpfs 实例中,该实例成为初始 root file system。

对比 initrd 方式,该方式的优点:
1)不需要将中间文件系统驱动编译到内核:initramfs 是 CPIO 格式,直接解压到在 tmpfs 上,而 tmpfs 在内核上,不需要单独文件系统驱动来访问。
2)不需要将块驱动编译到内核:其实当 Kernel 加载到内存并开始运行后,操作系统便已开始运行。至于运行应用程序服务,那是用户空间的事情,也就说从 HDD 还是 NFS 启动那是用户空间的工作,由用户空间自行实现即可,内核不再关心这些块驱动。

在 RHEL 7 中,initramfs 包含自身可用的整个系统。dracut,用来创建 initramfs 镜像。lsinitrd,用来查看 initramfs 镜像。

补充说明

出于历史原因,虽然很多 Linux 发行版中能够看到 initrd,但是它们实际上多少是 initramfs

参考文献

CentOS / RHEL 7 : Booting process – The Geek Diary
cpio – Wikipedia
Documentation/filesystems/ramfs-rootfs-initramfs.txt
Documentation/initrd.txt
dracut (software) – Wikipedia
Initial ramdisk – Wikipedia
Initramfs arrives [LWN.net]
Linux startup process – Wikipedia
linux – The difference between initrd and initramfs? – Stack Overflow
The Kernel Newbie Corner: “initrd” and “initramfs”-What’s Up With That? – Linux.com