Linux `ip netns exec`命令如何创建装载命名空间?

Linux `ip netns exec`命令如何创建装载命名空间?,linux,namespaces,mount,Linux,Namespaces,Mount,ip netns exec命令如何创建装载命名空间并防止更改传播到其他装载命名空间 以下是ip网络的手册页中的内容: 对于知道网络名称空间的应用程序,约定 首先查找全局网络配置文件 /etc/netns/NAME/然后在/etc/中。例如,如果您想要一个不同的 用于隔离的网络命名空间的/etc/resolv.conf版本 您的vpn可以命名为/etc/netns/myvpn/resolv.conf # cat /etc/resolv.conf default conf ip netns exe

ip netns exec
命令如何创建装载命名空间并防止更改传播到其他装载命名空间

以下是
ip网络的手册页中的内容:

对于知道网络名称空间的应用程序,约定 首先查找全局网络配置文件 /etc/netns/NAME/然后在/etc/中。例如,如果您想要一个不同的 用于隔离的网络命名空间的/etc/resolv.conf版本 您的vpn可以命名为/etc/netns/myvpn/resolv.conf

# cat /etc/resolv.conf
default conf
ip netns exec可自动处理此配置、文件 通过创建 挂载命名空间和绑定挂载所有每个网络命名空间 在/etc中将文件配置到其传统位置

但是,它如何管理仅在特定名称空间中可见的绑定装载

让我举个例子。 在一个终端中,我创建了一个网络名称空间ns3,并为ns3创建了一个特定的resolv.conf

# ip netns add ns3
# mkdir /etc/netns/ns3
# echo "ns3 conf" > /etc/netns/ns3/resolv.conf
# ip netns exec ns3 sleep 36000
现在在另一个终端中,我检查/etc/resolv.conf

# cat /etc/resolv.conf
default conf
绑定挂载所做的更改在这里没有反映出来。 只有当我输入由
ip netns
命令创建的装载名称空间时,更改才可见

# lsns | grep mnt
4026533472 mnt        1 13016 root             sleep 36000
# nsenter -m -t 13016
# cat /etc/resolv.conf
ns3 conf
所以一切都如预期的那样

现在,让我尝试直接使用
unshare
命令,而不是使用
ipnetns-exec

我再次创建了一个名称空间。使用
unshare
,我创建了一个挂载名称空间,并在该挂载名称空间内执行绑定挂载。我假设这就是
ip netns exec
命令内部所做的

# ip netns add ns4
# mkdir /etc/netns/ns4
# echo "ns4 conf" > /etc/netns/ns4/resolv.conf
# unshare -m --propagation unchanged /bin/bash
# mount --bind /etc/netns/ns4/resolv.conf /etc/resolv.conf
但这一次,当我从另一个终端进行检查时,更改被传播回来,这是不需要的

# cat /etc/resolv.conf
ns4 conf

那么,
ip netns exec
阻止这种变化传播的额外步骤是什么呢?我假设它与使用
makeshared
makeslave
标志有关,但无法准确地计算出来。

发现,如果我使用
#unshare-m--propagation slave/bin/bash
,传播将被阻止

ip netns exec
命令似乎正在运行
mount--make rslave/
unshare(CLONE\u NEWNS)
完成后。
i、 创建新的装载命名空间后,/将作为该命名空间中的从属装载。

Unix和Linux上有一个相关的答案,它使用
strace
来分析
ip netns exec
正在做什么: