Wie bringe ich resolvconf dazu, die Datei resolv.conf neu zu generieren, nachdem ich / etc / network / interfaces geändert habe?

92

/etc/network/interfacesWie kann ich ein /etc/resolv.confUpdate durchführen, nachdem ich ein Update durchgeführt habe, das dem folgenden sehr ähnlich ist ? Ich habe versucht (als root) resolver -u, service networking restartaber sie haben nicht funktioniert. Ich habe auch den Symlink für repariert resolv.confund es resolver -uerneut versucht . Schließlich habe ich frustriert einen Neustart durchgeführt, der das Problem durch einen Neustart behoben hat /etc/resolv.conf.

Ubuntu 12.04, 64bit Server, alle aktuellen Patches installiert.

Beispiel /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
nslntmnx
quelle
Was haben Sie versucht, als resolv.conf Sie davon abhielt?
Kingmilo

Antworten:

106

service networking restart Dies ist nicht immer eine zuverlässige Methode, um alle Schnittstellen nach oben zu verschieben.

Der resolvconf -uBefehl wird nur resolv.confaus der eigenen Datenbank von resolvconf aktualisiert . Sie müssen die Datenbank aktualisieren.

Um die Datenbank zu aktualisieren, müssen Sie resolvconf mit der Option -aoder aufrufen -d. Das passiert hinter den Kulissen, wenn Sie ifup oder ifdown ausführen. Normalerweise müssen Sie, wie bei jeder anderen Änderung an /etc/network/interfaces, die betreffende Schnittstelle herunter- und erneut hochfahren, um Änderungen an den dns- * -Optionen zu aktivieren. Oder Sie können neu starten.

Wenn Sie Änderungen an einer Schnittstelle vornehmen möchten, ohne sie zu unterbrechen (möglicherweise, weil Sie die Maschine remote verwalten und zufällig über diese Schnittstelle verbunden sind, natch), können Sie dasselbe Ergebnis erzielen, indem Sie resolvconf direkt über die Befehlszeile ausführen. Dies erfordert etwas mehr Kenntnisse über die Semantik von resolvconf. Angenommen, die relevante / e / n / i-Zeilengruppe lautet

iface IIII FFFF static
    address ...
    ...
    dns-nameservers X.X.X.X Y.Y.Y.Y
    dns-search SSSS

Dabei ist FFFF eine Adressfamilie ("inet" oder "inet6").

Um diese dns- * -Optionen zu aktivieren, führen Sie resolvconf wie folgt aus (ja, mit Zeilenumbrüchen in der Zeichenfolge, die an resolvconf weitergeleitet werden).

echo "nameserver X.X.X.X
nameserver Y.Y.Y.Y
search SSSS" | sudo resolvconf -a IIII.FFFF

Für die in der Frage angegebene Strophe wäre dies die folgende.

echo "nameserver 192.168.3.45
nameserver 192.168.8.10
search example.com" | sudo resolvconf -a eth0.inet

Weitere Informationen finden Sie in der Handbuchseite zu resolvconf (8) und in der README-Datei zum resolvconf-Paket (/usr/share/doc/resolvconf/README.gz).

jdthood
quelle
"Führen Sie keinen Neustart des Servicenetzwerks durch. Dies ist keine zuverlässige Methode, um alle Schnittstellen zu reduzieren." Funktioniert gut für mich. Gut zu wissen, wie man es sauber macht.
Aki
11
Wenn Sie keinen "Neustart des Servicenetzwerks" durchführen sollten, kann ich vorschlagen, dass Sie ihn nicht in die erste Zeile dieser Frage stellen? Als ich hastig nach einer Lösung suchte, war das erste, was ich tat, das Kopieren und Einfügen des ersten Befehls, den ich sah.
Robin Winslow
4
@ RobinWinslow +1 für meinen Tag
Pete
8
Diese Antwort stammt von der Person, die sich selbst entwickelt hat resolvconf :)
heemayl
2
Zum Neustart / reread /etc/network/interfaces, können Sie das tun: ifdown eth0 && ifup eth0; Es funktioniert sogar in einer Remote-SSH-Sitzung.
Pierre-Damien,
5

Für diejenigen von Ihnen, die Ihre Server remote verwalten, haben Sie folgende Möglichkeiten:

  1. Aktualisieren Sie die dns-nameserversZeile in/etc/network/interfaces
  2. # ifdown eth01; ifup eth01

Beachten Sie, dass dies in einer Zeile mit geteilt werden muss; (das Linux-Kommandozeilen-Trennzeichen). Sie sollten nicht einmal Ihre aktuelle Verbindung verlieren. Die Ausnahme ist ein Tippfehler in der Interface-Datei. In diesem Fall ifupschlägt der Vorgang fehl und Sie müssen über physischen Zugriff oder eine andere ethxxVerbindung verfügen .

funkelnd
quelle
2

service resolvconf restartwird die /etc/resolv.confDatei ohne viel Aufhebens neu generieren.

Kamran
quelle
2
Ich bekommeFailed to restart resolvconf.service: Unit resolvconf.service not found.
Mobigital
Befehl abgeschlossen, aber nicht /etc/resolv.confauf Ubuntu Server 14.04 neu
generiert
1

Diese Antwort ähnelt der obigen, verwendet jedoch die Beispielkonfiguration für Fragen, um die Frage zu beantworten. Außerdem wird erklärt, warum beide Befehle erforderlich sind.

Bearbeiten /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-nameserver 192.168.3.45
    dns-nameserver 192.168.8.10

Diese Änderungen werden erst wirksam, wenn Sie die Konfigurationsdatei neu starten oder laden:

Um die Interface-Datei live zu aktualisieren, muss der folgende Befehl ausgeführt werden:

echo "nameserver 192.168.3.45
nameserver 192.168.8.10
search example.com" | sudo resolvconf -a eth0.inet

Dies ermöglicht ein Update der Schnittstelle ohne Neustart oder Neuladen.

Die obigen Befehlsänderungen gehen jedoch nach einem Neustart verloren, wenn die Änderungen in der /etc/network/interfacesnicht vorgenommen werden.

Übrigens funktioniert die letzte Antwort von BDenis in dieser Liste tatsächlich anstelle des letzten Befehls, indem die /etc/network/interfacesDatei analysiert und diese Zeilen in den Befehl eingefügt werden. sudo resolvconf -a eth0 Es ist tatsächlich die halbe Antwort und ein wirklich gutes Beispiel für das Inline-Sed-Parsen. Wenn Sie sehen möchten, wie dies funktioniert, führen Sie einfach den ersten Teil des Befehls aus und beobachten Sie, wie er die /etc/network/interfacesDatei analysiert und alle erforderlichen Informationen ausgibt, die Sie zum Ausführen des sudo resolvconf -a eth0Befehls benötigen :

sed 's/#.*$//' /etc/network/interfaces | grep dns- | sed 's/dns-//g'

Beachten Sie, dass dies die gleiche Ausgabe wie der Befehl erzeugen würde:

echo "nameserver 192.168.3.45
nameserver 192.168.8.10
search example.com"

Vorausgesetzt, die /etc/network/interfacesDatei ist mit diesen Informationen konfiguriert:

iface eth0 inet static
    address 192.168.3.3
    netmask 255.255.255.0
    gateway 192.168.3.1
    dns-search example.com
    dns-nameserver 192.168.3.45 
    dns-nameserver 192.168.8.10
user3199107
quelle
Kann das leider nicht nutzen. Meine Schnittstelle wird vom Netzwerkmanager und von DHCP verwaltet, daher ist das Hinzufügen zu /etc/network/interfacesin diesem Fall keine gültige Option. (Ubuntu 14.04)
Tino
1

Einfache antwort:

Installieren Sie einfach resolvconf. apt install resolvconf

Danach wird ifup eth0die DNS in etc/resolv.confentsprechend der dns-nameserversZeile in aktualisiert /etc/network/interfaces.

trogne
quelle
unbekannte Schnittstelle. Jeder weiß hier wirklich, wie man die Details verschleiert ... Ich denke, wir sollten uns zum Ziel setzen, alle Befehle in Containern zu speichern. Vollständiges Skript für jeden, keine Prosa.
Mathtick
1

Am 18.04 funktioniert Folgendes zuverlässig (als root ausführen):

systemctl stop networking
ip address flush dev <device> # just to be safe
systemctl start networking

Wichtig: Stellen Sie sicher, dass Sie das Paket resolvconfinstalliert haben.
Es scheint nicht standardmäßig zu sein, und ohne es werden einige (!) Änderungen von /etc/network/interfacesunbemerkt ignoriert (zB dns-*).

Raphael
quelle
0

Das hat bei mir funktioniert:

sed -re '/nameservers|dns-search/ !d' -e 's/dns-nameservers/nameserver/' -e 's/dns-search/search/' /etc/network/interfaces  | resolvconf -a eth0.inet && resolvconf -u

Dementsprechend anpassen.

jbgeek
quelle
0

In der Desktop-Version von Ubuntu 18.04, in der es keinen Dienst networkinggibt und resolvconfdie nicht standardmäßig installiert ist, ist es mir gelungen, die Neuerstellung resolv.confdurch einen Neustart durchzuführen network-manager:

sudo service network-manager restart
Ruslan
quelle
-3

Sie können auch diesen Befehl versuchen:

cat /etc/network/interfaces |sed 's/#.*$//'|grep dns-|sed 's/dns-//g'|sudo resolvconf -a eth0.inet
BDenis
quelle
3
Können Sie erklären, warum dieser Befehl funktionieren sollte?
α Octsнιη
1
Dies funktioniert nicht richtig, wenn Sie mehr als eine Nameserver-IP in der Zeile haben dns-nameserver IP1 IP2. Die Zeile muss dann wiederholt werden resolv.conf, ist es aber nicht.
Tino
Darüber hinaus /etc/network/interfacesverwendet dns-nameservers(beachten Sie die sam Ende), während resolvconfverwendet nameserver. Der Befehl behandelt es nicht. Und selbst wenn alles in Ordnung sed | grep | sedwäre , wäre die Pipeline definitiv nicht der effizienteste Weg.
Melebius