什么是 NSFS 文件系统?

什么是 NSFS 文件系统?

内核包含一个文件系统 nsfs。为每个已安装的快照snapd创建一个 nsfs 安装/run/snapd/ns/<snapname>.mntls将其显示为 0 字节文件。

内核源代码似乎不包含任何有关它的文档或注释。主要实现似乎是这里头文件在这里

由此看来,它似乎与名称空间相关。

搜索存储库甚至找不到用于启用或禁用它的 Kconfig 条目...

该文件系统的目的是什么以及用途是什么?

答案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_USERNSNS_GET_OWNER_UID...)

NSFS/procLinux 3.19 之前,伪文件条目一直由文件系统提供。这里是提交此更改

请参阅 Stephen Kitt 的评论,了解有关此文件存在的可能解释。

相关内容