如果命名空间中的最后一个进程退出会发生什么?

如果命名空间中的最后一个进程退出会发生什么?

我正在运行Linux。

我在安装命名空间中有一个进程。我在这个过程中做了一个mount -t tmpfs tmpfs /mountpoint.

如果进程退出并且该安装命名空间中不再有进程,会发生什么情况?文件系统会自动卸载吗?挂载命名空间会被破坏吗?如果命名空间和挂载仍然处于活动状态,我如何访问它?

如果网络命名空间不再有进程,tun/tap/macvtap 接口会发生什么情况?

答案1

我想知道同样的事情,所以我运行了一个小测试(在内核 4.20.0 上,使用 util-linux 2.33 中的 unshare;该版本中 unshare 的联机帮助页有一些关于共享/私有挂载的注释值得阅读,并且YMMV(如果您使用的是旧版本)。

长话短说:是的,当命名空间中的最后一个进程退出时,文件系统将被卸载。


就我而言,我正在测试的设备是dm-6,它是不是安装在“外部”命名空间中。

窗口 1:

cd /sys/fs/ext4
ls -d dm-6
# No such file or directory
窗口2:
unshare -m
mount /dev/dm-6 /mnt/tmp
# don't exit yet, keep the namespace active
窗口 3:执行与窗口 1 相同的操作。

窗口 1:

ls -d dm-6
# exists now

窗口2:退出unshare环境

窗口1:再检查一下,dm-6还在

窗口 3:退出unshare环境

窗口1:再检查一下,dm-6又不见了


另一个有用的演示/测试:类似的想法,但不是有 3 个窗口,而是进入和退出窗口 2 两次。检查dmesg或记录,并验证在这种情况下安装文件系统的内核消息出现了两次。

答案2

坐骑似乎仍然存在,但变得无法访问。

我做了以下测试:

  1. 输入新的命名空间并挂载 tmpfs:
root@localhost:~# mkdir tmp
root@localhost:~# 取消共享 -m bash
root@localhost:~# mount -t tmpfs tmpfs tmp
  1. 检查在 tmpfs 上创建 200 MB 文件之前和之后的内存使用情况。您可以注意到“共享”使用量从 404 兆字节变为 604 兆字节:
root@localhost:~# free -m
              可用的免费共享缓冲区/缓存总数
手机:9885 2966 681 404 6237 6148
兑换:8191 293 7898
root@localhost:~# dd if=/dev/urandom of=tmp/dummy bs=1M count=200
200+0 条记录
200+0 条记录输出
复制 209715200 字节(210 MB、200 MiB),12.0075 秒,17.5 MB/秒
root@localhost:~# free -m
              可用的免费共享缓冲区/缓存总数
手机:9885 2966 481 604 6437 5948
兑换:8191 293 7898
  1. 退出unshare shell,内存没有被回收:
root@localhost:~# 退出
root@localhost:~# free -m
              可用的免费共享缓冲区/缓存总数
手机:9885 2963 484 604 6437 5951
兑换:8191 293 7898

而如果我卸载 tmpfs,shared计数将恢复到初始值。

答案3

无法添加评论,因为没有足够的代表,所以这里是:我在未修改的 debian 拉伸上做了与 jpa 完全相同的测试,并且内存恢复到初始值,即使我没有卸载。所以看来这种行为已经改变了。

http://man7.org/linux/man-pages/man7/namespaces.7.html

至少通过以下方式暗示这一点:

将此目录中的文件之一绑定安装(请参阅 mount(2))到文件系统中的其他位置,即使当前名称空间中的所有进程都终止,也会使 pid 指定的进程的相应名称空间保持活动状态。

所以不这样做会破坏命名空间(?)。

相关内容