14

我正在使用命名空间来分隔服务器上的几个物理接口。路由工作完美。此外,我在 /etc/netns/ 中为每个命名空间都有一个文件夹,例如 /etc/netns/namespaceA/resolv.conf,这样 DNS 也可以正常工作。

将 DHCP 与 dhclient 一起使用时会出现问题。我正在从命名空间内运行 dhclient 并收到此错误。

(namespaceA)root@tc-vm:~#dhclient
RTNETLINK answers: File exists
mv: cannot move '/etc/resolv.conf.dhclient-new.2740' to '/etc/resolv.conf': Device or resource busy

我发现 /etc/resolvconf/update.d/libc 中的 mv 包含一个可能导致问题的 mv。

如何让 dhclient 知道命名空间?

4

1 回答 1

12

我自己调查了这个问题。

发生的情况是,当您创建网络命名空间时,您会看到/etc/resolv.conf主机,除非您明确创建,这将网络命名空间中查找时/etc/netns/<namespace_name>/resolv.conf自动绑定挂载。因此,通过简单地创建该路径,主机的 将不再在网络命名空间上可见,该命名空间将拥有自己的./etc/resolv.confresolv.confresolv.conf

手册页ip netns解释了这一点:

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

Ip netns exec 通过创建挂载命名空间并将所有每个网络命名空间配置文件绑定到 /etc 中的传统位置来自动处理此配置、网络命名空间未知应用程序的文件约定。

至于更新resolv.conf,在存在dhclient时不能在开箱即用的网络命名空间中工作/etc/netns/<namespace_name>/resolv.conf(另一方面,当它不存在时,它将覆盖resolv.conf主机的,因为它是唯一可用的,但那不是真的很可取)。正如上面问题中的错误所示,发生的情况是dhclient准备一个包含新名称服务器详细信息的临时文件,/etc/resolv.conf.dhclient-new.2740然后尝试将其重命名为/etc/resolv.conf. 它会产生错误,因为/etc/resolv.conf已经绑定安装并且显然mv不允许这样做。

为了dhclient在网络命名空间中工作,/sbin/dhclient-script应该进行修改。我删除了这个:

mv -f $new_resolv_conf /etc/resolv.conf

并将其替换为:

cat $new_resolv_conf > /etc/resolv.conf
rm -f $new_resolv_conf

否则,dhcpcd似乎正确地完成了这项工作。

于 2017-03-31T12:47:57.240 回答