在/ etc / network / interfaces中编辑dns-nameservers而不重启

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

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

你是对的,“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 

或重新启动。

我最近碰到了两次。

第一次,我做了sudo ifdown eth0当然杀了我的ssh连接并让机器忽略了它的NIC。 哎哟。 我不得不通过服务器上的IPMI接口再次获得控制权。

第二次,我从我之前的错误中吸取了教训,并且做了sudo ifdown eth0 ; sudo ifup eth0 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的灵感。

刚刚经历了同样的问题; 即使重启也会失去手动调用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派生的内容也将跟随原始设置)。

坦率地说,通过重启可以最安全地应用这些变化是疯狂的。 当前系统采用以前的“编辑此文件,可能从配置管理系统部署”并将其隐藏在多层抽象之后,并且没有干净的方式来调用正常启动框架之外的维护。