`ip netns exec`命令如何创建mount命名空间?

时间:2017-08-11 07:07:51

标签: linux namespaces mount

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

以下是ip-netns的手册页:

  

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

     

ip netns exec自动处理此配置文件   网络名称空间不知道应用程序的约定,通过创建   mount namespace和bind挂载所有每个网络命名空间   将文件配置到/ 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命令直接执行此操作,而不是使用ip netns exec

我再次创建命名空间。使用unshare,我正在创建一个mount命名空间并在该mount命名空间内执行bind mount。我假设这是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阻止这种变化传播的附加步骤是什么?我假设它与使用make-sharedmake-slave标志有关,但无法弄清楚。

1 个答案:

答案 0 :(得分:1)

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

ip netns exec完成后,

mount --make-rslave /命令似乎正在运行unshare(CLONE_NEWNS)。 即,在创建新的mount命名空间之后,/在该命名空间中作为slave挂载。