HowTo: JeOS (Ubuntu-Server) in QEMU mit TUN/TAP-Network-Interface installieren und automatisch starten
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
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
sudo apt-get install kqemu-common kqemu-source
Berechtigungen setzen
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
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
lsmod | grep kvm
Die Ausgabe sollte dann so aussehen
# 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
cd ~
mkdir qemu-images
cd qemu-images
Ein dynamisch wachsendes Image erstellen
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
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
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
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
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.
apt-get install bridge-utils
Mit dem Programm brctl prüfen, ob schon Bridges existieren
brctl show
bridge name bridge id STP enabled interfaces
Sollte eine Bridge vorhanden sein, kann diese mit folgendem Befehl gelöscht werden.
brctl delbr pan0
Als Nächstes legen wir eine neue Bridge an
brctl addbr bri0
Prüfen, ob die Bridge angelegt wurde
brctl show
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
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.
ifconfig
eth0 ...
eth1 ...
tap0 ...
Die IP-Adresse der virtuellen Netzwerk-Schnittstelle muss auf dem Host gelöscht werden
ifconfig tap0 0.0.0.0 up
Als Nächstes wir die virtuelle Netzwerk-Schnittstelle der Bridge bri0 zugeordnet
brctl addif bri0 tap0
Die Zuordnung überprüfen
brctl show
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
ifconfig bri0 192.168.178.160 up
Nun kann im Gast per VNC eine freie IP-Adressen des Host-Netzwerkes zugeordnet werden
sudo vi /etc/network/interfaces
# 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
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
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
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:
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
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
ssh 192.168.178.151
Zunächst fahren wir den Gast aber per SSH herunter
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)
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
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.
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.
[…] Ich glaube dazu habe ich nun eine (gute?) Schritt-für-Schritt-Anleitung gefunden, die so ziemlich mein Problem beschreibt. […]