我浏览了一下/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现在会指向我的常规文件,或者它现在是什么,会发生什么呢?
发布于 2019-06-28 18:35:11
这是使用现有抽象来表示一种新型事物的内核。在传统的符号链接意义上,这些文件并没有真正“指向”任何东西。这些值可以有效地处理命名空间。内核在内部使用信息在其内部数据结构中查找适当的命名空间。
例如,当进程具有套接字时,您将在/proc//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文件系统中,因此那里的文件/目录只是对内核状态的抽象,内核将不允许您在该目录中创建新文件。
发布于 2019-06-29 15:46:23
这些文件以符号链接的形式显示。它们指向属于伪文件系统nsfs的伪文件。不包括专用的命名空间操作(使用克隆(2)、集(2)、unshare(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在我的回答:如何找到在Linux中配置的所有接口,包括容器的接口?中,网络命名空间案例的shell脚本使用示例
https://unix.stackexchange.com/questions/527534
复制相似问题