我正在阅读这和我最初的(不正确)认为这与挂载命名空间和 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
答案2
在像Linux这样的Unixy系统中,每个进程都有它的文件系统视图,一棵从(它认为是的)开始的树/
。一个进程可以通过多种方式将一组不同的文件视为另一组文件,特别是chroot(1)
(以及底层系统调用),整个容器机制在此基础上扩展。
请注意,当使用容器时(例如,看看 Docker),在这些容器内运行的进程可以查看其他进程完全无法访问的文件系统(除非它们显式共享/访问)。也就是说,/bin/ls
运行 Alpine Linux 的 Docker 容器内的进程不在文件之外。