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-shared
或make-slave
标志有关,但无法弄清楚。
答案 0 :(得分:1)
发现如果我使用# unshare -m --propagation slave /bin/bash
,则会阻止传播。
ip netns exec
完成后, mount --make-rslave /
命令似乎正在运行unshare(CLONE_NEWNS)
。
即,在创建新的mount命名空间之后,/在该命名空间中作为slave挂载。