Neulich packte mich die Neugierde: Gibt es ausser FreeBSD auch andere interessante Betriebssysteme? Die Antwort war "ja"... . Ok, das wusste ich schon vorher. Aber mit qemu, einer freien Alternative zu VMWare oder Virtual PC (beides wahrscheinlich C und R und sowiso TM geschuetzte eingetragene und versiegelte Worte, also Finger weg!) konnte ich damit spielen, ohne dass ich mich von meinem FreeBSD trennen musste. Die Installation von qemu lief auch sehr schšn und ich bekam mit, dass man das Kernelmodul "aio" laden muss, wenn qemu nicht unvermittelt abstuerzen soll. Das Gastsystem war installiert (Es war ein Microsoft Windows 2000)... aber es wollte nicht ins Netz. Von diesem Problem soll der Artikel handeln. Aber ordentlich und von Anfang.

Systemvoraussetzungen

Hier zunächst eine kurze Beschreibung der zugrundeliegenden Software:

Host
Hardwarex86, Notebook, 768M RAM, 30G HDD, 1600MHz wenn der powerd will.
Host-BetriebssystemFreeBSD salz 7.0-CURRENT FreeBSD 7.0-CURRENT #0: Sun Nov 19 21:42:36 CET 2006
Gast
"Hardware"x86, 128M RAM, 2G HDD, und das, was qemu so an Takt hergeben kann.
Gast-BetriebssystemMicrosoft Windows 2000 Professional

Das Problem

Vor einem halben Jahr habe ich qemu das letzte Mal benutzt. Damals funktionierte das User-Mode-Netzwerk noch wunderbar. Dabei emuliert qemu einfach an der virtuellen Netzwerkkarte einen Router und leitet anfragen von sich selbst aus weiter, einzig pings wreden verschluckt.
Dies wollte nun aber partout nicht mehr funktionieren. Keine Chance, das Netz war tot. Ich musste also in den säuerlichen Apfel beissen und ein getunneltes Device basteln.
Leider förderte meine Internetrecherche nur Dokumente zutage, die beschreiben, wie man dies mit älteren FreeBSDs löst. Die Anleitungen verwendeten noch das Modul "bridge.ko" -- welches mittlerweile aber durch "if_bridge.ko" abgelöst wurde. Und dies wird nicht mehr mittels sysctl konfiguriert sondern via ifconfig.

Die Lösung

Also hier nun ein Rezept, wie man qemu mit Bridge betrieben bekommt:

Schritt 1: Kernelmodule laden

Es werden die Kernelmodule "if_bridge.ko", "bridgestp.ko" sowie fuer qemu "aio.ko" benötigt.

Schritt 2: Bridge-Device aufsetzen

Als nächstes wird das eigentliche Bridge-Device angelegt. Dazu wird "ifconfig" wie folgt eingesetzt:
sudo ifconfig bridge0 create

Schritt 3: Die Brückenpfeiler setzen

Was nützt eine Brücke, die nichts verbinden soll (Ausnahmen, siehe Zahnarzt, ausgenommen)? Also müßen der Brücke ein- oder mehrere Devices hinzugefuegt werden. Dazu wird auch wieder "ifconfig" eingesetzt:
sudo ifconfig bridge0 addm bge0
wobei hier bge0 mein Device nach draussen in das grosse böse Internet ist. Nun muss noch fuer qemu ein Skript angelegt werden, damit es sich ein "tap"-Device erstellen und aktivieren kann... dies steht bei mir in "/etc/qemu-ifup" und enthält nur sehr wenig:
#!/bin/sh
/sbin/ifconfig $1
und ist nicht mehr als ein hauchdünner Wrapper um ifconfig.

Schritt 4: qemu starten

Man kann nun qemu die Drecksarbeit erledigen und das tap-device anlegen lassen :)
Also qemu mit entsprechenden optionen gestartet... also z.B.
/usr/local/bin/qemu -boot d -m 128 -cdrom '/usr/home/ad001/tmp/current.iso' -net nic,vlan=0 -net tap,vlan=0,ifname= -localtime
Als Reaktion darauf sollte ein Netzwerkdevice tap0 erstellt werden, dass nun ebenfalls mit ifconfig der bridge0 zugeschlagen wird...
sudo ifconfig bridge0 addm tap0
ausserdem erscheint es langsam zweckmäßig, die Bridge mal einzuschalten und mitzuteilen, wer denn die Quelle der Daten werden soll...
sudo ifconfig bridge0 -learn bge0
sudo ifconfig bridge0 up

Schritt 5: Gast-OS sollte Netz bekommen

So, nun sollte das Gastsystem eine Verbindung nach draussen haben. :)

Stichworte:


Impressum