Fra*_*anc 4 initrd linux-kernel
当 Linux 启动时,initrd
会安装基本的支持文件和内核模块,这些是帮助进一步启动过程所必需的。随后在 Linux 操作系统中rootfs
安装和initrd
卸载。我的问题是,如果initrd
已卸载,用户如何仍能看到 挂载的文件initrd
?
例如: 等中的一些/etc
文件/lib
。
\n\n随后,rootfs 被挂载,initrd 从 Linux 操作系统中卸载
\n
它并不完全是“卸载”的;大多数 Linux 发行版已经很多年没有使用可安装的 initrd 了。相反,他们使用“initramfs”,它是一个存档,被提取到最初安装在“/”的 RAM 文件系统 (tmpfs) 中。尽管仍然使用该initrd=
选项指定,但其行为与原始 initrd 机制完全不同。
\n\n我的问题是,当卸载 initrd 时,为什么目录 /etc、/lib、/bin、/usr、.. 及其内容仍然存在?
\n
因为从 initramfs 的角度来看,它们实际上并不是“/etc”或“/lib”。initramfs不会直接挂载“/” \xe2\x80\x93 initramfs本身是“/” \xe2\x80\x93 而是将真正的根文件系统挂载在“/mnt”或“/newroot”之类的位置,所以这些目录以“/newroot/lib”等开头。
\ninitramfs 完成的最后步骤之一是“pivot_root()”或“mount(MS_MOVE)”,该操作使“/newroot”成为新的“/”,本质上交换了两个挂载(旧的“/”) " 将 initramfs 移至子安装位置)。
\n从 initramfs 中解压出来的最小的“/bin”、“/etc”和“/lib”在此过程中会消失。
\n换句话说,这个过程大约是:
\n/
。/
,其中包含 /bin、/lib 等中的一些最小文件。/init
是initramfs的“核心”。/newroot
或类似的位置。此时,您的文件位于 /newroot/lib、/newroot/home 等。/newroot
使用/
以下两种方法之一:\n/sbin/init
.通常,initramfs /init 是一个简单的 shell 脚本(尽管并非总是如此;它甚至可能是 systemd 的完整副本)。您可以查看Arch mkinitcpio /init。这内部使用了“overlay using mount(MS_MOVE)”方法;请参见util-linux 中的switch_root。
\n