Installation libvirt, virsh, Virtual Machine Manager, virsh console, virt-manager
(Link zu dieser Seite als [[QEMU-KVM-Buch/ Managementtools/ libvirt-Tools/ Installation]])
Inhaltsverzeichnis |
[bearbeiten] Installation der Bibliothek libvirt
[bearbeiten] Als Paket
Ab Ubuntu 8.10 gibt es das Meta-Paket ubuntu-virt-server. Es beinhaltet kvm, libvirt-bin und openssh-server. Dieses Meta-Paket wird installiert, wenn man bei der Installation von Ubuntu den Virtualization Host auswählt (tasksel).
Host ~$ sudo apt-get install ubuntu-virt-server ubuntu-virt-mgmt
Stehen diese Meta-Pakete nicht zur Verfügung beziehungsweise benötigt man nur das Paket libvirt-bin, ist folgende Befehlszeile einzugeben.
Host ~$ sudo apt-get install libvirt-bin
[bearbeiten] Quellen kompilieren
Liegt libvirt nicht als aktuelles Paket vor, kompiliert man es aus den Quellen. Dazu sind diese Pakete notwendig:
Host ~$ sudo apt-get install libxml2-dev libdevmapper-dev Host ~$ sudo apt-get install libgnutls-dev libxml++2.6-dev Host ~$ sudo apt-get install libssh2-1-dev gettext autoconf Host ~$ sudo apt-get install libtool git-core checkinstall
Für den Daemon libvirtd ist eine gleichnamige Gruppe notwendig. Für den QEMU-Treiber ist der Benutzer QEMU anzulegen. Weiterhin ist der aktuelle Benutzer in die Gruppe libvirtd aufzunehmen.
Host ~$ sudo groupadd libvirtd Host ~$ sudo useradd -g libvirtd qemu Host ~$ sudo adduser `id -un` libvirtd
Man muss sich anschließend ab- und wieder anmelden. Wenn danach die Zugriffsrechte immer noch nicht stimmen, hilft ein Reboot. Getestet wird die eigene Gruppenzugehörigkeit mit dem Befehl groups.
Host ~$ groups ... libvirtd
Es werden die Quellpakete für libvirt heruntergeladen, entpackt und kompiliert. Das Skript autogen.sh ruft das Skript configure auf. Mögliche Optionen können mit dem Befehl ./configure --help angezeigt werden. Diese Optionen werden an das Skript autogen.sh angefügt. Weitere Informationen findet man in der Datei INSTALL.
Host ~$ mkdir -p ~/source Host ~$ cd ~/source Host ~$ wget http://libvirt.org/sources/libvirt-0.7.5.tar.gz Host ~$ tar xzvf libvirt-*.gz Host ~$ cd libvirt-* Host ~$ ./autogen.sh --with-qemu-user=qemu --with-qemu-group=libvirtd
configure: Configuration summary configure: ===================== configure: configure: Drivers configure: configure: Xen: yes configure: Proxy: yes configure: QEMU: yes configure: UML: yes configure: OpenVZ: yes configure: VBox: yes configure: LXC: yes configure: PHYP: no configure: ONE: no configure: ESX: yes configure: Test: yes configure: Remote: yes configure: Network: yes configure: Libvirtd: yes configure: netcf: no configure: configure: Storage Drivers configure: configure: Dir: yes configure: FS: yes configure: NetFS: yes configure: LVM: yes configure: iSCSI: no configure: SCSI: yes configure: mpath: yes configure: Disk: no configure: configure: Security Drivers configure: configure: SELinux: no configure: AppArmor: no configure: configure: Driver Loadable Modules configure: configure: dlopen: no configure: configure: Libraries configure: configure: libxml: -I/usr/include/libxml2 -lxml2 configure: libcurl: -lcurl configure: libssh2: -I/usr/local/include -lssh2 -L/usr/local/lib/ configure: gnutls: -lgnutls -lgcrypt configure: sasl: -lsasl2 configure: yajl: no configure: avahi: no configure: polkit: no configure: selinux: -lselinux configure: apparmor: no configure: numactl: no configure: capng: no configure: xen: -lxenstore configure: hal: no configure: udev: no configure: netcf: no configure: xmlrpc: no configure: configure: Test suite configure: configure: Coverage: no configure: Alloc OOM: no configure: configure: Miscellaneous configure: configure: Debug: yes configure: Warnings: maximum configure: Readline: no configure: Python: yes configure: configure: Privileges configure: configure: QEMU: qemu:libvirtd configure:
Host ~$ sudo make
Zu empfehlen ist das Generieren eines Softwarepaketes mit checkinstall. Es wird statt make install aufgerufen. Eine Hilfestellung erhält man mit checkinstall --help. Das Programm checkinstall stellt einige Fragen, die meist mit den Default-Vorgaben beantwortet werden können. Eindeutig ist der Paket-Name vorzugeben, zum Beispiel libvirt-self-compiled. Im aktuellen Verzeichnis wird das Paket angelegt und installiert. Unter Debian/Ubuntu listet es der Befehl dpkg -l auf und mit dpkg -r deinstalliert man es bei Bedarf.
Host ~$ sudo checkinstall Das Paket wird entsprechend dieser Vorgaben erstellt: 0 - Maintainer: [ root@knut ] 1 - Summary: [ libvirt-self-compiled ] 2 - Name: [ libvirt-self-compiled ]
Alternativ kann man auch die Software mit make install installieren.
Host ~$ sudo make install
Es ist die Liste der installierten Shared Libraries zu aktualisieren.
Host ~$ sudo ldconfig
Die kompilierte Library wird im Verzeichnis /usr/local/lib abgelegt. Getestet wird die Installation mit folgenden Befehl.
Host ~$ virsh version
Kompiliert gegen die Bibliothek: libvir 0.7.5
Verwende Bibliothek: libvir 0.7.5
Verwende API: QEMU 0.7.5
Laufender Hypervisor: QEMU 0.12.2
Der Treiber von libvirt für den QEMU-Emulator sucht in dem Verzeichnis /usr/bin nach den QEMU-Binaries qemu und qemu-system-*. Der KVM-Treiber überprüft zusätzlich das Device /dev/kvm. Das Ergebnis wird mit dem folgenden Befehl im XML-Format ausgegeben.
Host ~$ virsh capabilities
Liegen die QEMU-Binaries in einem anderen Verzeichnis, so kann dies mit Links angepasst werden. In diesem Beispiel befinden sich die Binaries im Verzeichnis /usr/local/bin/
Host ~$ sudo ln -sf /usr/local/bin/qemu /usr/bin/qemu
[bearbeiten] Installation der Managementtools
Die Managementtools müssen nicht unbedingt auf den Host mit dem Hypervisor installiert sein.
[bearbeiten] Als Software-Pakete
Für die Managementtools gibt es das Meta-Paket ubuntu-virt-mgmt mit den Managementtoools python-vm-builder, virt-manager und virt-viewer. Die Tools können auch einzeln installiert werden. Die Tools virt-install und virt-clone sind im Paket python-virtinst enthalten. Für die GUI virt-manager (http://virt-manager.org) sind die Pakete virt-manager und virt-viewer zu installieren. Die Installation von virt-top erfolgt mit dem gleichnamigen Paket.
Host ~$ sudo apt-get install python-virtinst virt-manager Host ~$ sudo apt-get install virt-viewer virt-top
Für das Python-Skript vmbuilder benötigt man das Paket python-vm-builder.
Host ~$ sudo apt-get install python-vm-builder
Eine Sammlung von Tools für libvirt beinhaltet das Paket virt-goodies (https://launchpad.net/virt-goodies).
Host ~$ sudo apt-get install virt-goodies
[bearbeiten] Quellen kompilieren
Liegen diese Tools nicht als aktuelle Pakete vor, werden sie kompiliert. Für das Kompilieren der Managementtools werden folgende Pakete benötigt.
Host ~$ sudo apt-get install intltool rarian-compat Host ~$ sudo apt-get install python-libvirt python-gtk2 Host ~$ sudo apt-get install python-glade2 python-dbus python-gconf Host ~$ sudo apt-get install python-libxml2 python-urlgrabber Host ~$ sudo apt-get install dbus-x11 python-gtk-vnc python-vte Host ~$ sudo apt-get install libgtk-vnc-1.0-dev gawk Host ~$ sudo apt-get install checkinstall libglade2-dev Host ~$ sudo apt-get install python-rsvg
Die Tools virt-viewer, virtinst und virt-manager werden von der Website http://virt-manager.org heruntergeladen, entpackt, kompiliert und installiert.
Host ~$ mkdir -p ~/source Host ~$ cd ~/source Host ~$ wget http://virt-manager.org/download/sources/virt-viewer/virt-viewer-0.2.0.tar.gz Host ~$ tar xzvf virt-viewer-*.tar.gz Host ~$ cd virt-viewer-* Host ~$ ./configure Host ~$ make Host ~$ sudo checkinstall Das Paket wird entsprechend dieser Vorgaben erstellt: 0 - Maintainer: [ root@knut ] 1 - Summary: [ virt-viewer-self-compiled ] 2 - Name: [ virt-viewer-self-compiled ]
Host ~$ cd ~/source Host ~$ wget http://virt-manager.org/download/sources/virtinst/virtinst-0.500.1.tar.gz Host ~$ tar xzvf virtinst-*.tar.gz Host ~$ cd virtinst-* Host ~$ sudo python setup.py install Host ~$ sudo python setup.py sdist Host ~$ sudo python setup.py refresh_translations
Host ~$ cd ~/source Host ~$ wget http://virt-manager.org/download/sources/virt-manager/virt-manager-0.8.2.tar.gz Host ~$ tar xzvf virt-manager-*.tar.gz Host ~$ cd virt-manager-* Host ~$ ./configure && make Host ~$ sudo checkinstall Das Paket wird entsprechend dieser Vorgaben erstellt: 0 - Maintainer: [ root@knut ] 1 - Summary: [ virt-manager-self-compiled ] 2 - Name: [ virt-manager-self-compiled ]
[bearbeiten] Konfiguration
[bearbeiten] Zugriffsrechte
Das Paket libvirt-bin enthält das Managementtool virsh. Als ersten Test wird eine Verbindung zu dem Dummy-Hypervisor hergestellt. Der Befehl list listet laufende virtuelle Maschinen auf. Der Dummy-Hyperviser zeigt per Default eine fiktive virtuelle Maschine an.
Host ~$ virsh -c test:///default list Id Name Status ---------------------------------- 1 test laufend
Im nächsten Schritt ist die qemu:///session zu testen.
Host ~$ virsh -c qemu:///session list Id Name Status ----------------------------------
Bei Verwendung des Verbindungstyps system erscheint eine Fehlermeldung, wenn entsprechende Rechte fehlen.
Host ~$ virsh -c qemu:///system list libvir: Remote Fehler : Permission denied Fehler: Verbindung zum Hypervisor scheiterte
Zuerst ist zu prüfen, ob der Deamon libvirtd läuft.
Host ~$ ps aux | grep libvirt[d]
Erfolgt keine Ausgabe, ist zum Test der Deamon manuell auf einer anderen Konsole zu starten. Die Option -v generiert ausführliche Ausgaben.
Host ~$ sudo /usr/local/sbin/libvirtd -v
Da der Verbindungstyp system privilegierte Rechte benötigt, wird zum Test sudo eingesetzt.
Host ~$ sudo virsh -c qemu:///system list Id Name Status ----------------------------------
Mit dem Start von libvirtd wurde zwar auch der QEMU-Treiber gestartet, die Zugriffsrechte für den Socket erlauben aber keine Verwendung durch andere Benutzer.
Host ~$ ls -l /usr/local/var/run/libvirt/libvirt-sock srwx------ 1 root root 0 2010-01-27 17:39 /usr/local/var/run/libvirt/libvirt-sock
Der manuell gestartete Deamon ist mit [Strg]+[C] zu beenden. Die Zugriffsrechte sind durch Anpassen der Dateien libvirtd.conf und qemu.conf zu ändern. Wurde libvirt ohne die Option --prefix= kompiliert, liegen diese Dateien im Verzeichnis /usr/local/etc/libvirt/. Vor dem Editieren sind Sicherungskopien anzulegen.
Host ~$ sudo cp /usr/local/etc/libvirt/libvirtd.conf \ /usr/local/etc/libvirt/libvirtd.conf.bak Host ~$ sudo cp /usr/local/etc/libvirt/qemu.conf \ /usr/local/etc/libvirt/qemu.conf.bak
Diese Konfiguration ist für die ersten Tests gedacht. Eine weitere Anpassung ist mit den gut dokumentierten Konfigurationsdateien vorzunehmen. Dies gilt besonders für die Verbesserung der Sicherheit. Die Datei libvirtd.conf erhält folgenden Inhalt.
# libvirtd.conf unix_sock_group = "libvirtd" unix_sock_ro_perms = "0777" unix_sock_rw_perms = "0770" unix_sock_dir = "/usr/local/var/run/libvirt/"
Die Konfigurationsdatei für den QEMU-Treiber qemu.conf wird wie folgt angepasst.
# qemu.conf user = "qemu" group = "libvirtd"
Auf der zweiten Konsole startet man wieder libvirtd.
Host ~$ sudo /usr/local/sbin/libvirtd -v
Auch die Verbindung mit qemu:///system ist nun ohne sudo erfolgreich.
Host ~$ virsh -c qemu:///system list Connecting to uri: qemu:///system Id Name Status ----------------------------------
Zum automatischen Starten von libvirtd nach einem Reboot ist ein entsprechendes Init-Skript notwendig. Beim Kompilieren wird das Init-Skript nur für Red Hat-Distributionen generiert. Man kann zwar den Befehl zum Starten in die Datei /etc/rc.local eintragen, ein sauberes Beenden wird damit nicht erreicht. Unter Ubuntu ist es möglich das Init-Script /etc/init.d/libvirt-bin aus dem Paket libvirt-bin zu kopieren und anzupassen. Alternativ schreibt man ein eigenes Skript auf Grundlage der Datei /etc/init.d/skeleton.
[bearbeiten] Netzwerk
Eine Art die virtuellen Maschinen zu vernetzen ist das Bridging mit den bridge-utils. Die Installation unter Debian/Ubuntu ist mit folgender Befehlszeile erledigt.
Host ~$ sudo apt-get install bridge-utils
Zur Konfiguration ist der Netzwerkdienst zu stoppen.
Host ~$ sudo invoke-rc.d networking stop
Weiterhin ist zu empfehlen, die Netzwerk-Konfigurationsdatei vor dem Bearbeiten zu sichern.
Host ~$ sudo cp /etc/network/interfaces /etc/network/interfaces-bak
In diesem Beispiel hat das Interface eth0 des Host-System die IP-Adresse 192.168.1.210. Das Gateway hat die IP-Adresse 192.168.1.1. Die Datei /etc/network/interfaces hat bisher folgenden Inhalt:
# /etc/network/interfaces auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 192.168.1.210 netmask 255.255.255.0 gateway 192.168.1.1
Für das Briding ist die Datei /etc/network/interfaces anzupassen. Dabei ist zu beachten, dass das Interface eth0 keine IP-Adresse mehr besitzt. Die ehemalige IP-Adresse von eth0 wird dem Interface br0 zugewiesen.
# /etc/network/interfaces
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet manual
auto br0
iface br0 inet static
address 192.168.1.210
network 192.168.1.0
netmask 255.255.255.0
broadcast 192.168.1.255
gateway 192.168.1.1
bridge_ports eth0
bridge_fd 9
bridge_hello 2
bridge_maxage 12
bridge_stp off
Anschließend ist der Netzwerkdienst neu zu starten.
Host ~$ sudo /etc/init.d/networking restart
Wenn alles geklappt hat, ist der Rechner wieder unter der alten IP-Adresse erreichbar. Allerdings wird damit nicht das Interface eth0 adressiert, sondern das neu angelegte Interface br0. Zur Kontrolle dient der Befehl ifconfig.
Host ~$ ifconfig br0 ... inet Adresse:192.168.1.210 Bcast:192.168.1.255 Maske:255.255.255.0 ... eth0 ... lo ...
Ein Neustart der Rechners ist zu empfehlen, um die korrekte Netzwerkkonfiguration nach dem Booten zu testen.
Host ~$ sudo reboot
libvirt verwendet dnsmasq, um Gast-Systemen per DHCP IP-Adressen zuzuweisen. dnsmasq ist ein einfacher DNS- und DHCP-Server für kleine Netzwerke. Die Namen aus dem lokalen Netz werden entsprechend der Datei /etc/hosts aufgelöst. Unbekannte Namensanfragen werden an andere DNS-Server weitergeleitet und im Cache gespeichert. Um dnsmasq unter libvirt zu nutzen, ist in der Datei /etc/resolv.conf des Host-Systems die IP-Adresse 192.168.122.1 als ersten Nameserver einzufügen. Die vorher vorhandenen Einträge für Nameserver sind nicht zu löschen. Mit der Namensauflösung ist es möglich, angelegte virtuelle Maschinen mit ihrem Namen im Netzwerk zu adressieren. Dabei ist jeweils ein Punkt an den Namen anzuhängen.
# /etc/resolv.conf nameserver 192.168.122.1 nameserver ...