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

4
ip netns exec命令如何创建挂载命名空间并防止更改传播到其他挂载命名空间?
以下是ip-netns的手册页面内容:
“对于意识到网络命名空间的应用程序,约定是首先在/etc/netns/NAME/中查找全局网络配置文件,然后在/etc/中查找。例如,如果您要为用于隔离vpn的网络命名空间使用不同的/etc/resolv.conf版本,则将其命名为/etc/netns/myvpn/resolv.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命令来完成这个操作,而不是使用ip netns 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的附加步骤是什么,可以防止更改的传播?我猜想它与使用make-sharedmake-slave标志有关,但无法确定确切的信息。

1个回答

3
我发现如果使用# unshare -m --propagation slave /bin/bash,则会阻止传播。 ip netns exec命令似乎在完成unshare(CLONE_NEWNS)后运行mount --make-rslave /。 即,在创建新的挂载命名空间之后,在该命名空间中将/作为从属挂载。

在Unix&Linux上有一个相关的答案,使用strace分析ip netns exec正在做什么:https://unix.stackexchange.com/a/471214/249381 - Fred Schleifer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接