Linux 有单父根文件系统吗?

Linux 有单父根文件系统吗?

我正在阅读和我最初的(不正确)认为这与挂载命名空间和 chroot 有关。

这让我想知道......我知道如果不存在可以访问文件系统1 的进程,Linux 会自动清理它(如果可以的话)。除此之外,这允许在之后隐式清理 initramfs 文件系统枢轴根chroot

我还了解到 PID 命名空间有一个父命名空间和其他子命名空间,因此所有进程1对于内核启动的 PID 都是可见的。

但我不太确定是否存在主挂载命名空间甚至主根文件系统。当然,有一个 PID 使用的根文件系统1,但除此之外,任何文件系统都有意义根文件系统?


我认为我的担忧来自于 SO、文档和博客上的许多答案,所有这些答案都使用“流程有自己的观点”之类的术语文件系统”。

我的问题是我不明白在什么意义上有任何单个文件树可以引用文件树...

...名称空间被复制、单独修改、隐式销毁。乃至我们都认为主要的根文件系统甚至不是第一个,因为 initramfs(通常)首先使用不同的树运行,然后调用 chroot。

那么这个术语在技术上是否不正确,或者是否存在一个作为主文件树的文件树。


1如果我错了请纠正我,但是

  • unshare -m mount /foo /bar没有任何效果,因为当 mount 命令行实用程序退出时,新命名空间中将不存在任何进程,因此新挂载将自动卸载。
  • 如果 PID 1 是唯一的进程并且它具有三个挂载点/ /foo /bar,那么它会调用chroot /foo原始挂载点/并将/bar其卸载。同样,不存在可以访问其中任何一个的进程

答案1

在Linux上,每个进程都有自己的文件系统视图,受其约束挂载命名空间(以及相关功能)。每个挂载命名空间都与一个关联用户命名空间。由于用户命名空间构成了根层次结构,因此存在单个根用户命名空间。在与该用户命名空间关联的挂载命名空间中,其中一个(或至少在某个时刻)包含访问(传递)其他挂载命名空间中挂载的所有内容所需的所有内容;这可以说是主机系统的根挂载命名空间,并且该命名空间的根可以被视为主机系统的根文件系统。

答案2

在像Linux这样的Unixy系统中,每个进程都有它的文件系统视图,一棵从(它认为是的)开始的树/。一个进程可以通过多种方式将一组不同的文件视为另一组文件,特别是chroot(1)(以及底层系统调用),整个容器机制在此基础上扩展。

请注意,当使用容器时(例如,看看 Docker),在这些容器内运行的进程可以查看其他进程完全无法访问的文件系统(除非它们显式共享/访问)。也就是说,/bin/ls运行 Alpine Linux 的 Docker 容器内的进程不在文件之外。

相关内容