VirtualBox Images kopieren; Netzwerkinterfaces eth0, eth1, eth2…; Netzwerk funktioniert nicht?

Kopiert man VirtualBox Images mit Linux-Systemen als Gast (zumindest Ubuntu und Debian, ggf. weitere), funktionieren oftmals die Netzwerkeinstellungen nicht mehr.

Dies liegt daran, dass bei VirtualBox i.d. Regel nur das Festplatten-Image, nicht jedoch die Konfiguration der virtuellen Hardware kopiert wird (wie das z.B. bei vmWare der Fall ist). Vergleichbar ist dies also mit dem Einbau der Festplatte in eine andere Rechner-Hardware.

Um zu verhindern, dass Netzwerkkonfigurationen z.B. durch den Einbau neuer Hardware ungültig werden, werden die Konfigurationen (z.B. für das Device eth0) an die Hardwareadresse (MAC-Adresse) der jeweiligen Netzwerkkarte gebunden.

Das heisst also:

  • bei der Neuinstallation eines Linux-Systems befindet sich eine Netzwerkkarte im Rechner
  • diese wird als eth0, also als erstes Netzwerkdevice am Bus identifiziert
  • das Betriebssystem speichert in der Datei /etc/udev/rules.d/70-persistent-net.rules die Zuordnung dieser Netzwerkkarte (über die MAC-Adresse) zum Devicenamen „eth0“
  • die Netzwerkkarte bzw. das Netzwerk wird konfiguriert (feste IP-Adresse vs. DHCP etc.) in der Datei /etc/network/interfaces

Der Eintrag in o.g. /etc/udev/rules.d/70-persistent-net.rules sieht ungefähr wie folgt aus:

# PCI device 0x10ec:0x8168 (r8169)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="6c:62:6d:0d:9c:93", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

Wird nun das Festplattenimage auf einen anderen Rechner kopiert, so wird i.d. Regel eine neue virtuelle Maschine angelegt, wobei VirtualBox automatisch eine zufällige MAC-Adresse für die virtuelle Netzwerkkarte erzeugt.

Beim Start erkennt das Linux-System dann ein neues Interface und trägt dieses in der Datei /etc/udev/rules.d/70-persistent-net.rules ein. Da die bisher verwendete ID (in unserem Beispiel eth0) ja bereits vergeben ist, wird entsprechend hochgezählt: Die neue virtuelle Karte erhielte dann z.B. eth1.

Da in /etc/network/interfaces die Konfiguration jeweils für das spezifische Device definiert wird (z.B. eth0), greift sie entsprechend für eth1, eth2, eth3 etc. nicht – das Netzwerk funktioniert also nicht, da das in der VM verfügbare Netzwerkdevice noch unkonfiguriert ist.

Es muss also vor dem Start des Gastes manuell eingegriffen werden. Hierfür kommen 3 Optionen in Betracht:

  1. In der neu erstellten virtuellen Maschine wird die Netzwerkkarte mit der gleichen MAC-Adresse wie im vorhandenen Image angelegt – und das Netzwerk sollte ohne weiteren Eingriff funktionieren.
  2. Die Datei /etc/network/interfaces wird manuell angepasst (in unserem Beispiel: Einträge für eth0 ändern auf eth1)
  3. Die osoleten Einträge aus der Datei /etc/udev/rules.d/70-persistent-net.rules werden geändert oder gar gelöscht (oder die ganze Datei wird gelöscht)

Für die bequeme Anpassung der Zuordnungen (in /etc/udev/rules.d/70-persistent-net.rules) hat Chuck Kozler in seinem Blog freundlicherweise ein sehr nützliches Script bereit gestellt, das bei unseren Tests sehr unproblematisch funktioniert hat:

(Credits: Script von Chuck Kozler, bitte hier klicken um den entsprechenden Artikel in seinem Blog aufzurufen)

Das Script ist inhaltlich recht selbsterklärend, denke ich – und macht es sehr bequem, wenn man VirtualBox Images an Dritte weitergeben und die Anpassung der Netzwerk Interfaces automatisieren will.


@Chuck: Thanks a lot for your work and for the permission to publish the code here as well – this really eases the process when deploying VirtualBox Images!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.