“命名空间文件”指向什么类型的文件?

“命名空间文件”指向什么类型的文件?

我四处闲逛/proc/*/ns,发现命名空间文件看起来很陌生:

# example from `man namespaces`
$ ls -l /proc/$$/ns
total 0
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 cgroup -> cgroup:[4026531835]
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 ipc -> ipc:[4026531839]
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 mnt -> mnt:[4026531840]
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 net -> net:[4026531969]
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 pid -> pid:[4026531836]
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 pid_for_children -> pid:[4026531834]
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 user -> user:[4026531837]
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 uts -> uts:[4026531838]

所以命名空间文件是...什么的符号链接?带有 10 位数字标识符的“东西”?我的意思是,我知道“一切都是文件”,但我以前从未见过这样的文件路径,它在哪里?

而且,邪恶的帽子,如果我现在指向我的常规文件或当前的任何文件,会发生touch "/proc/$$/ns/cgroup:[4026531835]"什么cgroup

答案1

这是使用现有抽象来表示新类型事物的内核。从传统的符号链接意义上来说,这些文件并不真正“指向”任何东西。这些值是命名空间的有效句柄。内核在内部使用该信息在其内部数据结构中查找适当的名称空间。

/proc/<pid>/fd当一个进程有一个套接字时,你会看到类似的事情:

lrwx------ 1 user group 64 Jun 28 14:35 3 -> 'socket:[17257]'

内核将拒绝写入这些内容的尝试。例如:

# echo hi > /proc/self/ns/ipc
bash: /proc/self/ns/ipc: Operation not permitted

另外,您不能在该目录中创建名为 的文件ipc:[4026531839]- 它位于 proc 文件系统中,因此那里的文件/目录只是对内核状态的抽象,并且内核不允许您创建新的文件/目录该目录中的文件。

答案2

这些文件以符号链接的形式呈现。它们指向属于伪文件系统的伪文件nsfs。不包括专门的命名空间操作(通过克隆(2),设置(2),取消分享(2),ioctl_ns(2)等),据我所知,对这些文件唯一允许的操作是打开(和关闭)它们,在操作名称页时获得引用,或者安装它们,以确保即使没有进程也保留对命名空间的引用使用它已经不再存在,例如正在做的事情ip netns add mynetnamespace

唯一容易获得的有用信息是其 inode,它由伪符号链接显示(并且可以在脚本中使用 检索stat -L -c %i)。它是全局唯一的(包括在所有不同类型的命名空间中),因此无需专门的工具,它就可以与其他类似的值进行比较:等于意味着它是相同的伪文件,因此是相同的命名空间。

$ ls -l /proc/$$/ns/net
lrwxrwxrwx. 1 user user 0 Jun 29 17:37 /proc/23615/ns/net -> net:[4026531992]
$ stat -c %F /proc/$$/ns/net
symbolic link
$ stat --file-system -L -c %T /proc/$$/ns/net
nsfs
$ stat -L -c %i /proc/$$/ns/net
4026531992

还:

$ ip netns show
test
$ grep test /proc/mounts
nsfs /run/netns/test nsfs rw 0 0

我的一个答案中网络命名空间案例的 shell 脚本用法示例:如何找到Linux中已经配置的所有接口,包括容器的接口?

相关内容