什么会在每次启动时覆盖 /etc/resolv.conf?

Min*_*nix 40 networking dhcp udhcpc busybox resolvconf

我得到了一个 mini 的文件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
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,当重新构建并再次启动时,我的文件被重命名为resolv.conf~,取而代之的是一直困扰着我的同一个标准文件。

文件内容让我相信它是从网络本身获取信息的。.iso在没有互联网访问权限的情况下启动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
Run Code Online (Sandbox Code Playgroud)

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

将进一步调查。


更新2和解决方案:

我注释掉了这部分(#Start 到 #End),这似乎覆盖了/etc/resolv.conf文件,果然如此。那是罪魁祸首。所以一个晦涩的脚本造成了所有这些麻烦。

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

感谢您帮助解决问题。

kir*_*l-a 37

  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 
    
    Run Code Online (Sandbox Code Playgroud)

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

  1. 您的系统使用udhcp,这是一个非常小的 DHCP 客户端程序。udhcp 客户端与 DHCP 服务器协商租约,并在获得或丢失租约时通知一组脚本。您可以在此处阅读有关它的用法或只是编辑此脚本(就像您所做的那样)。

  • 我确实将条目添加到 `/etc/resolvconf/resolv.conf.d/base` 并运行了 `resolvconf -u`。不幸的是,它没有用。 (4认同)

San*_*avi 7

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

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

supersede domain-name "local.com";
supersede domain-search "local.com";
supersede domain-name-servers 192.168.56.103;
Run Code Online (Sandbox Code Playgroud)

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

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

  • 不幸的是,这在 Ubuntu 18.04 上不起作用。重新启动后,`/etc/resolv.conf` 被 127.0.0.53 覆盖。 (3认同)

小智 5

我也遇到了这个。评论domain-name-server也没有解决我的问题。

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

我没有尝试使用chattr +i锁定,resolv.conf因为它看起来太老套了。另外,我希望 Puppet 能够resolv.conf在必要时进行修改。

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

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

#!/bin/sh
make_resolv_conf() {
    :
}
Run Code Online (Sandbox Code Playgroud)

然后使文件可执行:

chmod +x /etc/dhcp/dhclient-enter-hooks.d/nodnsupdate
Run Code Online (Sandbox Code Playgroud)

现在,当 dhclient 运行时(无论是重新启动还是手动运行sudo ifdown -a ; sudo ifup -a),它都会加载此脚本nodnsupdatemake_resolv_conf()该脚本覆盖了一个通常会覆盖的内部函数resolv.conf,而不执行任何操作。

这对我在 Ubuntu 12.04 上有用。

  • 在 Ubuntu 18.04 上不起作用:(重启后`/etc/resolv.conf`被覆盖。 (2认同)