QEMU
Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:
Ubuntu 22.04 Jammy Jellyfish
Du möchtest den Artikel für eine weitere Ubuntu-Version testen? Mitarbeit im Wiki ist immer willkommen! Dazu sind die Hinweise zum Testen von Artikeln zu beachten.
Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:
QEMU 🇬🇧 ist ein freier Emulator und Virtualisierer. Mit ihm ist es möglich, ein anderes Betriebssystem unter Linux zu booten, die Ausgaben in einem Fenster anzuzeigen, und es dann so zu benutzen, als sei es nativ auf einem Rechner gestartet worden. Eine grundsätzliche Einführung zu diesem Thema findet man im Artikel Virtualisierung.
Einige Merkmale von QEMU sind:
läuft in Kombination mit KVM als Hypervisor mit fast nativer Geschwindigkeit
kann auch andere Prozessorarchitekturen wie z.B. PowerPC oder ARM emulieren
kann verschiedene Arten von Laufwerken emulieren und einbinden
sehr viele Optionen zum Starten des Gastsystems, wie z.B. Multiprozessor-Emulation auch bei Einprozessor-Systemen
QEMU ist auch für andere Plattformen 🇬🇧 wie Windows und MacOS erhältlich.
Installation¶
Im Paket von QEMU ist auch KVM enthalten; es kann durch folgendes Paket installiert [1] werden:
qemu-system-x86
Befehl zum Installieren der Pakete:
sudo apt-get install qemu-system-x86
Oder mit apturl installieren, Link: apt://qemu-system-x86
Dieses Paket unterstützt nur Gastsysteme mit x86-Architektur (32- und 64-Bit). Möchte man andere Hardware-Plattformen emulieren, kann man die Unterstützung von anderen Systemen mit dem Paket qemu-system installieren. Es handelt sich dabei um ein Meta-Paket, dass die Pakete für alle verfügbaren Zielsysteme installiert.
qemu-system
Befehl zum Installieren der Pakete:
sudo apt-get install qemu-system
Oder mit apturl installieren, Link: apt://qemu-system
Symlink¶
Danach kann noch eine Verknüpfung auf die gewünschte Standard-Systemarchitektur (typischerweise i386
bzw. x86_64
) gesetzt werden:
sudo ln -s /usr/bin/qemu-system-ARCHITEKTUR /usr/bin/qemu
ARCHITEKTUR
ist dabei durch die gewünschte Prozessorarchitektur zu ersetzen.
QEMU User Mode¶
Wenn man nur den QEMU User Mode installieren möchte:
qemu-user
Befehl zum Installieren der Pakete:
sudo apt-get install qemu-user
Oder mit apturl installieren, Link: apt://qemu-user
Hypervisor und Emulator¶
Laufen Host- und Gastsystem auf der gleichen Rechnerarchitektur (z.B. x86_64), kann QEMU durch das mitinstallierte KVM als Hypervisor arbeiten. Dann läuft der Gast direkt auf dem Prozessor des Host und ist damit ähnlich schnell, wie eine native Installation. Wie man herausfindet, ob der Host diese Hardwarevirtualisierung unterstützt, wird im Artikel KVM beschrieben.
Bei Gastsystemen, die auf einer anderen Rechnerarchitektur laufen, emuliert QEMU die Zielarchitektur. Dadurch wird die Geschwindigkeit des Gast gegenüber einem nativen System deutlich reduziert.
Grafische Oberflächen und Kommandozeilentools für QEMU¶
Dieser Artikel beschreibt ausschließlich die Einrichtung und Startparameter für QEMU direkt über ein Terminal[3]. Der Vollständigkeit halber seien hier aber noch einige grafische Programme für QEMU aufgeführt, die den Einstieg in QEMU wesentlich erleichtern. Sie sind nach den verwendeten graphischen Toolkits sortiert.
Installation eines Gastbetriebssystems¶
Alle folgenden Befehle werden in einem Terminal [3] eingegeben.
Virtuelle Festplatte einrichten¶
Um ein Betriebssystem in einer Virtuellen Maschine installieren zu können, muss als erstes eine virtuelle Festplatte als Datei erstellt werden:
qemu-img create BOOTSYSTEM.img 10G
Anstatt BOOTSYSTEM
sollte man einen geeigneten Namen wählen. In diesem Fall erstellt man ein 10 GB großes Festplattenimage im raw-Format. Man kann die Größe des Image auch in MiB angeben, also bezogen auf das obige Beispiel 10240M
(10 * 1024) statt 10G
.
Je nachdem, in welcher Art von Dateisystem dieses Image liegt, wächst die Datei ggf. erst dann dynamisch an, wenn tatsächlich Daten darin gespeichert werden. Damit ist sie anfangs 0 Bytes groß, auch wenn die meisten Programme (z.B.) 10 GiB zeigen. Dies ist z.B. bei einer typischen Ubuntu-Installation auf einem ext-Dateisystem der Fall (bezogen auf das Host-System; der Gast in der VM ist egal). Möchte man solche Sparse-Dateien auch auf älteren Dateisystemen nutzen oder andere Verbesserungen nutzen, so kann man ein anderes Format wie qed
oder qcow2
angeben:
qemu-img create -f qcow2 BOOTSYSTEM.img 10G
Installation von CD oder CD-Image¶
Wenn das Festplattenimage erstellt ist, kann man nun ein Betriebssystem darin installieren. Es sollte dabei von vornherein bedacht werden, welche Arbeitsspeicher-Anforderungen (RAM) das zu installierende System hat. Entsprechend wird QEMU mit der Option -m SPEICHERGRÖSSE
gestartet. Richtwerte können der Tabelle in Gastsystem entnommen werden.
Start des Installationsvorgangs mittels CD-ROM-Laufwerk, es wird dem Gastsystem 2048 MiB Speicher zur Verfügung gestellt:
qemu-system-ARCHITEKTUR -enable-kvm -hda BOOTSYSTEM.img -cdrom /dev/cdrom -boot d -m 2048
Das -boot d
bedeutet, dass QEMU von CD-ROM booten soll. Wenn die Installations-CD als ISO-Image vorliegt, geht das analog dazu:
qemu-system-ARCHITEKTUR -enable-kvm -hda BOOTSYSTEM.img -cdrom DATEINAME.iso -boot d -m 2048
Bei ARCHITEKTUR ist die festgelegte Standard-Architektur einzufügen (für AMD64 lautet der Befehl beispielsweise qemu-system-x86_64
)
Nach erfolgreicher Installation muss die Option -boot d
weggelassen werden, damit anstatt vom CD-ROM-Laufwerk von der virtuellen Festplatte gebootet wird. Ein ISO-Abbild (Abbild-Datei) beispielsweise einer Installations-DVD von Windows kann man mit einem Brennprogramm erstellen. QEMU kommt mit ISO-Images besser zurecht als mit DVDs.
Overlay-Images anlegen¶
QEMU bietet die Möglichkeit, mit Overlay-Dateien (übersetzt: "Überlagerungsdateien") zu arbeiten. Dabei werden neue und geänderte Daten nicht in die Original Imagedatei sondern in die Overlay-Datei geschrieben. Das original Image bleibt unverändert. Diese ist z.B. dann praktisch, wenn man eine "saubere" Grundinstallation eines Systems hat und "Experimente" mit dem Overlay-Image gemacht werden, welche sich nicht auf das Original auswirken. Ebenso kann man mehrere Overlays für ein Image anlegen.
Um ein Overlay-Image anzulegen dient folgender Befehl:
qemu-img create -b mein_image.img -F <Format von mein_image.img, z.B. qcow2> -f qcow2 mein_overlay.ovl
Der Name der Overlay-Datei kann dabei beliebig sein und muss nichts mit den Namen des Images zu tun haben. Danach kann man die virtuelle Maschine normal booten, nur dass anstatt des Images die Overlay-Datei als Festplatte angegeben werden muss, also z.B.
qemu -hda mein_overlay.ovl
Hinweis:
Die Overlay-Dateien sind "Delta-Images", d.h. in der Overlay-Datei werden Änderungen relativ zum Original Image gespeichert. Ändert man das zugrunde liegende Image, nachdem eine Overlay-Datei angelegt wurde, funktioniert die Overlay-Datei nicht mehr!
Es ist auch möglich, Änderungen der Overlay-Datei ins zugrunde liegende Image zu schreiben.
Festplatten von Virtualbox in QEMU nutzen¶
Für den Fall, dass man bereits existierende virtuelle Festplatten im VirtualBox-Format .vdi nutzt, kann man diese für QEMU nutzbar machen.
VBoxManage clonehd /pfad/zur/virtualbox_platte/system.vdi /pfad/zur/kvm_platte/system.img --format raw
Je nach Größe des Abbildes kann die Konvertierung einige Zeit in Anspruch nehmen.
Vollständige Kommandozeile zum Starten von QEMU¶
Eine beispielhafte, vollständige Kommandozeile zum Starten eines Lubuntu-Image:
qemu-system-x86_64 \ -enable-kvm \ -cpu host \ -machine q35 \ -device amd-iommu \ -m 4096 \ -smp 4 \ -device virtio-vga-gl -display sdl,gl=on \ -device intel-hda -device hda-duplex \ -device virtio-serial -chardev spicevmc,id=vdagent,debug=0,name=vdagent \ -device virtserialport,chardev=vdagent,name=com.redhat.spice.0 \ -hda lubuntu/lubuntu22.04.qcow2 \ -name "Lubuntu 22.04"
QEMU Umgebung¶
Während das Betriebssystem installiert wird, sollte man sich mit der Umgebung von QEMU etwas vertraut machen.
Tastenkombinationen¶
Tastenkombination von QEMU | |
Tasten | Erklärung |
Strg + Alt | Maus aus dem QEMU-Fenster befreien |
Strg + Alt + 2 | vom Gast in den QEMU-Monitor wechseln |
Strg + Alt + 1 | vom QEMU-Monitor ins Gast-Betriebssystem wechseln |
Strg + Alt + F | zwischen Fenster- und Vollbildmodus wechseln |
QEMU-Monitor¶
Der Monitor von QEMU (manchmal auch QEMU-Konsole genannt) bietet eine Reihe von Möglichkeiten zur Verwaltung und Steuerung der virtuellen Maschine. So kann hierüber auch der Wechsel von CD-ROM-Medien oder Disketten erfolgen.
Einige davon sind:
Befehle für den QEMU-Monitor | |
Befehl | Erklärung |
info GERÄT | gibt Infos über das virtuelle Gerät aus; mögliche Geräte sind u.a. block (Festplatte[n], CD-ROM), snapshot , usb und network |
change GERÄT GERÄTEDATEI | Tauscht ein Wechselmedium (CD/DVD, Diskette) aus (siehe: Wechseldatenträger) |
commit | schreibt einen Snapshot, sofern QEMU mit der Option -snapshot gestartet wurde |
screendump DATEI | erstellt ein Bildschirmfoto, wobei das recht ungewöhnliche Dateiformat ppm verwendet wird. Beispiel: screendump BILDNAME.ppm |
sendkey ctrl-alt-f1 | sendet die Tastenkombination Strg + Alt + F1 an das Gastsystem (ruft in einem Ubuntu-Gast die virtuelle Konsole auf) |
help [befehl] | zeigt eine Hilfe für alle Befehle oder nur für den Befehl befehl |
Wechseldatenträger¶
QEMU kann während der Virtualisierung nicht automatisch feststellen, ob eine CD oder Diskette eingelegt oder gewechselt wurde. Dies wird über den QEMU-Monitor erledigt. Im QEMU-Monitor erkundigt man sich über den Befehl info block
zuerst, welche Geräte angeschlossen sind und wie sie heißen:
info block ide1-cd0: type=cdrom removable=1 locked=0 file=/dev/cdrom ro=0 drv=host_cdrom encrypted=0 ide0-hd0: type=hd removable=0 file=/PFAD/ZUM/CONTAINER.img ro=0 drv=qcow2 encrypted=0 ...
In diesem Beispiel heißt das CD-ROM-Gerät ide1-cd0
und die Gerätedatei /dev/cdrom. Entsprechend wird QEMU durch die Eingabe von
change ide1-cd0 /dev/cdrom
mitgeteilt, dass eine CD eingelegt/gewechselt wurde, und man kann mit dem Gastsystem darauf zugreifen. Bei dem Wechsel von Disketten müssen die Optionen entsprechend angepasst werden.
Bildschirmausgabe¶
Grafikkarten¶
Die Standardgrafikkarte unter QEMU ist vga-std. Diese kann vom Gastbetriebssystem ohne weitere Treiber verwendet werden.
Grafikkarte | Option | Eigenschaften |
std | -vga std | Standard VGA-Grafikkarte, Option muss nicht angegeben werden |
qxl | -vga qxl oder -device qxl-vga | Paravirtualisierte Grafikkarte, wird für SPICE benötigt |
virtio | -device virtio-vga-gl und -display sdl,gl=on oder -display gtk,gl=on | Paravirtualisierte Grafikkarte, kann auch 3D-Grafikbeschleunigung |
vnc | -vnc :0 | Grafikausgabe über VNC |
keine | -nographic | Es wird nur eine Textkonsole bereitgestellt |
VNC¶
Möchte man die virtuelle Maschine von einem anderen Rechner aus bedienen, kann man die graphische Ausgabe des Gasts über VNC laufen lassen. Dazu muss man statt einer Grafikkarte die Option -vnc X
angeben, wobei X
das Display ist. Startet man QEMU also z.B. über
qemu -hda image.img -vnc :1
so ist die virtuelle Maschine danach über einen VNC-Viewer via Port 5901 (5900 + Displaynummer) erreichbar.
Achtung!
Die Verbindung läuft per Voreinstellung komplett unverschlüsselt und ohne Authentifizierung. Falls es für den Einsatz notwendig ist, müssen dringend Sicherheitsvorkehrungen getroffen werden. Details hierzu findet man an dieser Stelle 🇬🇧 auf der QEMU-Dokumentation.
SPICE¶
SPICE 🇬🇧 ähnelt den Gasterweiterungen in VirtualBox oder den VMware Tools. Über SPICE kann man z.B. die Auflösung des Gastes an die Fenstergröße im Host anpassen und eine gemeinsame Zwischenablage von Host und Gast ermöglichen.
Spice auf dem Host einschalten¶
Es müssen die folgenden Parameter an qemu übergeben werden:
qemu-system-x86_64 \ -device qxl-vga,vgamem_mb=32 \ -spice port=3001,password=MeinGeheimesPasswort \ -device virtio-serial -chardev spicevmc,id=vdagent,debug=0,name=vdagent \ -device virtserialport,chardev=vdagent,name=com.redhat.spice.0
Für Remote-Verbindungen über den Port muss die Grafikkarte qxl verwendet werden. Für Auflösungen höher als 2560x1440 muss die Grafikkartenspeicher mit der Option vgamem_mb erhöht werden. Außerdem wird eine serielle Schnittstelle zwischen Host und Gast eingerichtet, über die die SPICE-Treiber auf dem Gast mit QEMU kommunizieren können. Wenn man keine Netzwerkverbindung zwischen Viewer und VM benötigt, kann man auch einen teilweise schnelleren Unix-Domain-Socket statt dem IP-Port verwenden:
# Verbindung über Port 3001 -spice port=3001,password=MeinGeheimesPasswort # Verbindung über Unix-Domain-Socket run/user/$UID/spice.sock -spice unix=on,addr=/run/user/$UID/spice.sock,password=MeinGeheimesPasswort
Auflösung | Mindestgröße Grafikkartenspeicher |
1920x1080, FullHD | 8MB, Standardeinstellung reicht |
2560x1440 | 16MB, Standardeinstellung reicht |
3840x2160, 4k | 32MB |
Soll 3D-Beschleunigung aktiviert sein, muss Spice über einen lokalen Unix-Socket laufen. Dann kann man als Grafikkarte virtio einstellen. Leider funktioniert das aber nicht mit allen Systemen.
-device virtio-vga-gl \ -spice unix=on,addr=/run/user/$UID/spice.sock,password=MeinGeheimesPasswort,gl=on \
Achtung!
Das Passwort in der Option "password=MeinGeheimesPasswort" muss durch ein eigenes, sicheres Passwort ersetzt werden. Es ist außerdem nicht sehr sicher, das Passwort über die Kommandozeile zu übergeben. Bessere Methoden kann man im Spice user manual 🇬🇧 nachlesen. Dort findet man auch Methoden, die Verbindung zu verschlüsseln, falls dies für den Einsatzzweck notwendig ist.
Spice auf dem Gast einschalten¶
Es wird das Paket spice-vdagent und der qxl-Grafiktreiber benötigt. Unter Ubuntu müssen diese Pakete installiert sein:
spice-vdagent
xserver-xorg-video-qxl
Befehl zum Installieren der Pakete:
sudo apt-get install spice-vdagent xserver-xorg-video-qxl
Oder mit apturl installieren, Link: apt://spice-vdagent,xserver-xorg-video-qxl
Bei Problemen kann geprüft werden, ob der spice-vdagent Daemon läuft.
Über Spice mit dem Gast verbinden¶
Der von den Spice-Entwicklern empfohlene Spice-Client ist remote-viewer.
virt-viewer
Befehl zum Installieren der Pakete:
sudo apt-get install virt-viewer
Oder mit apturl installieren, Link: apt://virt-viewer
Aufgerufen wird er über
# Über Netzwerk remote-viewer spice://localhost:3001 # Über Unix-Socket remote-viewer spice+unix:///run/user/$UID/spice.sock
Audio¶
Als Soundkarte kann z.B. IntelHD verwendet werden:
qemu-system-x86_64 -device intel-hda -device hda-duplex
Verfügbare (Audio-)Geräte kann man sich anzeigen lassen über
qemu-system-x86_64 -device help
Netzwerk¶
In QEMU gibt es verschiedene Möglichkeiten, ein Netzwerk für die virtuellen Maschinen aufzusetzen.
User Network¶
Die einfachste Variante ist das "User Network", bei dem jede VM in einem eigenen Netzwerksegment liegt. Die einzelnen Netzwerksegmente sind über NAT mit dem Hostnetzwerk verbunden.
Kommunikation Host - Gast
Der Host ist von einem Gastsystem über seine normale IP-Adresse (geroutet) und über die IP-Adresse 10.0.2.2 (QEMU-interner Router) erreichbar.
Um den Gast vom Host aus zu erreichen, muss eine Portweiterleitung konfiguriert werden.
Kommunikation Gast - Gast
Die einzelnen virtuellen Maschinen liegen in unterschiedlichen Netzwerksegmenten. Damit sie miteinander kommunizieren können, ist eine Portweiterleitung notwendig
DHCP
Hat man sein Netzwerk per DHCP konfiguriert, sollten Internet und Netzwerk automatisch funktionieren.
TAP Netzwerk¶
Mit TAP wird im Host eine virtuelle Netzwerkkarte angelegt, die mit dem Gast verbunden ist. Dadurch können Gast und Host ohne Portweiterleitung miteinander kommunizieren. Damit die einzelnen virtuellen Maschinen miteinander kommunizieren können, muss noch eine Netzwerkbrücke im Host angelegt werden.
Anlegen eines TAP mit dem NetworkManager:
nmcli connection add type tun ifname tap0 con-name tap0 mode tap owner `id -u`
In QEMU wird das TAP mit diesen Parametern konfiguriert:
-netdev tap,id=tap0,ifname=tap0,script=no,downscript=no -device e1000,netdev=tap0,mac=52:54:00:12:34:56
Für jede VM muss eine andere MAC-Adresse eingestellt werden.
Man kann dann dem TAP Device auf der Host- und der Client-Seite statische IP-Adressen zuweisen, um direkt in beide Richtungen kommunizieren zu können. Möchte man mehrere VM miteinander verbinden und eventuell auch einen Internetzugang über den Host ermöglichen, muss man noch eine Netzwerkbrücke anlegen.
Netzwerkbrücke¶
Damit die einzelnen virtuellen Maschinen miteinander kommunizieren können, müssen die TAP-Netzwerke noch über eine Netzwerkbrücke verbunden werden.
Wenn man die Brücke auch mit der Netzwerkkarte des Hosts verbindet, haben die virtuellen Maschinen Zugriff auf das Netzwerk des Hosts, also typischerweise auch Internetzugriff.
Die Netzwerkbrücke für Ethernet lässt sich nicht direkt mit einer WLAN-Schnittstelle verbinden; man muss dafür auf IP-Ebene routen.
Experten-Info:
Andere VMM-Lösungen scheinen eine Art Brücke zu WLAN-Karten zu erzeugen, indem sie NAT auf MAC-Ebene durchführen. Es gibt Beschreibungen im Internet, wie man dies mit ebtables erreichen kann, siehe z.B. https://wiki.debian.org/BridgeNetworkConnections#Bridging_with_a_wireless_NIC🇬🇧 (ungetestet).
Der einfachste Weg, um die Brücke mit der WLAN-Karte des Host zu verbinden, ist NAT. In diesem Fall bleiben die QEMU-Gäste in ihrem eigenen Netzwerksegment und werden über die normale Internetverbindung des Hosts geroutet.
Routing¶
Möchte man Zugriff auf das Host-Netzwerk, ohne die Brücke direkt mit der echten Netzwerkkarte zu verbinden, kann man das Netzwerk stattdessen über die IP-Ebene routen, siehe Routing-Funktion.
Datenaustausch zwischen Host und Gast¶
Da Host und Gast durch QEMU voneinander isoliert sind, können diese nicht einfach auf die Daten des anderen zugreifen. Für den Datenaustausch gibt es verschiedene Möglichkeiten.
SSH¶
Vom Host lässt sich eine ssh-Verbindung zum Gast aufbauen, wenn diese über ein TAP-Netzwerk verbunden sind, oder eine Portweiterleitung eingerichtet wurde. Auf dem Gastsystem muss dazu ein SSH-Server laufen.
Einzelne Dateien per scp¶
# Host sendet an Gast scp [-P port] datei1 datei2 <IP-Adresse der VM>:/Zielpfad/ # Host liest von Gast scp [-P port] <IP-Adresse der VM>:/Pfad/datei1 /Zielpfad_Host
Ordner mit sshfs¶
Mit sshfs lassen sich ganze Ordner über ssh einbinden.
Einzelne Dateien per netcat¶
Um einzelne Dateien auszutauschen, kann man die Tools tar und nc
nutzen, sofern diese in Host und Gastsystem zur Verfügung stehen (z.B. beides Linux).
Dazu führt man jeweils einen Befehl in einem Terminal [3] aus:
# Host sendet an Gast tar c DATEIEN | nc -v -l 8080 # auf dem Host nc 10.0.2.2 8080 | tar x # auf dem Gast # Gast sendet an Host nc -v -l 8080 | tar x # auf dem Host tar c DATEIEN | nc 10.0.2.2 8080 # auf dem Gast
Partitions-Abbild¶
Per dd können ganze Partitionen in eine .img-Datei kopiert und als zweite Festplatte in QEMU eingebunden werden:
qemu -hda BOOTSYSTEM.img -hdb PFAD/ZUR/PARTITIONSKOPIE.img -m 2048
Ausgesuchte Daten in einer Iso-Datei¶
Mit einem Brennprogramm können Verzeichnisse und Daten von verschiedenen Partitionen in einer ISO-Datei abgespeichert werden. Diese lässt sich als CD-ROM in QEMU einbinden:
qemu -hda BOOTSYSTEM.img -cdrom PFAD/ZUR/ISODATEI.iso -m 2048
Per Samba¶
Ist im Host-System ein Sambaserver installiert, kann man mit QEMU auch auf dessen Freigaben per Netzwerk zugreifen:
Beim Aufruf von QEMU muss zusätzlich die Option
-nic user,smb=/path/to/local/dir
verwendet werden:qemu -hda BOOTSYSTEM.img -m 2048 -nic user,smb=/path/to/local/dir/
QEMU startet den Samba-Server automatisch mit einer angepassten Konfiguration.
Der Zugriff vom Gast erfolgt über die URL
10.0.2.4
im Verzeichnis qemu:
Optionen¶
Startoptionen¶
Unter den zahlreichen Startoptionen können besonders folgende nützlich sein:
Ausgewählte Optionen von QEMU | |
Option | Erklärung |
-hda Datei | gibt das Image der primären Festplatte an. Weitere Platten können mit -hdb , -hdc und -hdd angegeben werden |
-fda Datei | gibt Diskettenlaufwerke an. Man kann das reale Diskettenlaufwerk verwenden, wenn man /dev/fd0 als Dateiname angibt |
-cdrom Datei | gibt das zu verwendende CD-Laufwerk an. Es kann ein Gerät wie /dev/cdrom oder eine Imagedatei angegeben werden |
-daemonize | löst den QEMU-Prozess vom Terminal; das Terminal kann nach dem Start ohne Beeinträchtigung geschlossen werden |
-boot Laufwerksbuchstabe | gibt an, von welchem Laufwerk gestartet werden soll. a steht für Diskette, c für Festplatte, d für CD-ROM und n für einen Netzwerk-Boot |
-m Speichergröße | gibt den zu verwendenden Arbeitsspeicher in MiB an. Vorbereitung dazu s.o. |
-usb | USB wird mit emuliert bzw. die Schnittstellen des Wirts stehen zur Verfügung. Mit -usb -usbdevice tablet kann der Mauszeiger sowohl im Gast- als auch im Host-System genutzt werden, ohne ständig mit
Strg +
Alt umschalten zu müssen |
-vga qxl | es wird ein paravirtualisierter Grafiktreiber verwendet. Benötigt einen passenden Treiber im Gast. |
-soundhw KARTE | es wird die Soundkarte KARTE emuliert; zur Auswahl stehen: sb16 , es1370 und all |
-smp X | es werden X CPU in der virtuellen Maschine genutzt, die Anzahl der virtuellen CPUs kann höher sein als die der realen des Wirts |
-vnc :X | Die Ausgabe des Bildschirms erfolgt per VNC auf Display X und nicht auf den normalen Bildschirm des Wirts, Details siehe auch hier |
-snapshot | Dies bewirkt, dass Änderungen nicht in das Festplattenimage geschrieben, sondern in einer temporären Datei gespeichert werden. Erst mit den Tasten Strg + Alt + S oder dem Kommando commit in der QEMU-Konsole werden die Änderungen übernommen |
-k XX | setzt das Tastaturlayout auf den angegebenen Wert XX z.B. -k de für deutsch, -k en für englisch, etc... (Hilfreich bei Problemen mit der Eingabe und Sonderzeichen in Verbindung mit VNC) |
-hostfwd=[tcp|udp]:[Hostadresse]:Hostport-[Gastadresse]:Gastport | Leitet einen Port des Gasts auf einen Port des Hosts weiter. D.h. -hostfwd=::8008::80 macht einen Apache-Server (bei Standardkonfiguration) des Gastsystems unter http://localhost:8008 auf dem Wirt sichtbar. Oder -hostfwd=::8022::22 erlaubt ssh-Zugriff (bei Standardkonfiguration) auf das Gastsystem vom Wirt via ssh -p 8022 localhost |
-no-quit | Deaktiviert die Fenster-Schließen-Option. Verhindert z.B., dass beim Drücken von
Alt +
F4 das Fenster geschlossen und die VM beendet wird, wenn die Kombination eigentlich für den Gast gedacht war (z.B. dort Fenster schließen oder zur 4. Virtuellen Konsole wechseln). QEMU kann weiterhin mit quit im QEMU-Monitor beendet werden |
-cpu X | Legt den Typ der CPU fest, mittels -cpu host kann die Host-CPU definiert werden (funktioniert nur in Verbindung mit aktiviertem KVM: -enable-kvm ) |
Dies ist nur ein (sehr) kleiner Ausschnitt der Optionen. Besonders im Bereich der Netzwerk-Optionen gibt es sehr viele Möglichkeiten. Eine vollständige Übersicht findet man in den Manpages oder im QEMU-Wiki 🇬🇧.
Portforwarding (z.B. SSH)¶
Wie unter den Startoptionen aufgeführt, kann man Dienste vom Gast auf dem Host erreichen.
qemu [weitere Optionen] -hostfwd=::2222-10.0.2.20:22
In diesem Beispiel wird der Port 22 des Gastes auf den Port 2222 des Hosts weitergeleitet, um den Gast vom Host mit
ssh -p 2222 localhost
erreichen zu können.
Damit dies richtig funktioniert, muss die Option ggf. in den richtigen Netzwerkkontext eingebettet werden - standardmäßig ist das der sehr einfach zu benutzende, aber vergleichsweise sehr langsame und unflexible Modus user network
(Benutzer-Netzwerk):
qemu [weitere Optionen] -net nic,macaddr=52:54:00:12:34:56 -net user,hostfwd=::2222-10.0.2.20:22
Die MAC-Adresse ist die standardmäßig voreingestellte mit 55
am Ende, um Eins erhöht, und kann weiter verändert bzw. die 56
weiter erhöht werden. Jede virtuelle Maschine im Netzwerk muss seine eigene, unverwechselbare MAC haben.
Andere Architekturen emulieren¶
QEMU ist nicht auf die Virtualisierung / Emulation von x86 Prozessoren beschränkt, es können auch eine Vielzahl von anderen Architekturen emuliert werden. Welche dies aktuell sind kann man hier 🇬🇧 nachschauen.
Die allgemeine Syntax ist
qemu-system-ARCHITEKTUR [OPTIONEN]
wobei ARCHITEKTUR
entsprechend ersetzt werden muss.
Reine Prozessemulation¶
QEMU beherrscht auch die "reine" Prozessemulation, auch "User-Space-Emulation" genannt. D.h. dass anstatt eines kompletten Systems wird "nur" ein einzelnes Programm ("Binary") im Emulations-Modus ausgeführt. Die Prozess-Emulation für ein 32-bit i386 System wird z.B. mit folgendem Befehl aufgerufen:
qemu-i386 PROGRAMMNAME
Die Emulation funktioniert natürlich nur, wenn das Programm keine weiteren Bibliotheken dynamisch nachlädt.
Außer der i386-Emulation beherrscht QEMU u.a. auch die Prozessemulation für SPARC, PPC, ARM und einige mehr. Detaillierte Informationen findet man in der QEMU-Dokumenation 🇬🇧.
QEMU-Festplattenimages unter Linux einbinden¶
QEMU bietet die Möglichkeit, die Images über das Netzwerk anzubieten. Das lässt sich aber auch gut verwenden, um sie auf dem eigenen Rechner einzubinden. Aber Achtung: Das Image darf dabei nicht von QEMU oder einem anderen Programm in Benutzung sein.
Zuerst muss NBD geladen werden:
sudo modprobe nbd
Sollte man sehr viele Partitionen im Image haben kann es nötig sein zusätzlich die Anzahl der Partitionen zu erhöhen:
sudo modprobe nbd max_part=63
Jetzt wird das Image in eine Art Loopdevice gemapped. pfad/zu/qemu.img muss man natürlich entsprechend anpassen und sollte /dev/nbd0 schon vergeben sein kann man auch diese Zahl anpassen.
sudo qemu-nbd --connect=/dev/nbd0 /kompletter/pfad/zu/qemu.img
Mit folgendem Befehl kann man sich die Partitionen anzeigen lassen:
sudo fdisk -l /dev/nbd0
Und so mountet man das Image:
sudo mount /dev/nbd0p1 /mnt
Wenn man fertig ist sollte man das Image wieder freigeben. Zahlen gegebenenfalls anpassen.
sudo umount /dev/nbd0p1 sudo qemu-nbd -d /dev/nbd0
USB Geräte durchreichen¶
QEMU ist in der Lage USB Geräte des Wirts zum Gast durchzureichen. Damit USB Unterstützung grundsätzlich funktionieren kann, muss die Startoption -usb
angegeben werden. Es gibt zahlreiche Möglichkeiten ein USB Gerät an das Gastsystem durchzureichen. Dabei sind die folgenden zwei Methoden besonders praktikabel:
Angabe von "Vendor-" und "Product-ID" des betreffenden USB Geräts
Angabe von USB-Bus und Port des Wirts, an dem man beabsichtigt das USB Gerät anzuschließen
1. Methode¶
Die "Vendor-" und "Product-ID" mit
lsusb
ermitteln. Die Ausgabe enthält z.B eine Zeile wie folgt:
Bus 002 Device 026: ID 090c:1000 Silicon Motion, Inc. - Taiwan (formerly Feiya Technology Corp.) 64MB QDI U2 DISK
Dieser USB-Stick hat die "Vendor-ID" 090c
und "Product-ID" 1000
. Die Syntax für die entsprechende Startoption lautet:
qemu [OPTIONEN] -usb -device usb-host,bus=usb-bus.0,vendorid=0x<vendor_id>,productid=0x<product_id>
Im QEMU-Monitor macht man das mit:
device_add usb-host,vendorid=0x<vendor_id>:productid=0x<product_id>
Wenn alles gut gegangen ist, sollte sich das USB Gerät nun im Gast anmelden. Leider gibt es aber auch exotischere USB Geräte die sich so nicht zur Mitarbeit bewegen lassen. Unter Umständen wird die "Vendor-" und "Product-ID" nicht korrekt an das Gastsystem weitergereicht. In einem Windows XP Gast z.B. macht sich dieses Problem als "Unbekanntes Gerät" bemerkbar.
2. Methode¶
Verweigert ein USB Gerät die Mitarbeit oder möchte man prinzipiell einen ausgewählten USB-Port an einen Gast weiterreichen, dann kann man folgende Methode ausprobieren. Nach dem Anstecken kann mit:
dmesg | tail -n 20
der USB-Bus und Port des betreffenden Geräts ermittelt werden. Der interessante Teil der Ausgabe sieht dann z.B. so aus:
[29383.460263] usb 6-1: new full-speed USB device number 14 using uhci_hcd [29383.622414] usb 6-1: New USB device found, idVendor=10c4, idProduct=8044 [29383.622427] usb 6-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [29383.622436] usb 6-1: Product: USB Debug Adapter [29383.622444] usb 6-1: Manufacturer: Silicon Laboratories [29383.622450] usb 6-1: SerialNumber: EC30000D370 [29385.340305] usb 6-1: reset full-speed USB device number 14 using uhci_hcd [29385.688125] usb 6-1: reset full-speed USB device number 14 using uhci_hcd
In diesem Fall hängt das Gerät also an USB-Bus 6 Port 1. Die Syntax für die entsprechende Startoption lautet:
qemu [OPTIONEN] -usb -device usb-host,bus=usb-bus.0,hostbus=<bus>,hostport=<port>
Dabei ist bus
die soeben ermittelte USB-Bus Adresse und port
der entsprechende USB-Port. Im QEMU-Monitor geht das so:
device_add usb-host,bus=usb-bus.0,hostbus=<bus>,hostport=<port>
Weiterführende Informationen dazu findet man im USB 2.0 Quick Start 🇬🇧 Dokument.
Problembehebung¶
Virtuelle Maschine bekommt nicht genug RAM¶
Startet man QEMU mit der Option -m XXX
, aber die virtuelle Maschine bekommt trotzdem nicht genug Speicher, ist vielleicht das virtuelle Dateisystem unter /dev/shm bzw. ab Ubuntu 11.10 /run/shm zu klein. Dann kann man in der /etc/fstab folgende Ergänzung vornehmen (Verzeichnis ggfs. anpassen) [4]:
1 2 | # /dev/shm Vergrößern für QEMU none /dev/shm tmpfs defaults,size=528M |
Hier steht nun "size=528M" für 528 MiB. Dieser Wert muss ggf. angepasst werden und sollte etwas größer sein, als der tatsächlich für den Gast benötigte RAM, da unter /dev/shm noch weitere Daten abgelegt werden. Ohne neu booten zu müssen, kann man das tmpfs gleich neu einbinden [3]:
sudo mount -o remount /dev/shm
Wenn man nun QEMU startet, kann man mit dem Befehl
df | egrep 'shm|File'
überprüfen, wie viel des virtuellen RAM genutzt wird.
Hinweis:
Man sollte darauf achten, dass man QEMU nicht mehr RAM zuweist als dem Wirt-Rechner, da QEMU dann instabil laufen könnte. Außerdem sollte man dem Wirt-System genügend RAM lassen, dass es noch flüssig läuft. Die genauen Systemanforderungen kann man den Release Notes von Ubuntu und seinen Derivaten entnehmen. Die Untergrenze für RAM liegt bei 128-512 MiB.
ping funktioniert auf dem Gast nach Installation nicht¶
QEMU startet einen Gast standardmäßig im Modus user network
, welches keinen ping
unterstützt.
Eine Alternative zu user network
mit TUN/TAP interface
wird im Abschnitt Netzwerk erklärt.
Alternativ zu ping
kann man andere Tools zu verwenden, um auf dem Gast nach der Installation zu prüfen, ob Internetverbindung von Gast mit dem weltweiten Internet hergestellt wurde. Ein alternativer Befehl wäre:
wget -O - fsf.org 2>&1|grep free|wc
wobei die Ausgabe dann so oder ähnlich aussehen sollte:
27 269 2980
Die VM läuft im Grafikmodus sehr langsam¶
Die meisten Desktopumgebungen verwenden die 3D-Beschleunigung der Grafikarte für ihre Effekte. Diese kann nicht in allen Konfigurationen von QEMU im Gast genutzt werden. Eine Alternative ist LXQt mit dem Paket lubuntu-desktop
(Lubuntu). Eine 2D-Beschleunigung wird mit der virtuellen Grafikkarte qxl unterstützt.
Soll im Gast 3D-Beschleunigung verwendet werden, kann als Grafikkarte -device virtio-vga-gl und als Display -display sdl,gl=on eingestellt werden.
Virtuelle Festplatte ist voll¶
Das Festplattenimage kann in zwei Schritten vergrößert werden.
Achtung!
Vor dem Ändern der virtuellen Festplatte das Backup nicht vergessen
Zunächst wird die Imagedatei, die auf der realen Festplatte des Hosts liegt, vergrößert, z.B. um 10 GB:
qemu-img resize Pfad/zum/Image.img +10GB
Nun muss noch die Partition der virtuellen Festplatte vergrößert werden. Die geschieht wie die Imagevergrößerung einer echten Festplatte. Hierzu lädt man sich am Besten ein Iso von gparted herunter 🇬🇧. Anschließend startet man die virtuelle Maschine vom Image aus, so wie man einen echten Rechner von einer CD aus starten würde:
qemu -hda Pfad/zum/Image.img -boot d -cdrom Pfad/zum/iso/gparted-live-1.4.0-6-amd64.iso -m 2048
Nun wählt man zuerst die Sprache und Tastaturlayout aus und wählt dann die Option, den Xserver zu starten. Jetzt lässt sich die Größe der Partition bequem grafisch an die neue virtuelle Festplattengröße anpassen. Zum Starten muss lediglich das Icon von gparted angeklickt werden.
Links¶
Anleitung auf Linuxforen.de 🇩🇪 - Eine umfangreiche Einführung
QEMU User-Dokumentation 🇬🇧 - Die offizielle Dokumentation
Bochs 🇬🇧 - Ein weiterer freier Plattform-Emulator
Guide to running Windows 7 in QEMU 🇬🇧 - Anleitung aus 2013 für Arch Linux. Leicht verständlich und knapp, funktioniert genauso gut unter Ubuntu
Anleitung im OpenMoko-Wiki für QEMU 🇬🇧 - Das Betriebssystem OpenMoko unter QEMU
Windows XP under QEMU HowTo 🇬🇧 - Dokumentation von Ubuntu.com
https://www.linuxtechi.com/install-configure-kvm-ubuntu-18-04-server/ 🇬🇧 - HowTo Netzwerkbrücke mit Netplan einrichten