什么会在每次引导时覆盖/etc/resolv.conf?


23

我得到了一个迷你文件,该文件可以linux直接启动firefox。它可以完成所有工作,只是无法连接到互联网。

我们的网络中有3台DNS服务器,它们都能正常工作。我也可以Ping他们。但是,当尝试ping google.dewget google.de我得到一个bad address错误。

nslookup google.de 由于某种原因起作用。

resolv.conf在引导的系统上一直跟踪该问题,其内容与resolv.conf我放入.iso文件中的内容不同。

我试图了解创建和修改的所有因素resolv.conf。我不太确定我是否已掌握全部内容,但我绝对没有在那儿找到我的解决方案。

因此,作为最后的努力,我尝试使用使resolv.conf文件不可变

:~# chattr +i /etc/resolv.conf

当重建并重新启动时,令我惊讶的是,我的文件被重命名为,resolv.conf~而原来的文件却一直困扰着我。

文件内容使我相信它是从网络本身获取信息的。.iso在无法访问Internet的情况下在Virtualbox中启动时,我的文件将保持原样。

我试图改变/etc/dhcp/dhclient.conf不从网络获取的信息,通过删除domain-name-serverdomain-name-searchrequest该文件的一部分。

不幸的是没有工作。

我没有安装NetworkManager。iso基于Ubuntu 14.04。

可能缺少重要的信息。我很乐意提供。

更新:

我想我找到了清除的文件resolv.conf

好像是 /usr/share/udhcpc/default.script

#!/bin/sh

# udhcpc script edited by Tim Riker <Tim@Rikers.org>

[ -z "$1" ] && echo "Error: should be called from udhcpc" && exit 1

RESOLV_CONF="/etc/resolv.conf"
[ - n "$broadcast" ] && BROADCAST="broadcast $broadcast"
[ -n "$subnet" ] && NETMASK="netmask $subnet"

case "$1" in
    deconfig)
        /bin/ifconfig $interface 0.0.0.0
        for i in /etc/ipdown.d/*; do
            [ -e $i ] && . $i $interface
        done
        ;;

    renew|bound)
        /bin/ifconfig $interface $ip $BROADCAST $NETMASK

        if [ -n "$router" ] ; then
            echo "deleting routers"
            while route del default gw 0.0.0.0 dev $interface ; do
                :
            done

            metric=0
            for i in $router ; do
                route add default gw $i dev $interface metric $((metric++))
            done
        fi

        echo -n > $RESOLV_CONF # Start ----------------  
        [ -n "$domain" ] && echo search $domain >> $RESOLV_CONF
        for i in $dns ; do
            echo adding dns $i
            echo nameserver $i >> $RESOLV_CONF
        done
        for i in /etc/ipup.d/*; do
            [ -e $i ] && . $i $interface $ip $dns 
        done # End ------------------
        ;;
esac

exit 0

它是udhcpc程序的一部分。一个小型dhcp客户端,它是busybox

将进一步调查。


UPDATE2和解决方案:

我注释掉了该部分(从#Start到#End),这似乎覆盖了/etc/resolv.conf文件并且确定了。那是罪魁祸首。因此,晦涩的脚本导致了所有这些麻烦。

我更改了问题以反映出解决我的问题实际需要知道的内容,因此对于有相同问题的人更容易找到,因此我可以接受答案。

感谢您在解决问题方面的帮助。


1
由于未更改文件,因此无法在resolv.conf上设置不可变标志。重命名文件后,/ etc中的目录条目已更改。您必须将/ etc设置为不可变的-这确实是您不想做的。
doneal24 2014年

@ DougO'Neal我明白了。感谢您的注意。
Minix

Answers:


24

1)您不应该手动更新resolv.conf,因为所有更改都将被本地DHCP服务器提供的数据覆盖。如果您希望它是静态的,请运行sudo dpkg-reconfigure resolvconf并对动态更新回答“否”。如果要在此处添加新条目,请编辑/etc/resolvconf/resolv.conf.d/base并运行sudo resolvconf -u,它将添加您的条目​​和DHCP服务器的条目。

2)尝试编辑/ etc / network / interfaces并在其中添加条目,例如

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

然后重新启动/etc/init.d/networking restartsudo ifdown -asudo ifup -a

3)您的系统使用udhcp,这是一个非常小的DHCP客户端程序。udhcp客户端与DHCP服务器协商租约,并在获取或丢失租约时通知一组脚本。您可以在此处了解其用法也可以(如您所愿)编辑此脚本。


1
我确实将条目添加到/etc/resolvconf/resolv.conf.d/base和中resolvconf -u。不幸的是,它没有用。
Minix 2014年

您是否尝试过运行sudo dpkg-reconfigure resolvconf?运行resolvconf -u后,您的条目不在结果文件中吗?您如何添加它们,例如“ nameserver 127.0.0.1”或“ search google.com”?
kirill-a 2014年

我跑了dpkg-reconfigure resolvconf。条目不在那里。而且我与nameserver ip和都有条目search domain
Minix 2014年

不,运行dpkg-reconfigure resolvconf不会添加条目,但是您可以禁用自动更新。如果禁用更新,则可以手动编辑resolv.conf,并且不应覆盖它。
kirill-a 2014年

我很笨拙地措辞不好,我在逐句回答您的评论。运行后resolvconf -u,未添加条目。
Minix 2014年

4

我也遇到了这个。评论出来domain-name-server也不能解决我的问题。

另外,我没有使用resolvconf,只是普通的/etc/resolv.conf

我没有尝试过使用chattr +i锁定功能,resolv.conf因为它似乎太hacky。另外,我希望Puppet能够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上对我有用。


没有工作,在Ubuntu 18.04 :( /etc/resolv.conf在重新启动后覆盖。
达恩·达斯卡莱斯卡

3

Ubuntu 16.04 如果服务器实例的网络接口是由DHCP控制的,则/etc/resolv.conf只要重新启动网络服务,dhclient程序就会覆盖您的文件。

您可以通过编辑/etc/dhcp/dhclient.conf文件并为domain-namedomain-searchdomain-name-servers添加“ supersede”语句来解决此问题,如下所示:

supersede domain-name "local.com";
supersede domain-search "local.com";
supersede domain-name-servers 192.168.56.103;

在这种特殊情况下,名称服务器位于“ 192.168.56.103”,域名为“ local.com”

请注意,每行以分号结尾,域名用双引号引起来。


不幸的是,这在Ubuntu 18.04上不起作用。重新启动后,/etc/resolv.conf被127.0.0.53覆盖。
Dan Dascalescu

可能是你可以试试这个askubuntu.com/questions/1031279/...
Sand1512

还要检查您是否在跑步dnsmasq
Sand1512

0

转到此目录:

  cd /etc/resolvconf/resolv.conf.d

打开名为head的文件,然后在其中放置DNS IP或名称。打开名为tail的文件,然后将域放在其中。重启。


该目录在Ubuntu 18.04上默认不存在。您需要安装创建它的服务吗?
Dan Dascalescu

0

在Azure VM中,/ etc / resolv.conf无法直接编辑。

尝试在您的网络配置文件/ etc / sysconfig / network-scripts / ifcfg-eth0等中添加DNS条目,如下所示:

DOMAIN = example.com

DNS1 = 10。。*
DNS2 = 10。。*
DNS3 = 10。。*

保存文件后重新启动网络服务。您将看到配置也将添加到resolve.conf中。


0

要使与DNS相关的更改resolv.conf永久生效,您需要更改名为的DHCP配置文件dhclient.conf。您可以在中找到该文件 /etc/dhcp/dhclient.conf

打开文件进行编辑(不要忘记使用sudo)。您会看到以下行:

#supersede domain-name "fugue.com home.vix.com";
#prepend domain-name-servers 127.0.0.1;

删除前面的“#”并使用所需的域名和/或域名服务器。保存。现在与DNS相关的更改将是永久性的。

积分转至:https : //itsfoss.com/resolvconf-permanent-ubuntu/


这个答案已经在两年前给出了。
Dan Dascalescu

0

使用以下命令来防止resolv.conf或任何文件在重启后被覆盖

chattr -V + i文件名,例如chattr -V + i /etc/resolv.conf

要恢复更改,请使用以下命令:

chattr -i文件名-重新启用插入文件

chattr(更改属性)是一个命令行Linux实用程序,即使您以root用户身份登录,该实用程序也可用于在Linux系统中为文件设置/取消设置某些属性,以确保意外删除或修改重要文件和文件夹。


我相信问题中的用户实际上已经尝试过chattr,但是认为这没有效果。
库萨兰达

这肯定会起作用,用户尝试的选项是编辑文件而不是使其不可变
Ashish Jain

请使用sudo chattr -V + i文件名运行命令,例如sudo chattr -V + i /etc/resolv.conf
Ashish Jain

-1

在Ubuntu 18.04上使用NetworkManager。您需要删除“ resolv.conf”文件,并让NetworkManager为您生成一个文件。

删除终端类型的文件 sudo rm -f /etc/resolv.conf ; 这将为您删除文件。

重新启动系统,NetworkManager将为您生成一个resolv.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.