当linux启动时,initrd安装了基本的支持文件和内核模块,这是帮助进一步引导过程所必需的。稍后,rootfs被挂载,initrd从Linux中卸载。我的问题是,如果initrd是卸载的,用户如何仍然可以看到由initrd挂载的文件?
例句:/etc,/lib等的一些文件。
发布于 2023-04-01 09:01:04
稍后,rootfs被挂载,initrd从Linux操作系统中卸载。
它并不是完全“卸载”的;大多数Linux发行版多年来都没有使用可装入的initrd。相反,它们使用一个"initramfs“,它是一个归档文件,它被解压缩到最初安装在"/”的RAM文件系统(tmpfs)中。尽管它仍然是使用initrd=选项指定的,但它的行为与最初的initrd机制完全不同。
我的问题是initrd何时被卸载,为什么目录/etc,/lib,/bin,/usr,..。它们的内容还在吗?
因为从initramfs的角度来看,它们实际上不是"/etc“或"/lib”。initramfs不直接挂载"/“( initramfs本身是"/”),而是在"/mnt“或"/newroot”之类的地方挂载真正的根文件系统,因此这些目录以"/newroot/lib“开头。
initramfs完成的最后一步是"pivot_root()“或”MS_MOVE(MS_MOVE)“,该操作使"/newroot”成为新的"/",实质上是交换两个挂载(原来的"/“是将initramfs移到子挂载上)。
从initramfs解压缩的最小"/bin“、"/etc”和"/lib“在此过程中确实消失了。
换言之,这一进程大致是:
/上挂载一个空的tmpfs。/中,其中包含/bin、/lib等中的一些最小文件。/init,这是initramfs的“核心”。/newroot或类似的地方挂载真正的根文件系统。此时,您的文件位于/newroot/lib、/newroot/home,等等。/newroot转换为/:/sbin/init。initramfs /init通常是一个简单的shell脚本(但并不总是;它甚至可以是systemd的完整副本)。你可以看看Arch mkinitcpio /init。这在内部使用“覆盖使用挂载(MS_MOVE)”方法;例如,参见util中的交换机_根部。
https://unix.stackexchange.com/questions/741635
复制相似问题