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

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

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

(namespaceA)[email protected]:~#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, который автоматически привяжет mount к /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 работает правильно.