HVM Network Interface Naming mit Xen 3.2-1 und qemu-dm
Geschrieben von MoneySack in Virtualisierung, tags: hvm, qemu-dm, vifname, xenJa, gestern war es mal wieder soweit.
Nachdem ich angefangen habe mich mit (Para-)Virtualisierung unter Xen zu befassen, und damit große Erfolge gefeiert habe, habe ich nun auch angefangen mit Voll-Virtualisierung (HVM) rumzuspielen.
Soweit alles toll, funktioniert echt klasse, habe auch testhalber eine Physikalische Maschine in eine HVM umgezogen.
Da nicht nur eigene VMs auf dem Server laufen, sondern auch einige Kundensysteme, muss ich auch in der Lage sein, den Netzwerk-Traffic zu überwachen (z.B. mit SNMP) und ggfs. Firewall-Regeln über das Host-System einzubinden.
Das funktioniert mit Para-Virtualisierten VMs prima, da der Parameter “vifname=XXX” in der jeweiligen Konfigurations-Datei berücksichtigt wird, und man somit eine eindeutige Zuordnung der Interfaces zur VM hat.
Bei Voll-Virtualisierten VMs wird dieser Parameter auch ausgewertet, und es wird auch ein Interface mit dem Namen angelegt, jedoch wird dieses nie genutzt, da für HVMs ein Hilfskonstrukt über den “qemu-dm” aufgebaut wird.
Dieser legt selbst auch nochmal ein Interface an, allerdings mit einem Namen, der weder über “xm network-list” noch über andere Wege zuordbar ist. Meist lautet das Interface dann “tapX” wobei X eine Zahl von 0 beginnend ist.
Das ist großer mist, hab ich mir gedacht, und habe mich auf die Suche gemacht um das Problem zu lösen – Mit Erfolg!
Die Parameter für “qemu-dm” werden dynamisch gebaut, in der Datei “image.pyc”. Bei meiner Debian Installation liegt diese im Pfad “/usr/lib/xen-3.2-1/lib/python/xen/xend/”.
Da *.pyc Byte-Code ist, können wir hier nicht viel anfangen, aber der Source ist gleich dabei. Die Datei “image.py” im gleichen Pfad ist der Source.
Dort findet man den folgenden Abschnitt:
for devuuid in vmConfig['vif_refs']:
devinfo = vmConfig['devices'][devuuid][1]
dtype = devinfo.get('type', 'ioemu')
if dtype != 'ioemu':
continue
nics += 1
mac = devinfo.get('mac')
if mac is None:
raise VmError("MAC address not specified or generated.")
bridge = devinfo.get('bridge', 'xenbr0')
model = devinfo.get('model', 'rtl8139')
ret.append("-net")
ret.append("nic,vlan=%d,macaddr=%s,model=%s" %(nics, mac, model))
ret.append("-net")
ret.append("tap,vlan=%d,bridge=%s" % (nics, bridge))
Ich habe diesen Block wie folgt ergänzt:
for devuuid in vmConfig['vif_refs']:
devinfo = vmConfig['devices'][devuuid][1]
dtype = devinfo.get('type', 'ioemu')
if dtype != 'ioemu':
continue
nics += 1
mac = devinfo.get('mac')
if mac is None:
raise VmError("MAC address not specified or generated.")
difname = devinfo.get('vifname')
bridge = devinfo.get('bridge', 'xenbr0')
model = devinfo.get('model', 'rtl8139')
ret.append("-net")
ret.append("nic,vlan=%d,macaddr=%s,model=%s" %(nics, mac, model))
ret.append("-net")
if difname is None:
ret.append("tap,vlan=%d,bridge=%s" % (nics, bridge))
else:
ret.append("tap,vlan=%d,ifname=%s,bridge=%s" % (nics, difname, bridge))
(ACHTUNG: Einrückung beachten – Python ist da SEHR sensibel – Keine TABS benutzen!)
Und nun nicht wundern, nach dieser Änderung tut sich erstmal noch nichts. Erstmal muss aus dem Source noch wieder Byte-Code erstellt werden. Dafür nutzen wir ein kleines Skript das wie folgt aussieht und im gleichen Verzeichniss liegen sollte.
import py_compile
py_compile.compile("image.py")
Das Skript einmal mit “python ./SKRIPT.py” aufrufen.
Dann muss noch der Xen-Daemon restartet werden – das kann im laufenden Betrieb passieren (zumindest bei mir), laufende VMs werden nicht abgeschaltet und nach erfolgreichem restart von xend wieder angezeigt.
Wenn nun eine HVM neu erstellt wird mit “xm create …” wird qemu-dm ein Interface mit dem namen in “vifname=…” anlegen. Da für den eigentlichen Interface-Builder der name dann schon belegt ist, wählt dieser den üblichen Interface namen “vifx.x” – Ist aber eh egal, da dieses Interface nutzlos ist.
Ich hoffe ich konnte helfen
Money
P.S. Da ich nach einer Suche bei google festgestellt habe, dass anscheinend mehrere Leute dieses Problem haben, habe ich im Xen-Bugtracker ein Bug eröffnet, mit einem Unified Diff als Patch.
Für alle die Interesse haben, hier der Link: Bug #1437 im Xen-Bugtracker

Einträge (RSS)