更改/ etc / network / interfaces后,如何获取resolvconf来重新生成resolv.conf?


92

/etc/network/interfaces使用与下面非常相似的内容进行更新后,如何/etc/resolv.conf更新?我尝试(以root用户身份)resolver -uservice networking restart但是它们没有起作用。我也修复了符号链接,resolv.conf然后重试resolver -u。最终我无奈地重新启动了,它确实通过重建来解决了问题/etc/resolv.conf

Ubuntu 12.04,64位服务器,已安装所有最新补丁。

范例/etc/network/interfaces

iface eth0 inet static
    address 192.168.3.3
    netmask 255.255.255.0
    gateway 192.168.3.1
    dns-search example.com
    dns-nameservers 192.168.3.45 192.168.8.10


您试图做什么来使resolv.conf阻止您执行操作?
kingmilo 2012年

Answers:


106

service networking restart 降级所有接口并不总是一种可靠的方法。

resolvconf -u命令仅从resolv.confresolvconf自己的数据库更新。您需要更新数据库。

要更新数据库,您必须使用-a-d选项调用resolvconf 。在运行ifup或ifdown时,这会在后台发生。因此,通常,与对的任何其他更改一样/etc/network/interfaces,要激活对dns- *选项的更改,您必须先将有问题的接口关闭,然后再将其重新打开。或者您可以重新启动。

如果要更改接口而不进行ifdownupup(也许是因为您正在远程管理计算机,并且碰巧通过该接口连接了natch),那么可以通过直接从命令行运行resolvconf来获得相同的结果。这需要对resolvconf的语义有更多了解。假设相关的/ e / n / i节为

iface IIII FFFF static
    address ...
    ...
    dns-nameservers X.X.X.X Y.Y.Y.Y
    dns-search SSSS

其中FFFF是地址族(“ inet”或“ inet6”)。

要激活这些dns- *选项,请按以下方式运行resolvconf(是的,在字符串中将换行符传递到resolvconf)。

echo "nameserver X.X.X.X
nameserver Y.Y.Y.Y
search SSSS" | sudo resolvconf -a IIII.FFFF

对于问题中给出的节,将是以下内容。

echo "nameserver 192.168.3.45
nameserver 192.168.8.10
search example.com" | sudo resolvconf -a eth0.inet

有关更多信息,请查阅resolvconf(8)手册页和resolvconf软件包README文件(/usr/share/doc/resolvconf/README.gz)。


“不要“重启服务网络”;这不是降低所有接口的可靠方法。” 对我来说很好。很高兴知道这样做的干净方法。
Aki

11
如果您不应该“重启服务网络”,我是否建议您不要将其放在此问题的第一行?急于寻找解决方案时,我要做的第一件事就是复制并粘贴我看到的第一个命令。
罗宾·温斯洛

4
@RobinWinslow +1让我开心
皮特

8
这个答案来自于自己所发展的人resolvconf :)
heemayl

2
要重新启动/重读/etc/network/interfaces,你可以这样做:ifdown eth0 && ifup eth0; 它甚至可以在远程ssh会话中使用。
Pierre-Damien


5

对于那些远程管理服务器的人,您可以:

  1. 更新dns-nameservers/etc/network/interfaces
  2. # ifdown eth01; ifup eth01

请注意,这必须在一行上除以; (Linux命令行分隔符)。您甚至不应该丢失当前的连接。例外是在interfaces文件中输入错误。如果发生这种情况ifup将失败,并且您将必须具有物理访问权限或其他ethxx连接。


2

service resolvconf restart将重新生成/etc/resolv.conf文件而不必大惊小怪。


2
我知道了Failed to restart resolvconf.service: Unit resolvconf.service not found.
Mobigital '18

命令已完成,但未/etc/resolv.conf在ubuntu服务器14.04上重新生成
Jossef Harush

1

这个答案与上面的答案相似,但是使用问题示例配置来回答问题。另外,这解释了为什么两个命令都是必需的。

编辑/etc/network/interfaces

iface eth0 inet static
    address 192.168.3.3
    netmask 255.255.255.0
    gateway 192.168.3.1
    dns-search example.com
    dns-nameserver 192.168.3.45
    dns-nameserver 192.168.8.10

除非您重新启动或重新加载配置文件,否则不会进行这些更改:

为了实时更新interfaces文件,必须运行以下命令:

echo "nameserver 192.168.3.45
nameserver 192.168.8.10
search example.com" | sudo resolvconf -a eth0.inet

这允许在不重新引导或重新加载的情况下更新接口。

但是,如果/etc/network/interfaces不进行上述更改,则重新引导后上述命令更改将丢失。

顺便说一下,此列表中来自BDenis的最后一个答案实际上可以代替最后一个命令,方法是解析/etc/network/interfaces文件并将这些行传送到命令中。sudo resolvconf -a eth0 这实际上是答案的一半,并且是内联sed解析的一个很好的例子。如果要查看其操作方式,只需运行命令的第一部分并观看它解析/etc/network/interfaces文件并吐出运行sudo resolvconf -a eth0命令所需的所有必要信息:

sed 's/#.*$//' /etc/network/interfaces | grep dns- | sed 's/dns-//g'

注意,这将产生与命令相同的输出:

echo "nameserver 192.168.3.45
nameserver 192.168.8.10
search example.com"

假设/etc/network/interfaces文件配置了以下信息:

iface eth0 inet static
    address 192.168.3.3
    netmask 255.255.255.0
    gateway 192.168.3.1
    dns-search example.com
    dns-nameserver 192.168.3.45 
    dns-nameserver 192.168.8.10

可悲的是不能使用它。我的界面由网络管理器和DHCP管理,因此/etc/network/interfaces在这种情况下将其添加到不是一个有效的选项。(Ubuntu 14.04)
2016年

1

简单的答案:

只需安装resolvconf。 apt install resolvconf

之后,根据中的 行ifup eth0更新dns 。etc/resolv.confdns-nameservers/etc/network/interfaces


未知的界面。每个人都真的知道如何在这里混淆细节……我认为我们应该以容器化所有命令为目标。每个人都有完整的剧本,没有散文。
mathtick '18

1

在18.04上,以下各项可靠地运行(以root用户身份运行):

systemctl stop networking
ip address flush dev <device> # just to be safe
systemctl start networking

重要:确保已resolvconf安装软件包。
它似乎不是默认设置,没有它,某些(!)的更改将/etc/network/interfaces被忽略(例如dns-*)。


0

这为我工作:

sed -re '/nameservers|dns-search/ !d' -e 's/dns-nameservers/nameserver/' -e 's/dns-search/search/' /etc/network/interfaces  | resolvconf -a eth0.inet && resolvconf -u

相应地调整。


0

在Ubuntu 18.04的桌面版本上,该版本没有任何服务networking,并且resolvconf默认情况下未安装该软件,我resolv.conf通过重新启动成功进行了重新生成network-manager

sudo service network-manager restart

-3

您也可以尝试以下命令:

cat /etc/network/interfaces |sed 's/#.*$//'|grep dns-|sed 's/dns-//g'|sudo resolvconf -a eth0.inet

3
您能否解释为什么该命令应该起作用?
αғsнιη

1
如果您在该行中有多个名称服务器IP,这将无法正常工作dns-nameserver IP1 IP2。然后必须在中重复该行resolv.conf,但不是。
蒂诺

此外,/etc/network/interfaces使用dns-nameservers(注意s在端部),而resolvconf用途nameserver。该命令不处理它。即使一切正确,管道也sed | grep | sed绝对不是最有效的方法。
Melebius '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.