2016-06-29 20 views
10

Ich benutze Namespaces, um einige physische Schnittstellen auf einem Server zu trennen. Das Routing funktioniert einwandfrei. Ich habe auch einen Ordner für jeden Namespace in/etc/netns/z. /etc/netns/namespaceA/resolv.conf, damit auch DNS funktioniert.Wie kann dhclient Namespace bewusst gemacht werden?

Das Problem tritt auf, wenn DHCP mit dhclient verwendet wird. Ich führe Dhclient aus einem Namespace und erhalte diesen Fehler.

(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 

Ich fand heraus, dass die mv in /etc/resolvconf/update.d/libc ein mv enthält, die das Problem verursachen könnten.

Wie kann dhclient Namespace bewusst gemacht werden?

Antwort

6

Ich habe das Problem selbst untersucht.

Was passiert, ist, dass, wenn Sie ein Netzwerk-Namespace erstellen, geben Sie /etc/resolv.conf der Host-Maschine zu sehen, es sei denn Sie ausdrücklich /etc/netns/<namespace_name>/resolv.conf erstellen, die Halterung automatisch /etc/resolv.conf binden wird, wenn das Netzwerk-Namespace innerhalb nachgeschlagen. Daher wird resolv.conf des Hosts durch einfaches Erstellen dieses Pfades nicht mehr im Netzwerknamespace sichtbar sein, der seine eigene resolv.conf haben wird.

Die manual page von ip netns erklärt dies:

Für Anwendungen, die von Netzwerk-Namespaces bewusst sind, die Konvention zunächst in in /etc/netns/NAME/dann für die globale Netzwerkkonfigurationsdateien suchen/etc/. Wenn Sie beispielsweise eine andere -Version von /etc/resolv.conf für einen Netzwerk-Namespace verwenden möchten, der zum Isolieren von Ihres vpn verwendet wird, würden Sie ihn /etc/netns/myvpn/resolv.conf nennen.

Ip netns exec automatisiert Umgang mit dieser Konfiguration Konvention für Netzwerk-Namespace nicht bewusst Anwendungen Datei, indem Sie einen Mount-Namensraum zu schaffen und binden alle des pro Netzwerk-Namespace configure Dateien in ihren traditionellen Standort in/etc Montage.

Soweit Aktualisierung resolv.conf, dhclient nicht aus der Box in Netzwerk-Namespaces funktioniert, wenn /etc/netns/<namespace_name>/resolv.conf (auf der anderen Seite existiert, wenn es nicht vorhanden ist, wird es die resolv.conf der Host-Maschine überschreibt , da es die einzige verfügbare ist, aber das ist nicht wirklich wünschenswert). Wie der Fehler in der obigen Frage zeigt, passiert, dass dhclient eine temporäre Datei mit den neuen Nameserver-Details in /etc/resolv.conf.dhclient-new.2740 vorbereitet und dann versucht, sie als /etc/resolv.conf umzubenennen. Es erzeugt einen Fehler, weil /etc/resolv.conf bereits bind-mounted ist und anscheinend mv ist nicht erlaubt, diesen Trick zu tun.

Um dhclient in Netzwerk-Namespaces arbeiten zu können, sollte /sbin/dhclient-script geändert werden. Ich entfernte diese:

mv -f $new_resolv_conf /etc/resolv.conf 

und ersetzte sie durch:

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

Ansonsten dhcpcd scheint richtig, diesen Job zu tun.

+0

Dies ist ein cooler Workaround. Beachten Sie, dass es zwei Abschnitte gibt, in denen Sie mv in cat ändern müssen. Ich frage mich, was mv interally tut. Wird die Datei zuerst entfernt? – 0xAffe