首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“命名空间文件”指向什么类型的文件?

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

Unix & Linux用户
提问于 2019-06-28 17:39:32
回答 2查看 807关注 0票数 2

我浏览了一下/proc/*/ns,并注意到命名空间文件看起来不熟悉:

代码语言:javascript
复制
# 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现在会指向我的常规文件,或者它现在是什么,会发生什么呢?

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2019-06-28 18:35:11

这是使用现有抽象来表示一种新型事物的内核。在传统的符号链接意义上,这些文件并没有真正“指向”任何东西。这些值可以有效地处理命名空间。内核在内部使用信息在其内部数据结构中查找适当的命名空间。

例如,当进程具有套接字时,您将在/proc//fd中看到类似的类型:

代码语言:javascript
复制
lrwx------ 1 user group 64 Jun 28 14:35 3 -> 'socket:[17257]'

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

代码语言:javascript
复制
# echo hi > /proc/self/ns/ipc
bash: /proc/self/ns/ipc: Operation not permitted

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

票数 2
EN

Unix & Linux用户

发布于 2019-06-29 15:46:23

这些文件以符号链接的形式显示。它们指向属于伪文件系统nsfs的伪文件。不包括专用的命名空间操作(使用克隆(2)、集(2)、unshare(2)、ioctl_ns(2)等),我知道的这些文件上唯一允许的操作是打开(和关闭)它们,在操作名称页时具有引用,或者挂载它们,以确保即使不再使用名称空间的进程(例如ip netns add mynetnamespace )也保留名称空间上的引用。

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

代码语言:javascript
复制
$ 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

另外:

代码语言:javascript
复制
$ ip netns show
test
$ grep test /proc/mounts
nsfs /run/netns/test nsfs rw 0 0

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

票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/527534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档