更改/ etc / network / interfaces后,如何让resolvconf重新生成resolv.conf?
使用与下面非常类似的更新/etc/network/interfaces
,如何更新/etc/resolv.conf
? 我尝试(以root身份) resolver -u
, service 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
service networking restart
并不总是降低所有接口的可靠方式。
resolvconf -u
命令仅从resolvconf自己的数据库更新resolv.conf
。 您需要更新数据库。
要更新数据库,必须使用-a
或-d
选项调用resolvconf。 当你运行ifup或ifdown时,会发生这种情况。 因此,正常情况下,与/etc/network/interfaces
任何其他更改一样,要激活对dns- *选项的更改,您必须ifdown关注相关接口并再次使用ifup。 或者你可以重启。
如果你想对接口进行更改而不降低它(可能是因为你远程管理机器并碰巧通过该接口连接,natch),那么你可以通过直接从命令行运行resolvconf来实现相同的结果。 这需要更多地了解resolvconf的语义。 假设相关的/ e / n / i节是
iface IIII FFFF static address ... ... dns-nameservers XXXX YYYY dns-search SSSS
其中FFFF是地址族(“inet”或“inet6”)。
要激活这些dns- *选项,请按如下方式运行resolvconf(是的,将字符串中的换行符传送给resolvconf)。
echo "nameserver XXXX nameserver YYYY 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软件包自述文件(/usr/share/doc/resolvconf/README.gz)。
虽然默认情况下没有安装联机帮助页,但是通过更新脚本选项进行了记录,只需运行:
sudo resolvconf -u
对于那些远程管理服务器的人,您可以:
- 更新
/etc/network/interfaces
的dns-nameservers
行 -
# ifdown eth01; ifup eth01
请注意,这必须在一行上划分; (linux命令行分隔符)。 你甚至不应该失去当前的联系。 例外是在interfaces文件中输入拼写错误。 如果发生这种情况, ifup
将失败,您将不得不进行物理访问或其他ethxx
连接。
service resolvconf restart
会重新生成/etc/resolv.conf
文件而不用大惊小怪。
这个答案类似于上面的答案,但使用问题示例配置来回答问题。 此外,这解释了为什么两个命令都是必要
编辑/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
给命令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
简单回答:
只需安装resolvconf即可。 apt install resolvconf
之后, ifup eth0
根据/etc/network/interfaces
的dns-nameservers
行更新etc/resolv.conf
中的dns-nameservers
。
这对我有用:
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
相应调整。
在18.04,以下工作可靠(以root身份运行):
systemctl stop networking ip address flush dev # just to be safe systemctl start networking
重要说明:确保已安装包resolvconf
。
它似乎不是默认的,如果没有它, /etc/network/interfaces
中的某些(!)更改会被默默忽略(例如dns-*
)。
您也可以尝试以下命令:
cat /etc/network/interfaces |sed 's/#.*$//'|grep dns-|sed 's/dns-//g'|sudo resolvconf -a eth0.inet