答案1
如中所述内核提交日志由上面的 jiliagre 链接到,该nsfs
文件系统是一个虚拟文件系统,制作 Linux 内核命名空间可用的。它与“proc”文件系统分开/proc
,其中一些进程目录条目引用nsfs
文件系统中的索引节点,以显示某个进程(或线程)当前正在使用哪些名称空间。
未nsfs
列出/proc/filesystems
(而确实proc
列出),因此无法显式安装它。mount -t nsfs ./namespaces
因“未知文件系统类型”而失败。这是因为nsfs
它与proc
文件系统紧密交织在一起。
文件系统类型仅在以下情况nsfs
下才可见/proc/$PID/mountinfo
绑定安装现有的(!)命名空间文件系统链接到另一个目标。正如 Stephen Kitt 上面正确建议的那样,这是为了保持命名空间存在,即使没有进程再使用它们。
例如,使用新的网络命名空间创建一个新的用户命名空间,然后绑定挂载它,然后退出:该命名空间仍然存在,但lsns
找不到它,因为它不再列出/proc/$PID/ns
,而是作为(绑定)挂载存在观点。
# bind mount only needs an inode, not necessarily a directory ;)
touch mynetns
# create new network namespace, show its id and then bind-mount it, so it
# is kept existing after the unshare'd bash has terminated.
# output: net:[##########]
NS=$(sudo unshare -n bash -c "readlink /proc/self/ns/net && mount --bind /proc/self/ns/net mynetns") && echo $NS
# notice how lsns cannot see this namespace anymore: no match!
lsns -t net | grep ${NS:5:-1} || echo "lsns: no match for net:[${NS:5:-1}]"
# however, findmnt does locate it on the nsfs...
findmnt -t nsfs | grep ${NS:5:-1} || echo "no match for net:[${NS:5:-1}]"
# output: /home/.../mynetns nsfs[net:[##########]] nsfs rw
# let the namespace go...
echo "unbinding + releasing network namespace"
sudo umount mynetns
findmnt -t nsfs | grep ${NS:5:-1} || echo "findmnt: no match for net:[${NS:5:-1}]"
# clean up
rm mynetns
输出应该与此类似:
net:[4026532992]
lsns: no match for net:[4026532992]
/home/.../mynetns nsfs[net:[4026532992]] nsfs rw
unbinding + releasing network namespace
findmnt: no match for net:[4026532992]
请注意,无法通过 nsfs 文件系统创建名称空间,只能通过系统调用克隆()(CLONE_NEW...
) 和取消共享。它nsfs
仅反映命名空间的当前内核状态,但不能创建或销毁它们。
只要没有任何对它们的引用,没有进程,命名空间就会自动被销毁(所以没有/proc/$PID/ns/...
)和也没有绑定安装,正如我们在上面的示例中探讨的那样。
答案2
这就是“命名空间文件系统”,由setns
系统调用,正如其源代码所示,与 ioctl 相关的名称空间(例如NS_GET_USERNS
,NS_GET_OWNER_UID
...)
NSFS
/proc
Linux 3.19 之前,伪文件条目一直由文件系统提供。这里是提交此更改。
请参阅 Stephen Kitt 的评论,了解有关此文件存在的可能解释。