Как мне получить resolvconf для регенерации resolv.conf после изменения / etc / network / interfaces?

77

После обновления /etc/network/interfaces с чем-то очень похожим ниже, как мне получить /etc/resolv.conf для обновления? Я пробовал (как root) resolver -u , service networking restart , но они не работали. Я также исправил символическую ссылку для resolv.conf и снова попробовал resolver -u . Наконец, в отчаянии я перезагрузился, что устранило проблему, перестроив /etc/resolv.conf .

Ubuntu 12.04, 64-битный сервер, установлены все последние исправления.

Пример /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 03.12.2012 в 13:59
источник

9 ответов

94

service networking restart не всегда является надежным способом снижения всех интерфейсов.

Команда resolvconf -u обновляет resolv.conf из собственной базы данных resolvconf. Вам необходимо обновить базу данных.

Чтобы обновить базу данных, вы должны вызвать resolvconf с опцией -a или -d . Это происходит за кулисами при запуске ifup или ifdown. Итак, как обычно, как и при любом другом изменении /etc/network/interfaces , чтобы активировать изменения в параметрах dns- *, вы должны указывать этот интерфейс, и если это произойдет снова. Или вы можете перезагрузиться.

Если вы хотите вносить изменения в интерфейс без ifdownupping (возможно, потому, что вы управляете машиной удаленно и подключаетесь через этот интерфейс, natch), вы можете добиться того же результата, запустив resolvconf непосредственно из командной строки , Это требует немного больше знаний о семантике resolvconf. Предположим, что соответствующая / e / n / i строфа

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

, где FFFF является семейством адресов («inet» или «inet6»).

Чтобы активировать эти dns- * параметры, вы запускаете resolvconf следующим образом (да, с символами новой строки в строке, переданной в resolvconf).

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

Для строфы, заданной в вопросе, это будет следующее.

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

Для получения дополнительной информации обратитесь к справочной странице resolvconf (8) и файлу README пакета resolvconf (/usr/share/doc/resolvconf/README.gz).

    
ответ дан jdthood 03.12.2012 в 20:23
источник
20

Несмотря на то, что man-страница не установлена по умолчанию, она документирована с помощью опции сценариев обновления, просто запустите:

sudo resolvconf -u
    
ответ дан user267617 10.04.2014 в 23:32
4

Для удаленного управления серверами вы можете:

  1. обновите строку dns-nameservers в /etc/network/interfaces
  2. # ifdown eth01; ifup eth01

Обратите внимание, что это должно быть в одной строке, деленной на; (разделитель командной строки linux). Вы даже не должны терять свое текущее соединение. Исключение составляет опечатка в файле интерфейсов. Если это произойдет, ifup не удастся, и вам придется иметь физический доступ или другое соединение ethxx .

    
ответ дан sparky 24.01.2015 в 00:14
2

service resolvconf restart будет регенерировать /etc/resolv.conf файла без особых проблем.

    
ответ дан Kamran 10.02.2016 в 15:03
0

В 18.04, следующее работает надежно (выполняется как root):

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

Важно: Убедитесь, что у вас установлен пакет resolvconf .
По-видимому, это не по умолчанию, и без него некоторые (!) Изменения от /etc/network/interfaces игнорируются молча (например, dns-* ).

    
ответ дан Raphael 09.05.2018 в 13:49
0

Этот ответ аналогичен приведенному выше, но использует конфигурацию примера вопросов для ответа на вопрос. Плюс это объясняет, почему нужны обе команды.

Изменить /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

Эти изменения не будут выполняться, если вы не перезагрузите или не перезагрузите файл конфигурации:

Чтобы обновить файл интерфейса в реальном времени, необходимо выполнить следующую команду:

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

Это позволяет обновлять интерфейс без перезагрузки или перезагрузки.

Однако указанные выше изменения команды будут потеряны после перезагрузки, если изменения в /etc/network/interfaces не будут выполнены.

Кстати, последний ответ BDenis в этом списке фактически работает вместо последней команды, анализируя файл /etc/network/interfaces и прокладывая эти строки в команду sudo resolvconf -a eth0 . Это фактически половина ответа и действительно хороший пример inline sed parsing. Если вы хотите посмотреть, как это происходит, просто запустите первую часть команды и посмотрите, как она анализирует файл /etc/network/interfaces и выплевывает всю необходимую информацию, необходимую для выполнения команды sudo resolvconf -a eth0 :

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

Обратите внимание, что это приведет к тому же, что и команда:

echo "nameserver 192.168.3.45
nameserver 192.168.8.10
search example.com"

При условии, что файл /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
    
ответ дан user3199107 22.06.2015 в 23:37
0

Простой ответ:

Просто установите resolvconf. apt install resolvconf

После этого ifup eth0 обновляет dns в etc/resolv.conf , в соответствии с линией dns-nameservers в /etc/network/interfaces .

    
ответ дан trogne 03.05.2017 в 01:14
0

Это сработало для меня:

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

Настройте соответствующим образом.

    
ответ дан jbgeek 08.09.2017 в 01:21
-3

Также вы можете попробовать эту команду:

cat /etc/network/interfaces |sed 's/#.*$//'|grep dns-|sed 's/dns-//g'|sudo resolvconf -a eth0.inet
    
ответ дан BDenis 09.10.2014 в 15:07