QEMU ist ein freier Emulator und Virtualisierer, der das parallele Betreiben anderer Betriebssysteme ohne Neustart erlaubt. Dies ist vorallem sinnvoll, um Testumgebungen für andere Betriebssysteme einzurichten oder um die Hardware des Hosts besser auszunutzen.
Als Erstes installieren wir das qemu
-Paket
1 |
sudo apt-get install qemu |
KQEMU
Zum Virtualisierer wird QEMU allerdings erst mit dem Beschleuniger KQEMU. Dadurch wird der Prozessor nicht emuliert, stattdessen werden die Befehle des Gasts direkt auf dem Prozessor des Hosts ausgeführt (wie bei VMware). Der Gast läuft dadurch schneller.
Die kqemu
-Pakete installieren
1 |
sudo apt-get install kqemu-common kqemu-source |
Berechtigungen setzen
1 2 |
sudo mknod /dev/kqemu c 250 0 sudo chmod 666 /dev/kqemu |
KVM
Unterstützt der Prozessor des Hosts Hardwarevirtualisierung, kann das Kernelmodul kvm
genutzt werden. Eine Installation von kqemu
ist dann nicht notwendig. Die virtuelle Maschine läuft dann fast mit der Geschwindigkeit des Hosts.
Um herauszufinden, ob der Prozessor Hardwarevirtualisierung unterstützt, muss man in der Datei /proc/cpuinfo
schauen, ob dort unter flags
entweder der Eintrag vmx
oder svm
vorhanden ist. Schneller geht dies mit folgendem Befehl
1 |
grep -E '^flags.*(vmx|svm)' /proc/cpuinfo |
Wenn der Prozessor Hardwarevirtualisierung unterstützt, werden die beiden benötigten Kernel-Module normalerweise automatisch geladen. Dies kann man mit folgendem Befehl prüfen
1 |
lsmod | grep kvm |
Die Ausgabe sollte dann so aussehen
1 2 3 4 5 6 7 |
# Für Intel-Prozessoren kvm kvm_intel # Für AMD-Prozessoren kvm kvm_amd |
Sollten die Module nicht geladen sein, so muss man dies von Hand nachholen.
Wichtig: Manchmal muss man die Hardwarevirtualisierung im BIOS erst aktivieren. Außerdem muss der aktuelle Benutzer Mitglied der Gruppe „kvm“ sein.
Festplatten-Images
Im Home-Verzeichnis einen Ordner für die Festplatten-Images anlegen
1 2 3 |
cd ~ mkdir qemu-images cd qemu-images |
Ein dynamisch wachsendes Image erstellen
1 |
qemu-img create -f qcow2 Ubuntu-Server.img 10G |
Wichtig: Wenn KVM
verwendet wird muss statt qemu [options] [disk_image]
einfach nur kvm [options] [disk_image]
benutzt werden.
Den Gast das erste Mal starten und dabei das Festplatten-Image Ubuntu-Server.img
und das CD-Image ubuntu-8.10-server-i386.iso
einbinden, von CD starten und den Bildschirm per VNC bereitstellen
1 |
qemu -hda Ubuntu-Server.img -cdrom ubuntu-8.10-server-i386.iso -boot d -vnc :1 |
Die virtuelle Maschine ist danach über einen VNC-Client via Port 5901 (5900 + Displaynummer) erreichbar.
Da die IP-Adresse des Rechners, auf dem der Gast läuft bei mir 192.168.178.150
ist, lautet der Befehl wiefolgt
1 |
vncviewer 192.168.178.150:5901 |
JeOS (Ubuntu-Server)-Installation
JeOS ist eine Ubuntu-Variante, die für den Einsatz in virtuellen Maschinen optimiert ist.
Im Boot-Menü F4
drücken und die Option „Eine minimale virtuelle Maschine installieren
“ auswählen.
Danach wie gewohnt installieren und beim Punkt „Software auswählen und installieren
„, Automatische Updates aktivieren
Bei „Softwareauswahl
“ habe ich „Basic Ubuntu server
„, „LAMP server
“ und „OpenSSH server
“ installiert
Das MySQL-Passwort setzen
Nachdem die Installation abgeschlossen ist, muss die Maschine neugestartet werden, was allerdings zunächst nicht klappt. Deswegen muss man an der Konsole, an der man den Gast gestartet hat, den Prozess mit Strg+C
schließen.
Danach startet man die virtuelle Maschine neu, allerdings diesmal ohne CD-Image
1 |
qemu /home/benutzername/qemu-images/Ubuntu-Server.img -vnc :1 |
Man sollte sich nachdem der Gast hochgefahren ist anmelden und erstmal die aktuellen Updates installieren
1 2 |
sudo apt-get update sudo apt-get upgrade |
Bridging
Bridging ist eine Technik, mit der man zwei Netzwerken zusammenschließen kann. Diese Technik wird hier genutzt, um dem Gast einen uneingeschränkten Netzwerkzugang zur Verfügung zu stellen. Auf die virtuellen Maschinen kann so auch von ausserhalb des Hosts zugeriffen werden.
Dazu wird als erstes auf dem Host das Paket bridge-utils
mit dem Virtuelle Bridges erzeugt werden können.
1 |
apt-get install bridge-utils |
Mit dem Programm brctl prüfen, ob schon Bridges existieren
1 |
brctl show |
1 |
bridge name bridge id STP enabled interfaces |
Sollte eine Bridge vorhanden sein, kann diese mit folgendem Befehl gelöscht werden.
1 |
brctl delbr pan0 |
Als Nächstes legen wir eine neue Bridge an
1 |
brctl addbr bri0 |
Prüfen, ob die Bridge angelegt wurde
1 |
brctl show |
1 2 |
bridge name bridge id STP enabled interfaces bri0 8000.000000000000 no |
Im diesem Beispiel sollen die TUN/TAP-Network-Interfaces zweier virtueller Maschinen an die angelegte Bridge angeschlossen werden. Damit können die virtuellen Maschinen an das Netzwerk Host-Rechners verbunden werden. Die Adresse dieses Netzwerkes ist hier 192.168.1.0.
Zuerst wird der noch laufende Gast per VNC heruntergefahren
1 |
sudo shutdown -h now |
Als nächstes wird er mit TUN/TAP-Network-Interface auf dem Host neugestartet
qemu /home/benutzername/qemu-images/Ubuntu-Server.img -net nic -net tap -vnc :1
Dabei wird im Host-System die virtuelle Netzwerk-Schnittstelle tap0 angelegt. Dies kann mit dem Befehl ifconfig auf dem Host überprüft werden.
1 |
ifconfig |
1 2 3 |
eth0 ... eth1 ... tap0 ... |
Die IP-Adresse der virtuellen Netzwerk-Schnittstelle muss auf dem Host gelöscht werden
1 |
ifconfig tap0 0.0.0.0 up |
Als Nächstes wir die virtuelle Netzwerk-Schnittstelle der Bridge bri0 zugeordnet
1 |
brctl addif bri0 tap0 |
Die Zuordnung überprüfen
1 |
brctl show |
1 2 |
bridge name bridge id STP enabled interfaces bri0 8000.76674ec80764 no tap0 |
Die Bridge erhält nun eine freie IP-Adresse im Netzwerk des Hosts
1 |
ifconfig bri0 192.168.178.160 up |
Nun kann im Gast per VNC eine freie IP-Adressen des Host-Netzwerkes zugeordnet werden
1 |
sudo vi /etc/network/interfaces |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). # The loopback network interface auto lo iface lo inet loopback # The primary network interface auto eth0 iface eth0 inet static address 192.168.178.151 netmask 255.255.255.0 gateway 192.168.178.1 |
Anschließend wird der Netzwerkdienst des Gasts neugestartet
1 |
sudo /etc/init.d/networking restart |
Damit auch die Netzwerkkarte des Host-Systems an die Bridge angeschlossen ist, wird die alte IP-Adresse gelöscht und anschließend das Netzwerk-Interface des Hosts der Bridge zugeordnet
1 |
ifconfig eth0 0.0.0.0 up && brctl addif bri0 eth1 |
Damit die Bridge auch nach einem Neustart zur Verfügung steht, wird die Netzwerk-Konfiguration des Hosts angepasst
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
auto lo iface lo inet loopback iface eth0 inet manual iface eth1 inet manual auto bri0 iface bri0 inet static address 192.168.178.150 network 192.168.178.0 netmask 255.255.255.0 broadcast 192.168.178.255 gateway 192.168.178.1 bridge_ports eth1 bridge_fd 9 bridge_hello 2 bridge_maxage 12 bridge_stp off |
Falls keine statische IP-Adresse sondern eine des DHCP-Servers zugewiesen werden soll, muss diese Konfiguration verwendet werden:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
auto lo iface lo inet loopback iface eth0 inet manual iface eth1 inet manual auto bri0 iface bri0 inet dhcp bridge_ports eth1 bridge_fd 9 bridge_hello 2 bridge_maxage 12 bridge_stp off |
Anschließend wird der Netzwerkdienst neugestartet
1 |
sudo /etc/init.d/networking restart |
SSH-Zugang konfigurieren
Man sollte sich nun mit der dem Gast zugewiesenen IP-Adresse 192.168.178.151
dort anmelden können
1 |
ssh 192.168.178.151 |
Zunächst fahren wir den Gast aber per SSH herunter
1 |
sudo shutdown -h now |
Der Server kann nun ohne grafische Ausgabe gestartet werden, da er per SSH erreichbar ist, zusätzlich wir der Arbeitsspeicher des Gastes auf 192 MB erhöht (Voreinstellung: 128 MB)
1 |
qemu /home/benutzername/qemu-images/Ubuntu-Server.img -net nic -net tap -m 192 -localtime -k de -nographic |
Nach dem Startvorgang erneut am Gast anmelden
1 |
ssh 192.168.178.151 |
Es empfiehlt sich den OpenSSH-Server noch weiter abzusichern (mit Authentifizierung über öffentliche Schlüssel), wie hier beschrieben.
QEMU in den Systemstart einbinden
Um die virtuellen Maschinen nicht jedes mal von Hand starten zu müssen, empfiehlt es sich ein Start-Skript zu verwenden. Normalerweise reicht es aus folgende Zeilen der Datei /etc/rc.local
vor dem Eintrag exit 0
hinzuzufügen.
1 2 3 |
qemu /home/benutzername/qemu-images/Ubuntu-Online.img -net nic -net tap -m 192 -localtime -k de -nographic & sleep 2 qemu /home/benutzername/qemu-images/Ubuntu-LAN.img -net nic -net tap -m 192 -localtime -k de -nographic & |
Dies startet 2 virtuelle Maschinen mit einem Abstand von 2 Sekunden. Das &
bewirkt, dass der Prozess im Hintergrund abläuft und nicht die Konsole blockiert.
Links
- Projektseite: QEMU
- ubuntuusers.de Wiki: QEMU
- Projektseite: KVM
- ubuntuusers.de Wiki: KVM
Pingback: Getrennte IPs pro VM - Linux: Linux-Forum