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

92

После обновления /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
источник
Что вы пытались сделать, чтобы resolv.conf мешал вам?
kingmilo

Ответы:

106

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.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
источник
«Не выполняйте« перезапуск сетевых служб », это не надежный способ отключения всех интерфейсов». У меня отлично работает. Хорошо бы знать, как это сделать.
Аки
11
Если вы не должны делать «перезапуск сервисной сети», могу ли я предложить вам не ставить его в первой строке этого вопроса? Когда я торопливо искал решение, первым делом я скопировал и вставил первую команду, которую увидел.
Робин Уинслоу
4
@RobinWinslow +1 для того, чтобы сделать мой день
Пит
8
Этот ответ от самого человека, который разработал resolvconf :)
Heemayl
2
Чтобы перезапустить / перечитать /etc/network/interfaces, вы можете сделать это ifdown eth0 && ifup eth0:; это работает даже в удаленной сессии SSH.
Пьер-Дамьен,
5

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

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

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

Спарки
источник
2

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

Камран
источник
2
Я получаюFailed to restart resolvconf.service: Unit resolvconf.service not found.
Mobigital
команда выполнена, но не регенерирована /etc/resolv.confна сервере Ubuntu 14.04
Йосеф Харуш
1

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

Редактировать /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 Это фактически половина ответа и действительно хороший пример встроенного синтаксического анализа sed. Если вы хотите увидеть, как это происходит, просто запустите первую часть команды и посмотрите, как она разбирает /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
источник
К сожалению, не могу использовать это. Мой интерфейс управляется сетевым менеджером и DHCP, поэтому /etc/network/interfacesв этом случае его добавление недопустимо. (Ubuntu 14.04)
Tino
1

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

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

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

trogne
источник
неизвестный интерфейс. Все действительно знают, как запутать детали здесь ... Я думаю, что мы должны стремиться к контейнеризации всех команд. Полный сценарий для каждого, без прозы.
Математика
1

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

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

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

Рафаэль
источник
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
источник
0

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

sudo service network-manager restart
Руслан
источник
-3

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

cat /etc/network/interfaces |sed 's/#.*$//'|grep dns-|sed 's/dns-//g'|sudo resolvconf -a eth0.inet
BDenis
источник
3
Можете ли вы объяснить, почему эта команда должна работать?
α14sнιη
1
Это не будет работать правильно, если у вас в строке более одного IP-адреса сервера имен dns-nameserver IP1 IP2. Строка должна быть повторена resolv.conf, но это не так.
Тино
Кроме того, /etc/network/interfacesиспользует dns-nameservers(обратите внимание sна в конце), а resolvconfиспользует nameserver. Команда не справляется с этим. И даже если бы все было правильно, трубопровод sed | grep | sedопределенно был бы не самым эффективным способом.
Мелебиус