Jak uzyskać resolvconf w celu ponownego wygenerowania resolv.conf po zmianie / etc / network / interfaces?

92

Jak zaktualizować /etc/network/interfacescoś po aktualizacji bardzo podobnej do poniższej /etc/resolv.conf? Próbowałem (jako root) resolver -u, service networking restartale nie działały. Naprawiłem także dowiązanie symboliczne resolv.confi spróbowałem resolver -uponownie. W końcu z frustracji zrestartowałem komputer, co naprawiło problem poprzez przebudowę /etc/resolv.conf.

Ubuntu 12.04, serwer 64-bitowy, wszystkie najnowsze zainstalowane łatki.

Przykład /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
źródło
Co próbowałeś zrobić, aby resolv.conf Ci to uniemożliwiło?
kingmilo,

Odpowiedzi:

106

service networking restart nie zawsze jest niezawodnym sposobem obniżania poziomu wszystkich interfejsów.

resolvconf -uDowodzenia tylko aktualizacje resolv.confz własnej bazy danych resolvconf jest. Musisz zaktualizować bazę danych.

Aby zaktualizować bazę danych, musisz wywołać resolvconf z opcją -alub -d. Dzieje się tak za kulisami, gdy uruchamiasz ifup lub ifdown. Tak więc normalnie, podobnie jak w przypadku każdej innej zmiany /etc/network/interfaces, aby aktywować zmiany w opcjach dns- *, należy przejść do danego interfejsu i ponownie. Lub możesz uruchomić ponownie.

Jeśli chcesz wprowadzić zmiany w interfejsie bez wyłączania go (być może dlatego, że administrujesz maszyną zdalnie i zdarza się, że jesteś podłączony przez ten interfejs, natch), możesz osiągnąć ten sam wynik, uruchamiając resolvconf bezpośrednio z wiersza poleceń. Wymaga to nieco większej wiedzy na temat semantyki resolvconf. Załóżmy, że odpowiednia sekcja / e / n / i to

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

gdzie FFFF jest rodziną adresów („inet” lub „inet6”).

Aby aktywować te opcje dns- *, uruchom komendę resolvconf w następujący sposób (tak, z nowymi wierszami w strumieniu do resolvconf).

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

Dla zwrotki podanej w pytaniu byłoby to następujące.

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

Więcej informacji można znaleźć na stronie podręcznika resolvconf (8) i pliku README pakietu resolvconf (/usr/share/doc/resolvconf/README.gz).

jdthood
źródło
„Nie rób„ restartu sieci serwisowej ”; to nie jest niezawodny sposób na obniżenie poziomu wszystkich interfejsów”. Działa dla mnie dobrze. Dobrze jednak wiedzieć, jak to zrobić.
Aki
11
Jeśli nie powinieneś „restartować sieci serwisowej”, czy mogę zasugerować, abyś nie umieszczał go w pierwszym wierszu tego pytania? Gdy pośpiesznie szukałem rozwiązania, pierwszą rzeczą, którą zrobiłem, było skopiowanie i wklejenie pierwszego polecenia, które zobaczyłem.
Robin Winslow
4
@RobinWinslow +1 za zrobienie mojego dnia
Pete
8
Ta odpowiedź pochodzi od osoby, która się rozwinęła resolvconf :)
heemayl
2
Aby ponownie uruchomić / ponownego odczytania /etc/network/interfaces, można to zrobić: ifdown eth0 && ifup eth0; działa nawet w zdalnej sesji ssh.
Pierre-Damien
5

Dla tych, którzy zdalnie zarządzają serwerami, możesz:

  1. zaktualizuj dns-nameserverslinię w/etc/network/interfaces
  2. # ifdown eth01; ifup eth01

Zauważ, że musi to być jedna linia podzielona; (separator linii poleceń linux). Nie powinieneś nawet tracić obecnego połączenia. Wyjątkiem jest literówka w pliku interfejsów. Jeśli tak się ifupstanie, zawiedzie i będziesz musiał mieć fizyczny dostęp lub inne ethxxpołączenie.

iskrzący
źródło
2

service resolvconf restartzregeneruje /etc/resolv.confplik bez większego zamieszania.

Kamran
źródło
2
RozumiemFailed to restart resolvconf.service: Unit resolvconf.service not found.
Mobigital
polecenie zakończone, ale nie zostało zregenerowane /etc/resolv.confna serwerze Ubuntu 14.04
Jossef Harush
1

Ta odpowiedź jest podobna do powyższej, ale wykorzystuje konfigurację przykładowego pytania, aby odpowiedzieć na pytanie. Ponadto wyjaśnia to, dlaczego oba polecenia są konieczne.

Edytuj /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

Te zmiany nie zostaną wprowadzone, chyba że uruchomisz ponownie lub ponownie załadujesz plik konfiguracyjny:

Aby zaktualizować plik interfejsów na żywo, należy uruchomić następujące polecenie:

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

Umożliwia to aktualizację interfejsu bez ponownego uruchamiania lub ponownego ładowania.

Jednak powyższe zmiany poleceń zostaną utracone po ponownym uruchomieniu, jeśli zmiany /etc/network/interfacesnie zostaną wprowadzone.

Nawiasem mówiąc, ostatnia odpowiedź z BDenis na tej liście faktycznie działa zamiast ostatniego polecenia, analizując /etc/network/interfacesplik i przesyłając te wiersze do polecenia. sudo resolvconf -a eth0 To właściwie połowa odpowiedzi i naprawdę dobry przykład wbudowanego parsowania sed. Jeśli chcesz zobaczyć, jak to działa, po prostu uruchom pierwszą część polecenia i obejrzyj go, parsując /etc/network/interfacesplik i wypluwając wszystkie niezbędne informacje potrzebne do uruchomienia sudo resolvconf -a eth0polecenia:

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

Zauważ, że spowodowałoby to takie samo wyjście jak polecenie:

echo "nameserver 192.168.3.45
nameserver 192.168.8.10
search example.com"

Pod warunkiem, że /etc/network/interfacesplik jest skonfigurowany z tymi informacjami:

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
użytkownik3199107
źródło
Niestety nie mogę tego użyć. Mój interfejs jest zarządzany przez menedżera sieci i DHCP, więc dodanie go /etc/network/interfacesnie jest prawidłową opcją w tym przypadku. (Ubuntu 14.04)
Tino
1

Prosta odpowiedź:

Wystarczy zainstalować resolvconf. apt install resolvconf

Następnie ifup eth0aktualizuje dns w etc/resolv.conf, zgodnie z dns-nameserverslinią w /etc/network/interfaces.

trogne
źródło
nieznany interfejs. Wszyscy naprawdę wiedzą, jak zaciemnić szczegóły tutaj ... Myślę, że powinniśmy dążyć do zgrupowania wszystkich poleceń. Pełny skrypt dla każdego, bez prozy.
mathtick
1

W dniu 18.04 następujące działa niezawodnie (uruchom jako root):

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

Ważne: Upewnij się, że masz resolvconfzainstalowany pakiet .
Wydaje się, że nie jest domyślnie i bez tego niektóre (!) Zmiany z /etc/network/interfacessą po cichu ignorowane (np dns-*.).

Raphael
źródło
0

To działało dla mnie:

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

Odpowiednio wyreguluj.

jbgeek
źródło
0

Na komputerowej wersji Ubuntu 18.04, gdzie nie ma usługi networkingi resolvconfnie jest instalowana domyślnie, udało mi się zregenerować resolv.confpoprzez ponowne uruchomienie network-manager:

sudo service network-manager restart
Ruslan
źródło
-3

Możesz także wypróbować to polecenie:

cat /etc/network/interfaces |sed 's/#.*$//'|grep dns-|sed 's/dns-//g'|sudo resolvconf -a eth0.inet
BDenis
źródło
3
Czy możesz wyjaśnić, dlaczego to polecenie powinno działać?
αғsнιη
1
To nie działa poprawnie, jeśli masz więcej niż jeden adres IP serwera nazw w linii dns-nameserver IP1 IP2. Linia musi zostać powtórzona resolv.conf, ale nie jest.
Tino
Co więcej, /etc/network/interfaceszastosowania dns-nameservers(zauważ sna końcu) podczas resolvconfużywania nameserver. Polecenie tego nie rozwiązuje. I nawet jeśli wszystko jest w porządku, rurociąg sed | grep | sedzdecydowanie nie byłby najbardziej wydajnym sposobem.
Melebius