Как сделать dhclient осведомленным о пространстве имен?

Я использую пространства имен для разделения нескольких физических интерфейсов на сервере. Маршрутизация работает отлично. Также у меня есть папка для каждого пространства имен в / etc / netns / например /etc/netns/namespaceA/resolv.conf, так что DNS также работает нормально.

Проблема возникает при использовании DHCP с dhclient. Я запускаю dhclient из пространства имен и получаю эту ошибку.

(namespaceA)root@tc-vm:~#dhclient
RTNETLINK answers: File exists
mv: cannot move '/etc/resolv.conf.dhclient-new.2740' to '/etc/resolv.conf': Device or resource busy

Я обнаружил, что mv в /etc/resolvconf/update.d/libc содержит mv, который может вызвать проблему.

Как сделать dhclient осведомленным о пространстве имен?

1 ответ

Я сам посмотрел на проблему.

Что происходит, когда вы создаете пространство имен сети, вы видите /etc/resolv.conf хост-машины, если вы не создаете явно /etc/netns/<namespace_name>/resolv.conf, который автоматически свяжет монтирование с /etc/resolv.conf когда посмотрел вверх внутри пространства имен сети. Поэтому, просто создавая этот путь, resolv.conf хоста больше не будет виден в пространстве имен сети, которое будет иметь свое собственное resolv.conf,

Страница руководства ip netns объясняет это:

Для приложений, которые знают о сетевых пространствах имен, соглашение состоит в том, чтобы искать глобальные файлы конфигурации сети сначала в /etc/netns/NAME/, затем в /etc/. Например, если вам нужна другая версия /etc/resolv.conf для сетевого пространства имен, используемого для изоляции вашего vpn, вы бы назвали его /etc/netns/myvpn/resolv.conf.

Ip netns exec автоматизирует обработку этой конфигурации, соглашения о файлах для приложений, не подозревающих о пространстве имен сети, путем создания пространства имен монтирования и привязки, монтирующего все файлы конфигурации пространства имен в их традиционном расположении в /etc.

Насколько обновление resolv.conf, dhclient не работает в сетевых пространствах имен из коробки, когда /etc/netns/<namespace_name>/resolv.conf существует (с другой стороны, если он не существует, он перезапишет resolv.conf хост-машины, так как она доступна только одна, но это не очень желательно). Как показывает ошибка в приведенном выше вопросе, dhclient готовит временный файл с подробностями нового сервера имен в /etc/resolv.conf.dhclient-new.2740 а затем пытается переименовать его как /etc/resolv.conf, Это генерирует ошибку, потому что /etc/resolv.conf уже привязан и видимо mv не разрешено делать этот трюк.

Чтобы сделать dhclient работа в сетевых пространствах имен, /sbin/dhclient-script должны быть изменены. Я удалил это:

mv -f $new_resolv_conf /etc/resolv.conf

И заменил его на:

cat $new_resolv_conf > /etc/resolv.conf
rm -f $new_resolv_conf

Иначе, dhcpcd кажется, делает эту работу правильно.

Другие вопросы по тегам