Как сделать 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
кажется, делает эту работу правильно.