Как мне заставить resolvconf восстановить resolv.conf после изменения /etc/network/interfaces?

После обновления /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

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

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

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

Если вы хотите внести изменения в интерфейс, не отключая его (возможно, потому, что вы удаленно администрируете компьютер и подключены через этот интерфейс, естественно), то вы можете добиться того же результата, запустив 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.Xnameserver Y.Y.Y.Ysearch SSSS" | sudo resolvconf -a IIII.FFFF

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

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

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

Хотя справочная страница не установлена по умолчанию, она документируется с помощью опции update scripts, просто запустите:

sudo resolvconf -u

Для тех из вас, кто управляет своими серверами удаленно, вы можете:

  1. обновите dns-nameservers очередь в /etc/network/interfaces
  2. # ifdown eth01; ifup eth01

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

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

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

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

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

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

Редактировать /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.45nameserver 192.168.8.10search example.com" | sudo resolvconf -a eth0.inet

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

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

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

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

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

echo "nameserver 192.168.3.45nameserver 192.168.8.10search 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

На 18.04 надежно работает следующее (запуск от имени root):

systemctl stop networkingip address flush dev <device> # just to be safesystemctl start networking

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

На настольной версии Ubuntu 18.04, где нет службы networking, и resolvconf не установлен по умолчанию, мне удалось восстановить resolv.conf путем перезапуска network-manager:

sudo service network-manager restart

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

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

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

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

cat /etc/network/interfaces |sed 's/#.*$//'|grep dns-|sed 's/dns-//g'|sudo resolvconf -a eth0.inet

Видишь networking - How to prevent Juniper Network Connect breaking DNS resolutions - Ask Ubuntu

Что вы пытались сделать такого, что resolv.conf мешал вам делать?