我正在运行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
坐骑似乎仍然存在,但变得无法访问。
我做了以下测试:
- 输入新的命名空间并挂载 tmpfs:
root@localhost:~# mkdir tmp root@localhost:~# 取消共享 -m bash root@localhost:~# mount -t tmpfs tmpfs tmp
- 检查在 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
- 退出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 指定的进程的相应名称空间保持活动状态。
所以不这样做会破坏命名空间(?)。