What overwrites /etc/resolv.conf on every boot?
Solution 1
-
You shouldn't manually update your
resolv.conf
, because all changes will be overwritten by data that your local DHCP server provides. If you want it to be static, runsudo dpkg-reconfigure resolvconf
and answer "no" to dynamic updates. If you want to add new entries there, edit/etc/resolvconf/resolv.conf.d/base
and runsudo resolvconf -u
, it will append your entries and DHCP server's entries. -
Try to edit your
/etc/network/interfaces
and add your entries there, likeauto eth0 iface eth0 inet dhcp dns-search google.com dns-nameservers dnsserverip
and then restart /etc/init.d/networking restart
or sudo ifdown -a
and sudo ifup -a
- Your system uses udhcp which is a very small DHCP client program. The udhcp client negotiates a lease with the DHCP server and notifies a set of scripts when a leases is obtained or lost. You can read about it's usage here or just edit this script (as you did).
Solution 2
Ubuntu 16.04
If the network interfaces for your server instance is controlled by DHCP, the dhclient program will overwrite your /etc/resolv.conf
file whenever the networking service is restarted.
You can fix the issue by editing the /etc/dhcp/dhclient.conf
file and adding “supersede” statements for domain-name, domain-search and domain-name-servers as follows:
supersede domain-name "local.com";
supersede domain-search "local.com";
supersede domain-name-servers 192.168.56.103;
In this particular case the name server is located at "192.168.56.103" and the domain name is "local.com"
Note that each line is terminated by a semi-colon and the domain name is enclosed in double quotes.
Solution 3
I ran into this too. Commenting out domain-name-server
didn't fix it for me either.
Also, I'm not using resolvconf
, just plain /etc/resolv.conf
.
I didn't try using chattr +i
to lock down resolv.conf
because it seems too hacky. Also, I want Puppet to be able to modify resolv.conf
when necessary.
The best solution I found overrides the default behavior of dhclient
using its documented hooks.
Create a new file at /etc/dhcp/dhclient-enter-hooks.d/nodnsupdate
with the following contents:
#!/bin/sh
make_resolv_conf() {
:
}
Then make the file executable:
chmod +x /etc/dhcp/dhclient-enter-hooks.d/nodnsupdate
Now when dhclient runs -- either on reboot or when you manually run sudo ifdown -a ; sudo ifup -a
-- it loads this script nodnsupdate
. This script overrides an internal function called make_resolv_conf()
that would normally overwrite resolv.conf
and instead does nothing.
This worked for me on Ubuntu 12.04.
Solution 4
To make the DNS related changes in resolv.conf
permanent, you need to change the DHCP configuration file named dhclient.conf
. You can find the file in /etc/dhcp/dhclient.conf
.
Open the file for editing (don't forget to use sudo). You’ll see lines like these:
#supersede domain-name "fugue.com home.vix.com";
#prepend domain-name-servers 127.0.0.1;
Remove the preceding “#” and use the domain-name and/or domain-name-servers which you want. Save it. Now the DNS related changes will be permanent (i.e. inside resolv.conf
file).
Credits goes to: https://itsfoss.com/resolvconf-permanent-ubuntu/
Solution 5
In Azure VMs /etc/resolv.conf
is not directly editable.
Try adding the DNS entries in your network configuration files /etc/sysconfig/network-scripts/ifcfg-eth0
and so on like below:
DOMAIN=example.com
DNS1=10.*.*.*
DNS2=10.*.*.*
DNS3=10.*.*.*
and restart the network service after saving the files. you will see the configuration will then be added into the resolve.conf as well.
Related videos on Youtube
Minix
Coming from Germany, identifiable by my love, of, commas.
Updated on September 18, 2022Comments
-
Minix over 1 year
I was given the files for a mini
linux
, that boots directly intofirefox
. It works for all it should be doing, only that I do not get an internet connection.We have 3 DNS servers in the network, which all work. I can ping them, too. But when trying to
ping google.de
orwget google.de
I get abad address
error.nslookup google.de
works for some reason.I tracked the issue down to my
resolv.conf
on the booted system not having the same contents as theresolv.conf
that I put into the.iso
file.I tried understanding all the factors that go into creating and modifying
resolv.conf
. I'm not quite sure I got it all, but I definitely didn't find my solution there.So as a last ditch effort, I tried making the
resolv.conf
file immutable using:~# chattr +i /etc/resolv.conf
When rebuilding and booting again to my surprise my file was renamed to
resolv.conf~
and in its place was the same standard file that has been haunting me.The file contents make me believe it gets the information from the network itself. When starting the
.iso
in Virtualbox without internet access, my file is being kept as it is.I tried changing
/etc/dhcp/dhclient.conf
to not get the information from the net, by deletingdomain-name-server
anddomain-name-search
from therequest
part of the file.Didn't work unfortunately.
I don't have the NetworkManager installed. The iso is based on Ubuntu 14.04.
There is probably vital information missing. I'm happy to provide it.
UPDATE:
I think I found the file that clears
resolv.conf
.It seems to be
/usr/share/udhcpc/default.script
#!/bin/sh # udhcpc script edited by Tim Riker <[email protected]> [ -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
It's part of the
udhcpc
program. A tiny dhcp client, that is part ofbusybox
Will investigate further.
UPDATE2 AND SOLUTION:
I commented the part out (#Start to #End), that seemingly overwrites the
/etc/resolv.conf
file and sure enough. That was the culprit. So an obscure script caused all this trouble.I changed the question to reflect, what actually needed to be known to solve my problem, so it would be easier to find for people with the same problem and so I could accept an answer.
Thanks for the help here in figuring things out.
-
doneal24 over 9 yearsSetting the immutable flag on resolv.conf doesn't work as you expected as the file was not changed. The directory entry in /etc was changed when the file was renamed. You'd have to set /etc to be immutable - something you really don't want to do.
-
Minix over 9 years@DougO'Neal I see. Thanks for the heads up.
-
-
Minix over 9 yearsI did add the entries into the
/etc/resolvconf/resolv.conf.d/base
and ranresolvconf -u
. It didn't work, unfortunately. -
kirill-a over 9 yearsHave you tried to run sudo dpkg-reconfigure resolvconf? After running resolvconf -u, your entries wasn't in result file? How did you add them, like "nameserver 127.0.0.1" or "search google.com"?
-
Minix over 9 yearsI did run
dpkg-reconfigure resolvconf
. The entries were not in there. And I have entries with bothnameserver ip
andsearch domain
. -
kirill-a over 9 yearsNo, running
dpkg-reconfigure resolvconf
won't add entries, but you can disable automatic updates. If you disable updates, you can edit resolv.conf manually and it shouldn't be overwritten. -
Minix over 9 yearsMy bad for phrasing it so clumsily, I was answering your comment sentence by sentence. After running
resolvconf -u
the entries were not added. -
kirill-a over 9 yearsEdited my answer, try
/etc/network/interfaces
-
Minix over 9 yearsI already thought of that, too. Didn't work unfortunately. I have the feeling, that there is something simple, that my predecessor removed or configured, which I don't know about, since I'm not fit with networking under Linux.
-
Minix over 9 yearsI found the particular problem I had, but all your suggestions are valid ways of solving it, too. Could you add my solution in the question to your answer, so it's all in one place and I can accept yours instead of adding my own?
-
kirill-a over 9 yearsI edited my answer and added some info about udhcp.
-
Kusalananda over 4 yearsI believe that the user in the question actually tried
chattr
, but obverved that this had no effect. -
Ashish Jain over 4 yearsThis will work for sure , The option user tried is for editing the file not for making it immutable
-
Dan Dascalescu over 4 yearsDidn't work on Ubuntu 18.04 :(
/etc/resolv.conf
was overwritten after reboot. -
Dan Dascalescu over 4 yearsUnfortunately this didn't work on Ubuntu 18.04. After rebooting,
/etc/resolv.conf
was overwritten with 127.0.0.53. -
Dan Dascalescu over 4 yearsThis answer had already been given 2 years earlier.
-
Dan Dascalescu over 4 yearsThat directory doesn't exist by default on Ubuntu 18.04. Do you need to install a service that creates it?
-
Sandjaie Ravi over 4 yearsMay be you can try this askubuntu.com/questions/1031279/…
-
Sandjaie Ravi over 4 yearsAlso check if you are running
dnsmasq
-
MAChitgarha over 3 years@DanDascalescu Not really. The main answer says you should add new lines to the file, while my answer says you should just uncomment these two lines. Also, the lines are not the same.
-
Curious Sam about 3 yearsThe simple trick is to remove /etc/resolv.conf first. Then remake it with your own name servers and search domain. Then
chattr +i /etc/resolv.conf