ip netns exec
命令如何创建挂载 namespace 并防止更改传播到其他挂载 namespace ?
以下是ip-netns
的手册页:
但是,它如何管理仅在该特定 namespace 中可见的绑定(bind)安装?
让我举一个例子。
在一个终端中,我创建了一个网络 namespace 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
绑定(bind)安装所做的更改未在此处反射(reflect)。
仅当我输入由
ip netns
命令创建的安装 namespace 时,更改才可见。# lsns | grep mnt
4026533472 mnt 1 13016 root sleep 36000
# nsenter -m -t 13016
# cat /etc/resolv.conf
ns3 conf
因此,所有工作均按预期进行。
现在,让我尝试直接使用
unshare
命令来执行此操作,而不是使用ip netns exec
。我再次创建一个 namespace 。使用
unshare
,我创建了一个安装命名空间,并在该安装命名空间内进行了绑定(bind)安装。我假设这是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
标志的使用有关,但无法确切找出。 最佳答案
发现如果我使用# unshare -m --propagation slave /bin/bash
,则阻止了传播。ip netns exec
完成后,mount --make-rslave /
命令似乎正在运行unshare(CLONE_NEWNS)
。
即,在创建了新的安装 namespace 后,/在该 namespace 中作为从设备安装。