如何使dhclient具备命名空间感知能力?

14

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

当使用dhclient进行DHCP时出现问题。 我正在从命名空间内运行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 命令可能会引起问题。

如何使 dhclient 具备命名空间感知能力?

1个回答

12

我自己查看了这个问题。

发生的情况是,当您创建一个网络命名空间时,除非您明确创建 /etc/netns/<namespace_name>/resolv.conf,否则您将看到主机机器的 /etc/resolv.conf,当在网络命名空间内部查找时,它将自动绑定挂载到 /etc/resolv.conf。因此,只需创建该路径,主机的 resolv.conf 就不会在网络命名空间中可见,而网络命名空间将有自己的 resolv.conf

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

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

ip netns exec 自动处理这种网络命名空间不支持的应用程序的配置文件约定,方法是创建一个挂载命名空间,将所有网络命名空间的每个配置文件绑定挂载到它们在 /etc 中传统的位置上。

至于更新 resolv.conf,当 /etc/netns/<namespace_name>/resolv.conf 存在时,dhclient 并不能直接在网络命名空间中使用(另一方面,当它不存在时,它将覆盖主机机器的 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 程序似乎能够正确地完成这项工作。

1
这是一个很棒的解决方法。请注意,有两个部分需要将mv更改为cat。我想知道mv在内部做了什么。它首先删除文件吗? - 0xAffe
将近4年过去了,这个问题仍然存在(dhclient 4.4.2)。 - Twifty

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