从https://man7.org/linux/man-pages/man1/n.1.html:
默认情况下,只有当新命名空间至少有一个成员进程时,它才会存在。通过绑定安装相应的 /proc/PID/ns/ns 类型文件,可以使命名空间持久化,即即使没有成员进程,也可以固定存在。
绑定安装源的文件路径中使用了哪个 PID?创建命名空间时绑定挂载点的全部意义不就是命名空间不依赖于 PID 的存在吗?
如果我clone()
使用该CLONE_NEWNET
标志创建一个网络命名空间,然后使用创建的新进程的 PID 创建一个绑定挂载,然后我终止该新进程,我会认为该/proc/PID/ns/net
文件消失了,但随后该文件/var/run/netns/<netns name>
也会被删除,网络命名空间不会持续存在。
答案1
在进程中运行的用户态软件无法在任何进程之外创建命名空间。
因此,您可以使用命名空间创建进程(或其子进程之一)的 PID。
如果我使用 CLONE_NEWNET 标志使用 clone() 创建一个网络命名空间,然后使用创建的新进程的 PID 创建一个绑定挂载,然后我杀死新进程,我会认为 /proc/PID/ns/ .net 文件消失,
让我们在这里使用带有大引号的“文件”。虚拟文件系统条目消失了,但是......
但 /var/run/netns/ 也会被删除
“删除”是您对实际文件所做的操作,它在这里不适用。 PID 将消失,但是您可以作为包含该 PID 的路径下的某些虚拟文件系统条目访问的内容将变得无法访问那方式。但:
但随后 /var/run/netns/ 也会被删除,并且网络命名空间不会持续存在。
是错误的,因为绑定挂载会添加对命名空间的内核内部引用,这样它就不会变得未使用,因此将持续存在。