当前位置: 首页>>技术教程>>正文


如何在resolv.conf中包含不会在重新引导时丢失的行?

,

问题描述

我终于从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在头部,尾部或底部处理这个问题?如果有的话,是否有任何我可以用来调整我的服务器的例子。

任何帮助深表感谢。

最佳解决方法

您的DNS服务器可以将’puppet’解析到正确的地址,或者让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

次佳解决方法

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

然后更新您的/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(即使此脚本已被弃用,它仍然有效)。

第三种解决方法

这可能是由于首次安装Ubuntu时由DHCP配置引起的。尝试这3个步骤来处理这个自动配置问题。

First

编辑您的接口配置,位于:/etc/network/interfaces

iface lo inet loopback下面添加以下行:

dns-nameservers yourdns youraltdns

作为谷歌DNS的一个例子,你可能想要使用这个:

dns-nameservers 8.8.8.8 8.8.4.4

Second

编辑您的DHCP配置文件,位于:

/etc/dhcp/dhclient.conf

在每行上使用#将语法标记为注释,或者直接删除每个请求name-server。在16.04,你可能不需要在这里做任何改变。

Third

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

/etc/init.d/networking restart

在16.04:

sudo ifdown -a
sudo ifup -a

第四种方法

请查看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.

还有其他特殊文件(头部和尾部),这些可以帮助你实现你想要的。

第五种方法

对我而言,上述答案不足以达到以下原因:

  • 我没有使用resolvconf,只是简单的/etc/resolv.conf

  • 使用chattr +i来锁定resolv.conf似乎太过分了。我需要Puppet在必要时可以自由地进行更改。

  • AFAIK,编辑/etc/network/interfaces不会阻止resolv.conf被覆盖;它只是指定了应该写入的名称服务器。对我而言,指定名称服务器不是重点。我试图在resolv.conf文件中设置options timeout:1options attempts:1

我发现best solution覆盖了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上适用于我。

第六种方法

将你的域名服务器添加到/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

第七种方法

这可能只是我机器中的一些奇怪的怪癖,但其他人可能有相同的角落案例。

我尝试了很多方法让/etc/resolv.conf中的ISP名称服务器没有成功:

  • 我将它们包含在/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名称服务器。我无法解释这一点(可以有人吗?),但这可能会帮助有人陷入同一个位置。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/358.html,未经允许,请勿转载。