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