Linux 中的根文件系统可以卸载吗?

Linux 中的根文件系统可以卸载吗?

我这里不谈rootfs。如果Linux中只有一个进程在运行,其工作目录为/,那么可以卸载吗?会rootfs剩下什么?如果无法卸载,那么是否可以rootfs挂载该类型的文件系统?

答案1

首先,您需要知道rootfs实际是什么。

Linux内核源代码的文档:

什么是 rootfs?

Rootfs 是 ramfs(或 tmpfs,如果启用的话)的一个特殊实例,它始终存在于 2.6 系统中。您无法卸载 rootfs 的原因与您无法终止 init 进程的原因大致相同;内核不必使用特殊的代码来检查和处理空列表,而是更小、更简单地确保某些列表不会变空。

大多数系统只是在 rootfs 上挂载另一个文件系统并忽略它。 ramfs 的空实例占用的空间量很小。

如果启用 CONFIG_TMPFS,rootfs 将默认使用 tmpfs 而不是 ramfs。要强制使用 ramfs,请将“rootfstype=ramfs”添加到内核命令行。

因此,rootfs不是真正的文件系统类型:它最初可能是 或 的实例ramfstmpfs具体取决于内核配置。但是,一旦 initramfs 完成其工作,rootfs本质上就成为一个虚拟占位符,确保内核的已安装文件系统列表永远不会完全为空,以避免需要特殊情况的代码来处理这种情况。

通常你不能直接卸载真正的根文件系统;如果您可以这样做,您最终会遇到无法打开任何文件的情况(并且无法打开现有文件,因为在旧根文件系统中打开任何文件都会阻止其卸载)。那时,您将无法加载任何新的可执行文件。由于没有地方可以/dev安装/proc/sys安装,因此您也将无法访问大多数设备。因此,除了作为重新启动或关闭之前的最后一步之外,卸载根文件系统的系统并不是很有用。

从一个根文件系统切换到另一个根文件系统(例如从启动时initramfs切换到真实根文件系统)的真正方法是使用pivot_root(2)系统调用

还有一个命令行工具switch_root(8)但它被设计为专门用于从 initramfs 到真正的根文件系统的过渡:

警告:switch_root 会递归删除当前根文件系统上的所有文件和目录。

这就是当系统在启动时从 initramfs 转换到真正的根文件系统时,initramfs 会变空并缩小到无足轻重的原因。但是尝试switch_root从一个真实的根文件系统转换到其他文件系统会导致旧根文件系统的内容被删除,因此它对于从一个基于磁盘的根文件系统到另一个的非破坏性转换没有用处。

在 2.6.xx 内核之前,我认为有人制作了一个概念验证的 Linux 防火墙,它只设置网络接口、路由和 ipchains/iptables 防火墙,然后停止内核。当时,停止只是意味着停止用户空间进程,而内核继续运行。我认为这更像是一个有趣的特技/对话片段,而不是任何严肃的设计。但是,对于卸载的根文件系统,您唯一可以做的事情可能就是类似的事情。

相关内容