2.29. Qemu
Qemu ist eine virtuelle Maschine. Es können folgende Gastsysteme benutzt werden: Linux, Windows, *BSD und Mac OS X. Es wird die komplette Hardware für das Gastsystem emuliert (siehe auch Wikipedia).
2.29.1. Vorwort
Für die allgemeine Bedienung von QEMU sehe man sich bitte die Manpage an. Für einen Screenshot von QEMU siehe bitte hier.
Der von QEMU emulierte Rechner kann über eine Bridge an das eigene Netzwerk „angeschlossen“ werden, und verhält sich dann so als wäre er am selben Switch wie der Hostrechner. Alternativ kann man QEMU auch mit SLIRP (http://slirp.sourceforge.net) betreiben, hier ist die Konfiguration einfacher und es funktioniert auch unter FreeBSD 5.x ohne root-Rechte. Der Nachteil dabei: es können keine ICMP Pakete nach draussen geschickt werden (wie z.B. für ping(8) benötigt). Normale TCP- oder UDP-Verbindungen funktionieren aber.
2.29.2. Installation von QEMU
QEMU bringt ein optionales Kernelmodul mit, was die Emulation um einiges schneller laufen lässt. Deshalb sollte man QEMU über den Port mit der Option WITH_KQEMU bauen:
# cd /usr/ports/emulators/qemu
# sudo make -DWITH_KQEMU install clean
Hierduch wird automatisch der Port kqemu-kmod mitinstalliert, der nach jedem Kernelupdate ebenfalls neu kompiliert werden muss.
Als Beispiel soll FreeBSD als Clientsystem installiert werden. Zuerst wird eine neue Imagedatei angelegt, die die Installation beherbergen soll:
# qemu-img create FreeBSD.img 4G
Damit wird eine 4 GB große Datei angelegt, die als erste Festplatte dient.
2.29.3. QEMU mit Bridge
Um die Bridge beim Start von QEMU zu erstellen, wird das folgende Skript unter /usr/local/bin/qemu_start gespeichert:
#!/bin/sh
kldstat -n kqemu || kldload kqemu
kldstat -n if_tap || kldload if_tap
kldstat -n bridge || kldload bridge
sysctl net.link.ether.bridge.enable=1
sysctl net.link.ether.bridge.config=rl0,$1
Hier muss rl0 mit der Bezeichnung der eigenen Netzwerkkarte ersetzt werden.
Außerdem qemu_start ausführbar machen mit:
# sudo chmod 755 /usr/local/bin/qemu_start
Jetzt kann QEMU mit den Parametern -net nic -net tap,script=qemu_start gestartet werden und man hat im emulierten System ein Netzwerkinterface, das sich so verhält, als sei es mit dem Hostsystem in einem physikalischen Netzwerk.
2.29.4. QEMU mit SLIRP
Die Alternative zur Bridge ist der Netzwerkmodus mit SLIRP. Hier bekommt das Netzwerkinterface des Clientsystems die IP-Informationen von der virtuellen Umgebung per DHCP. Um SLIRP benutzen zu können, muss QEMU nur mit den Parametern -net nic -net user gestartet werden.
2.29.5. Installation des Clientsystems
Nachdem die Imagedatei angelegt wurde, brauch man für die Installation nur noch ein CD-Image und kann beginnen. Wird vom CD-Laufwerk aus installiert, muss zuvor das Modul „aio“ geladen werden, da sonst Qemu beim Zugriff auf ATAPI-Geräte abbricht:
# kldstat -n aio || kldload aio
Nach der Installation von ist das Modul nicht mehr erforderlich, außer man will auf das CD-Laufwerk zugreifen.
2.29.6. Bridge
# sudo qemu -net nic -net tap,script=qemu_start -hda FreeBSD.img -cdrom 6.0-RELEASE-i386-disc1.iso -boot d -k de
2.29.7. SLIRP
# qemu -net nic -net user -hda FreeBSD.img -cdrom 6.0-RELEASE-i386-disc1.iso -boot d -k de
2.29.8. Booten des Clientsystems
Danach kann QEMU auch wie folgt gestartet werden:
2.29.9. Bridge
# sudo qemu -net nic -net tap,script=qemu_start -hda FreeBSD.img -k de
2.29.10. SLIRP
# qemu -net nic -net user -hda FreeBSD.img -k de
2.29.11. QEMU ohne Grafik
Im emulierten FreeBSD folgenden Eintrag in die Datei /boot.config machen:
-h
Außerdem in /etc/ttys die Zeile
ttyd0 "/usr/libexec/getty std.9600" dialup off secure
ersetzen durch
ttyd0 "/usr/libexec/getty std.9600" vt100 on secure
Jetzt das emulierte FreeBSD runterfahren und QEMU beenden.
QEMU nun folgendermaßen starten:
2.29.12. Bridge
# sudo qemu -net nic -net tap,script=qemu_start -hda FreeBSD.img -nographic -parallel null -k de
2.29.13. SLIRP
# qemu -net nic -net user -hda FreeBSD.img -nographic -parallel null -k de
2.29.14. Getestet mit
QEMU Version: 0.8 Host: FreeBSD 5.4-RELEASE/i386 Client: FreeBSD 6.0-RELEASE/i386
QEMU Version: 0.8 Host: FreeBSD 7.0-CURRENT/i386 Client: Linux
2.29.15. Fehler / Bugs
Sollte HZ vom Client größer sein als vom Host gibt es evtl. Timing Probleme.
Die verwendete Bridge Implementierung existiert ab FreeBSD 7.0 nicht mehr, hier if_bridge verwenden.
2.29.16. Verweise
Zuletzt geändert: 2023-07-22