我四处/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
现在将指向我的常规文件,或者它目前是什么,会发生什么?
这是内核使用现有的抽象来表示一种新类型的事物。在传统的符号链接意义上,这些文件并没有真正“指向”任何东西。这些值是命名空间的有效句柄。内核在内部使用这些信息在其内部数据结构中查找适当的命名空间。
/proc/<pid>/fd
例如,当进程具有套接字时,您会看到类似类型的事情:内核将拒绝写入这些的尝试。例如:
此外,您不能
ipc:[4026531839]
在该目录中创建名为例如 的文件 - 它位于 proc 文件系统中,因此那里的文件/目录只是内核状态的抽象,内核不允许您创建新的该目录中的文件。这些文件显示为符号链接。它们指向属于 pseudo-filesystem 的伪文件
nsfs
。不包括专门的命名空间操作(使用clone(2)、setns(2)、unshare(2)、ioctl_ns(2)等完成),我所知道的对这些文件的唯一允许操作是打开(和关闭)它们,在操作名称页时有一个引用,或者挂载它们,确保在命名空间上保留一个引用,即使不再存在使用它的进程,例如ip netns add mynetnamespace
.唯一容易获得的有用信息是它的 inode,它由伪符号链接显示(并且可以在脚本中使用 检索
stat -L -c %i
)。它是全局唯一的(包括在所有不同类型的命名空间中),因此没有专门的工具,它可以与其他类似的值进行比较:equals 表示它是相同的伪文件,因此是相同的命名空间。还:
我的答案中网络命名空间案例的 shell 脚本使用示例:如何找到已在 Linux 中配置的所有接口,包括容器接口?