首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当initrd卸载时,由initrd挂载的目录中的文件会发生什么?

当initrd卸载时,由initrd挂载的目录中的文件会发生什么?
EN

Unix & Linux用户
提问于 2023-04-01 06:11:36
回答 1查看 239关注 0票数 4

当linux启动时,initrd安装了基本的支持文件和内核模块,这是帮助进一步引导过程所必需的。稍后,rootfs被挂载,initrd从Linux中卸载。我的问题是,如果initrd是卸载的,用户如何仍然可以看到由initrd挂载的文件?

例句:/etc/lib等的一些文件。

EN

回答 1

Unix & Linux用户

发布于 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“在此过程中确实消失了。

换言之,这一进程大致是:

  1. 内核在/上挂载一个空的tmpfs。
  2. 内核将initramfs.cpio存档解压缩到内存中的/中,其中包含/bin、/lib等中的一些最小文件。
  3. 内核运行/init,这是initramfs的“核心”。
  4. initramfs /init脚本从内核命令行读取"root=“(或使用其他方法),并在/newroot或类似的地方挂载真正的根文件系统。此时,您的文件位于/newroot/lib、/newroot/home,等等。
  5. initramfs可选择地在/newroot下挂载其他必需的东西,例如在"/newroot/run“处安装tmpfs,或者将基于NFS的/usr挂载为"/newroot/usr”。
  6. initramfs /init使用以下两种方法之一将/newroot转换为/
    • 它删除所有已解压缩到initramfs "/“中的文件,然后将"/newroot”挂载移到"/“上(覆盖当前空的tmpfs,该tmpfs将永远留在那里),并使用chroot()使其永久化--这是Arch的initramfs使用switch_root工具所做的;
    • 或者调用pivot_root()将initramfs /与/newroot“交换”,将后者转换为新的/,并将initramfs移动到类似于/run/initramfs之类的东西,然后可以卸载--不确定是否仍然使用此方法。

  7. 最后,既然"/“是真正的根,/init (仍然从内存中运行)执行真正的根文件系统的/sbin/init

initramfs /init通常是一个简单的shell脚本(但并不总是;它甚至可以是systemd的完整副本)。你可以看看Arch mkinitcpio /init。这在内部使用“覆盖使用挂载(MS_MOVE)”方法;例如,参见util中的交换机_根部

票数 7
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/741635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档