无需重启即可编辑 /etc/network/interfaces 中的 dns-nameservers

无需重启即可编辑 /etc/network/interfaces 中的 dns-nameservers

dns-nameservers编辑后/etc/network/interfaces,如何resolvconf(8)在不重新启动网络的情况下读取新值?(导致服务中断)

-u选项似乎不起作用,它只是更新回相同的值。

答案1

您说得对,“resolvconf -u”不足以激活您所做的更改。该命令仅从 resolvconf 的数据库更新 resolv.conf,而您需要更新数据库。

假设有问题的接口是 eth0。假设在 /etc/network/interfaces 中有一个如下所示的节。

iface eth0 inet static
    [...]
    dns-nameservers 1.1.1.1 2.2.2.2

现在更改“dns-nameservers”行。要激活此更改,请执行以下操作(注意 && 避免破坏可能打开的 ssh 连接)

ifdown eth0 && ifup eth0

或重新启动。

答案2

我最近遇到过两次这种情况。

第一次,我sudo ifdown eth0这样做当然会终止我的 ssh 连接,并使机器忽略其 NIC。哎哟。我不得不通过服务器上的 IPMI 接口进入才能再次获得控制权。

第二次,我从之前的错误中吸取了教训,并照做了sudo ifdown eth0 ; sudo ifup eth0。当然,ssh 窗口死机了,但机器很快响应了新的 ssh 连接,我的 DNS 修改也生效了。我在第二台服务器上做了同样的事情,但这次我等了一会儿才在 ssh 窗口中输入任何内容。窗口保持打开状态,DNS 更改已应用。太棒了。

关键是使用 shell 的分号运算符,这样两个命令就可以放在一行上。这样,当接口关闭时,恢复接口的命令就已经输入了。我想我可以编写一个脚本并执行它,但这似乎更容易。

更新:还有另一种方法可以做到这一点。您也可以一步重启 Ubuntu 网络服务:sudo /etc/init.d/networking restartsudo service network-interface restart INTERFACE=eth0。感谢 JFA 的启发。

答案3

刚刚经历了同样的问题;即使重新启动也会丢失手动调用 libc 钩子的更改。

因此,我发现最稳定的方法是,将所需内容放入后/etc/network/interfaces,进行编辑/etc/resolvconf/resolv.conf.d/original以包含所需的行,确保tail(在该目录中)不存在,cd /etc/resolvconf/resolv.conf.d然后调用/etc/resolvconf/update.d/libc

请注意,如果tail存在(默认情况下,指向,original那么派生的内容/etc/network/interfaces也将遵循原始设置。

坦白说,通过重启就能最安全地应用这些更改简直是疯了。当前系统将以前的“编辑此文件,可能从配置管理系统部署”操作隐藏在多个抽象层后面,并且没有干净的方法来在正常启动框架之外进行维护。

相关内容