如何在resolv.conf中包含在重新启动后不会丢失的行?


172

我终于从7.10迁移到12.04。我还有最后一部分要完成,但是我很困惑。我在每台服务器上都使用Puppet,过去我在resolv.conf中包含了一个名称服务器地址和puppetmaster的搜索域名。

search puppetmaster.com
nameserver 192.168.1.XXX

在12.04中,重新启动后resolv.conf被覆盖。我不能为这些使用静态IP,因此使用/ etc / network / interfaces来帮助我是一个难题。

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 127.0.0.1

有没有办法让resolvconf在头,尾或基中进行处理?如果有的话,有什么我可以用来调整服务器的示例。

任何帮助深表感谢。


2
resolvconf是一个不好的软件,只需删除它,然后使用旧方法来管理/etc/resolv.conf。
古铜色男人

Answers:


133

最好让您的DNS服务器能够将“人偶”解析为正确的地址,或者让您的DHCP服务器分发DNS名称服务器地址和搜索列表,或者(如果您有静态IP地址)使用类似以下内容/ 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

但是,如果您确实想通过resolvconf配置文件来执行此操作,则需要进行编辑/etc/resolvconf/resolv.conf.d/base。在该文件中,像输入一样输入您的信息resolv.conf

nameserver 192.168.1.XXX

然后告诉resolvconf重新生成resolv.conf

sudo resolvconf -u

13
尽管此答案具有投票权,并且第一部分或多或少是正确的,但答案的第二部分却不正确。(1)不要把“搜索”行/etc/resolvconf/resolv.conf.d/head。如果在其中放置“搜索”行,如果resolvconf在resolv.conf文件的动态部分中包含“搜索”行,则将忽略此行。glibc解析器将忽略最后一行“搜索”或“域”以外的所有内容。参见resolv.conf(5)。(2)如果更改了resolvconf配置,则不应重新启动resolvconf作业,而应运行更新“ resolvconf -u”。
jdthood 2012年

1
我已经删除了行。另一种选择是使用尾巴而不是头部。
tgm4883 2012年

6
@tishma:嗨。首先,防止任何误解:基本文件,头文件或尾文件都不写入。在运行时,什么都不会写入/etc/resolvconf/resolv.conf.d/中的任何文件。这些文件由resolvconf读取,resolvconf将其内容组合到它写入的文件中--- / run / resolvconf / resolv.conf ---符号链接/etc/resolv.conf指向的文件。其次,关于更改/ etc / network / interfaces中的dns- *选项后的操作。千万不能跑“参考/etc/init.d/networking重启”; 现在已弃用。取而代之的是ifdown所讨论的接口,然后再次ifup。
jdthood

4
在14.04中,这个答案对我没有任何帮助。
杰伊·沙利文

2
如果其他所有方法都失败了.. $ sudo resolveconf -u似乎并没有为我改变任何事情,因此重新启动了计算机。
MSpreij 2015年

35

我认为答案是检查您的/etc/dhcp/dhclient.conf,即不要dns-nameservers从您的dhcp客户端请求。

然后更新 /etc/network/interfaces

auto eth0
iface eth0 inet dhcp
dns-search google.com
dns-nameservers dnsserverip

然后,您resolv.conf将按照自己的方式进行自动配置。

添加到dns-search,然后运行一个/etc/init.d/networking restart (即使此脚本已弃用,它仍然可以工作)。


5
dhclient可以对任何resolvconf设置进行统治,因此这应该是最佳答案。
Alex R

6
/etc/init.d/networking restart不能在我的机器上工作,但sudo ifdown -a后来可以sudo ifup -a了。(另外,我花了一点时间才意识到我必须dnsserverip用类似的东西代替8.8.8.8;我觉得有点傻。)
Jason Gross 2013年

试试systemctl restart networking.service
Pavel Sayekat

20

第一次安装Ubuntu时,这可能是由DHCP配置引起的。尝试执行此三步过程来处理此自动配置问题。

第一

编辑界面配置,该界面位于: /etc/network/interfaces

在下面添加此行iface lo inet loopback

dns-nameservers yourdns youraltdns

作为Google DNS的示例,您可能需要使用以下命令:

dns-nameservers 8.8.8.8 8.8.4.4

第二

编辑位于以下位置的DHCP配置文件:

/etc/dhcp/dhclient.conf

#在每行上使用标记语法为注释,或简单地删除每个请求名称服务器。在16.04中,可能不需要在此处进行任何更改。

第三

使用以下命令重新启动网络:

/etc/init.d/networking restart

在16.04中:

sudo ifdown -a
sudo ifup -a

3
/etc/init.d/networking restart不能在我的机器上工作,但sudo ifdown -a后来可以sudo ifup -a了。
杰森·格罗斯

这很简单,即使有点黑,它也可以工作!ubuntu之类的问题有1000种方法可以做一件事情!
Willa O Ng'wana

然后,您可以检查/etc/resolv.conf在第一个有用的行中是否包含这两个新的DNS条目。
ROMANIA_engineer

8

请查看resolvconf的手册页。您可以通过创建以下命令来强制包含某些DNS设置/etc/resolvconf/resolv.conf.d/base

  /etc/resolvconf/resolv.conf.d/base
          File containing basic resolver information.  The lines  in  this
          file  are  included in the resolver configuration file even when
          no interfaces are configured.

还有其他特殊文件(头和尾),这些文件可以帮助您实现所需的功能。


4
您可以在/etc/resolvconf/resolv.conf.d/base中添加行,但是由于每个名称服务器都可以通过接口访问,并且仅当该接口启动时才可以访问,因此最好将名称服务器信息与该接口关联。如果接口配置了ifup,则意味着:将信息放在/ etc / network / interfaces节的“ dns-search”和“ dns-nameservers”行中。如果接口是通过DHCP配置的,则意味着:将DHCP服务器配置为向客户端提供搜索名称和名称服务器地址。等等,仅将“基本”文件用作临时破解或不得已的手段。
jdthood 2012年

是的 我在/etc/resolvconf/resolv.conf.d/base中添加了“名称服务器1.2.3.4”
堡垒

8

许多其他答案都表明,这与resolvconf在系统中安装有关。

因此,保留某些内容的最佳方法是在resolv.conf重新启动时不会丢失:将其包含在以下位置的resolvconf配置文件中:

/etc/resolvconf/resolv.conf.d/

在那里找到head文件。无论您放在哪里,都将写在/etc/resolv.conf

所以一切都会变成这样:

# echo nameserver 8.8.8.8 >> /etc/resolvconf/resolv.conf.d/head
# resolvconf --enable-updates
# resolvconf -u

这是实际的正确答案!最后!
user77232 '18

6

对我来说,由于以下原因,以上答案不足:

  • 我没有用resolvconf,只是简单/etc/resolv.conf
  • 使用chattr +i锁定resolv.conf似乎太过分了。我需要Puppet在必要时可以自由进行更改。
  • AFAIK,编辑/etc/network/interfaces不会防止resolv.conf被覆盖;它仅指定应写入的名称服务器。对我而言,指定名称服务器不是重点。我正在尝试设置options timeout:1options attempts:1在我的resolv.conf文件。

我发现的最佳解决方案将覆盖dhclient使用其已记录的挂钩的默认行为。

/etc/dhcp/dhclient-enter-hooks.d/nodnsupdate使用以下内容创建一个新文件:

#!/bin/sh
make_resolv_conf() {
    :
}

然后使文件可执行:

chmod +x /etc/dhcp/dhclient-enter-hooks.d/nodnsupdate

现在,当dhclient运行时-在重新启动时或在您手动运行时sudo ifdown -a ; sudo ifup -a-它将加载此脚本nodnsupdate。该脚本覆盖了一个内部函数make_resolv_conf(),该函数通常会覆盖resolv.conf而什么也不做。

这在Ubuntu 12.04上对我有用。


1
在Debian 8上运行良好。优雅的解决方案!
阿图尔·博德拉

1
仅出于完整性考虑:手册页 dhclient-script包含上面提到的DHCP客户端网络配置脚本的信息。
hecke

这在16.04上不起作用,我也将内容添加到/etc/network/interfaces.d,没有任何效果,添加了此处建议的make_resolv_conf空覆盖,没有效果....但未修改/ etc / dhcp / dhclient.conf-我真的需要修改静态配置文件来解决此问题吗?
silverjam

3

这可能只是我机器上的一些怪异现象,但其他人可能也有同样的情况。

我尝试了多种方法将ISP名称服务器包含在/etc/resolv.conf中,但没有成功:

  • 我将它们包括在内/etc/network/interfaces并重新启动了网络。他们没有出现在/etc/resolv.conf

  • 我把它们/etc/resolv.conf明确地放入了,但是它们当然被覆盖了。他们确实出现在/run/resolvconf/interface/eth0.inet,但从未露面/etc/resolv.conf

  • 我尝试为动态更新配置resolvconf。没变。

最后,我在某处读到,如果本地计算机(127.0.0.1)出现在/etc/resolv.conf任何其他名称服务器中,则不包括在内。

无奈之下/run/resolvconf/interface/lo.named,我进行了编辑,删除了其中的唯一一行(nameserver 127.0.0.1),然后重新启动:ifdown eth0 && ifup eth0

然后,/ etc / resolv.conf首次包含了我的ISP名称服务器!我跑去service network-manager restart看它是否稳定,/etc/resolv.conf仍然包括我的ISP名称服务器。重新启动只是为了确保它仍然存在,但是 /run/resolvconf/interface/lo.named将其重置为:nameserver 127.0.0.1

奇怪的是,重新启动网络仍然有效:/etc/resolv.conf仍然包含我的ISP名称服务器。我无法解释这一点(有人可以吗?),但这可能有助于某人陷入困境。


这可能是由引起的dnsmasq。您可以使用apt-get remove dnsmasq或在中更新config 来简单地将其删除/etc/dnsmasq.conf
Tombart

2

将您的名称服务器添加到文件/etc/resolvconf/resolv.conf.d/head。该文件包含您收到的消息:

添加8.8.8.8后,该文件应如下所示

root@hvnatvcc: ~ # cat /etc/resolvconf/resolv.conf.d/head 
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 8.8.8.8

3
在/etc/resolvconf/resolv.conf.d/head中添加行是一个糟糕的解决方案,甚至比在/etc/resolvconf/resolv.conf.d/base中添加行更糟糕。使用ifup配置的接口的正确解决方案是在/ etc / network / interfaces中的节中添加“ dns-search”和“ dns-nameservers”行。另请参阅我对其他答案的评论。
jdthood 2012年

3
这是唯一对我真正起作用的东西……而且似乎很难弄清为什么“正确”的解决方案都不起作用。
silverjam '17

1

在最后一行添加例如:

nameserver 8.8.8.8

打开一个终端并输入

sudo chattr +i /etc/resolv.conf

+ i会确保在引导时不会重置文件。

撤消上述

sudo chattr -i /etc/resolv.conf

欲了解更多

man chattr

1

其他解决方案对我的Fedora 20系统不起作用。我的特殊问题是/etc/resolv.conf中的“搜索”行被覆盖。这是修复它的原因。(这假设NetworkManager正在生成该行, search rn.yourcompany.com 并且您希望拥有它 search rn.yourcompany.com yourcompany.com intnet.yourcompany.com

1.使用“ ifconfig”命令找出感兴趣的接口:

$ ifconfig
  :
  :

em2:  <this was the one which was connected>

2.成为root并更改到系统配置网络设备目录:

$ sudo su -[sudo] 
password for youruser:
# cd /etc/sysconfig/networking/devices`
  1. 使用您喜欢的可用编辑器添加Domain带有要搜索的其他域的行:

DOMAIN="yourcompany.com intnet.yourcompany.com"

保存,注销并重新登录。NetworkManager现在应该在以下行\etc\resolve.conf

search rn.yourcompany.com yourcompany.com intnet.yourcompany.com

3
不要下雨了,但是这是Ask Ubuntu,所以Fedora是题外话。
Flimm 2014年

1

在中添加条目 /etc/resolvconf/resolv.conf.d/head

echo 'search puppetmaster.com' | sudo tee -a /etc/resolvconf/resolv.conf.d/head
echo 'nameserver 192.168.1.XXX' | sudo tee -a /etc/resolvconf/resolv.conf.d/head

并运行以下命令

sudo resolvconf -u


0

如果使用DHCP,请编辑/etc/dhcp/dhclient.conf以添加其他DNS服务器:

prepend domain-name-servers 12.34.56.78, 12.34.56.79;

DHCP客户端覆盖dns-nameserversetc/network/interfaces,我也认为in /etc/resolvconf/resolv.conf.d/base

这在Ubuntu服务器14.04.3。中为我工作。

有关详细信息,请参见Debian NetworkConfiguration Wiki


0

只需备份您的resolve.conf并删除resolvconf pacage并编辑/etc/resolv.conf文件即可。

apt-get remove -y resolvconf
echo 'nameserver 8.8.8.8' > /etc/resolv.conf

我们应该有权选择不使用像resolvconf这样的错误软件。

顺便说一句,/ etc / resolv.conf中的搜索字段是无用的。


0

使用resolvconf和禁用systemd-resolved.service(这对我来说适用于ubuntu 19.04):

  1. 安装 resolvconf

    sudo apt install resolvconf
    
  2. 添加名称服务器

    /etc/resolvconf/resolv.conf.d/base我使用打开您的文本编辑器vim

    sudo vim /etc/resolvconf/resolv.conf.d/base
    

    然后,在打开的文件中添加名称服务器,例如:

    nameserver 1.1.1.1
    nameserver 1.0.0.1
    
  3. 更新中 resolv.conf

    sudo resolvconf -u
    
  4. 禁用systemd-resolved.service并重新启动。nameserver 127.0.0.53未写入/etc/resolv.conf

    sudo systemctl disable systemd-resolved.service
    sudo reboot
    

做完了!

资源


您可以指定针对哪个Ubuntu版本执行此操作吗?最初的问题是针对ubuntu 12.04的,因为它已被长期淘汰。
Marc Vanhoomissen

0

我找到了最简单的解决方法。如果您拥有resolv.confresolvconf提交文件,他们将互相帮助。您需要删除resolv.conf每次重新启动时获取并覆盖文件。

将放在nameserver 1.1.1.1 1.0.0.1resolvconf文件的底部,然后运行

sudo rm /etc/resolv.conf

摆脱文件。然后重新启动,一切都会正常。


0

Mi解决12.04:

我注意到,如果在不采用名称解析服务器的接口中添加dns-nameserver

resolvconf手册页

要使resolv.conf在我们手动编辑时不更改,请在终端中执行以下操作:

sudo resolvconf –disable-updates

后:

sudo resolvconf -a eth0 # or your network interface

然后手动编辑,/run/resolvconf/resolv.conf最多添加两个DNS服务器。

然后重新启动服务:

sudo /etc/init.d/networking restart

4
不是解决问题的正确方法。
jdthood 2012年

1
@jdthood作为浏览此内容的人,您可以详细说明为什么这不是正确的方法吗?在我看来,这是合乎逻辑的,但我对此一无所知。
ErikPerik 2014年

-1

只要放一个

dns-search google.com && dns-nameservers (sample: 8.8.8.8)

/etc/network/interfaces配置命令。然后重新启动网络。

它应该工作。


-2

该配置在 /etc/default/bind9

RESOLVCONF=no|yes

=请勿在init.d bind9

,或其他值=覆盖resolv.conf

当您安装bind9并且不关心检查所有conf 时,就会出现此问题。

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.