====== libvirt mit KVM ====== ''libvirt'' ist eine open-source Software die eine API (Programmierschnittstelle), einen daemon (Dienst) und Verwaltungswerkzeuge für verschiedene Virtualsierungslösungen bietet. Unterstützt werden [[kvm:KVM]], [[xen:Xen]], [[software:VMware|VMware ESX]] und andere. libvirt wird von grafischen Benutzeroberflächen wie dem "Virtual Machine Manager", Kommandozeilentools (''virsh'') und anderen tools wie [[http://press.redhat.com/2008/06/18/more-on-red-hat%E2%80%99s-virtualization-news/|oVirt]] benutzt. :!: Bevor man einen **Hostrechner neu startet oder herunterfährt** sollte man **alle Gäste VORHER herunterfahren**. libvirt bzw. [[kvm:KVM]] sichert nicht einfach den Status, sondern killt den Gast beim shutdown wie einen normalen Prozess. Es könnte also ggf. zu Datenverlust kommen, wenn die Gäste ihr Dateisystemjournal wieder rückabwickeln. Alternativ lässt sich das Shellscript ''kvm-shutdown-all-guests.sh'' (siehe unten) benutzen, es fährt nacheinander alle Gäste herunter. ===== Links ===== * [[http://libvirt.org/|libvirt]] * [[linux:UUID|UUIDs für kvm/libvirt generieren]] ===== Verwaltung mit libvirt, VNC und SSH ===== :!: zuerst auf den Host per SSH einloggen) * **Liste laufender Gäste** anzeigen lassen:virsh list * Konsole * virsh console $ID,Tastenkombination für exit: "Strg-AltGr-9" * **VNC-Konsole eines bestimmten Gastes** herausbekommen (Beispiel mit Gast "www"): virsh vncdisplay wwwdie Ausgabe von :2 bedeutet display 2 was auf dem Host an localhost:5902 lauscht. Nun können wir per SSH-Portweiterleitung auf diese Konsole: ssh IP_HOSTRECHNER -L 8080:127.0.0.1:5902 -N -glokal kann danach mit vncviewer auf localhost:8080 die VNC-Konsole betrachtet werden. * **virsh Verwaltungmenu** starten: virsh * **Hilfe in virsh** aufrufen: ''help'' oder von außerhalb mit virsh help * **Gast starten** (Beispiel mit Gast "www"): virsh start www www * **Gast herunterfahren** (simuliert Tastendruck auf den Ausschalter; Beispiel mit Gast "www"): virsh shutdown www * neu eingerichteten **Gast** von nun an bei jedem booten des Hochrechners** mit hochfahren** (autostart): virsh autostart www * **Änderungen an der Konfiguration** bekannt machen: virsh define /path/to/file.xml * Fähigkeiten (capabilities) des Hosts anzeigen: virsh capabilities ===== Verwaltung mit virt-manager ===== Statt mit den Kommandozeilentools zu arbeiten und manuell Konsolen per VNC und SSH zu binden, kann auch der virt-manager (grafische Benutzeroberfläche) benutzt werden. Er bietet einfach Zugriff auf alle Einstellungen eines Hostrechners, bietet einen einfach Konsolenzugriff und ein paar Statistikfunktionen. ===== Verwaltung mit cockpit ===== * Install: https://cockpit-project.org/running.html#debian * manual: https://cockpit-project.org/guide/latest/guide ===== Nützliche Befehle ===== ==== MAC-Adressen der VMs auflisten ==== for i in `virsh list --all --name`; do echo $i; virsh domiflist $i; done ==== KVM-Gäste geordnet herunterfahren ==== :!: Wichtig: Beim reboot oder shutdown eines Server werden die virtuellen Maschinen einfach abgeschaltet ohne einen geordneten shutdown zu machen. Das ist keine gute Vorgehensweise weil es auf diese Weise zu Datenverlusten kommen könnte. :!: Damit die Gäste das ACPI-Event richtig auswerten können, muss ACPI-Unterstüzung auf den Gästen installiert sein, andernfalls funktioniert die Methode mit ''virsh shutdown'' nicht: * bei [[debian:Debian]]) das Paket ''acpi-support-base'' * bei [[windows:Windows]]: die ACPI-HAL, es darf im Gerätemanager nicht "Standard-PC" unter "Copmputer" stehen. XP lässt sich evtl. nächträgl. über eine Reparaturinstallation oder Update-Installation auf ACPI einstellen (Beim Setup F5 drücken (wenn er nach F6 fragt), dann müsste der ACPI-Treiber auswählbar sein). Siehe [[http://support.microsoft.com/kb/309283|kb 309283]], bzw. [[http://support.microsoft.com/kb/299340/DE|kb 299340]]. === Erweiterung des init-Scripts bei alten Systemen === :!: Die folgende Abschnitt ist nur für alte Versionen notwendig, aktuelle Versionen haben das eingebaut und fahren die Gäste mit einem timeout (300s) herunter. Auch das init-script für libvirt-bin (bei [[debian:Debian]]: ''/etc/init.d/libvirt-bin'') sollte um folgenden Code bzw. um einen Aufruf dieses Script ergänzt werden. Konkret an diesen Stellen: [...] stop) log_daemon_msg "Stopping $DESC" "$NAME" # shutdown all guests gracefully (at least try) /srv/kvm/kvm-shutdown-all-guests.sh [...] und [...] force-stop) log_daemon_msg "Forcefully stopping $DESC" "$NAME" # shutdown all guests gracefully (at least try) /srv/kvm/kvm-shutdown-all-guests.sh [...] kvm-shutdown-all-guests.sh ([[http://exain.wordpress.com/2009/05/22/auto-shutdown-kvm-virtual-machines-on-system-shutdown/|Quelle1]], [[http://www.linux-kvm.com/content/stop-script-running-vms-using-virsh|Quelle2]]): #!/bin/bash # File: /srv/kvm/kvm-shutdown-all-guests.sh # Description: Shutdown active virtual machines # Author: Ed Heron # Note: 2010.09.30 some cosmetic changes (alls vars in header, countdown with numbers not dots) # Date: 2009.11.13 Copy placed on centos-virt@centos.org # Note: 2009.11.23 Bugfixes and hoovering by torkil # # ===== VARS ===== DEBUG=1 # Comment this out if you really want to use this script in production FAKE=1 # Comment this out if you really want to use this script in production function reset_timers { shutdown_count=120 # time in seconds for shutdown process before destroy destroy_count=10 # time in seconds before destroy times-out } # ===== CODE ===== # Get list of active virtual machines vmList="`virsh list | ( while read vmID vmName vmStatus do if [ -n "$vmName" -a "$vmName" != "Name" -a "$vmName" != "Domain-0" ] then [ -z "$vmList" ] && vmList="$vmName" || vmList="$vmList $vmName" fi done echo $vmList )`" # check there are some active VM's if [ -n "$vmList" ] then # Shutdown VM's with verification for vmName in $vmList do reset_timers # Send initial request [ -n "$DEBUG" ] && echo -n "Attempting to shutdown $vmName " [ -z "$FAKE" ] && virsh shutdown $vmName # wait a limited time for the VM to be not running # count=300 while ( virsh list | grep $vmName >/dev/null ) && [ $shutdown_count -gt 0 ] do sleep 1 let shutdown_count=$shutdown_count-1 [ -n "$DEBUG" ] && echo -n " $shutdown_count " # [ -n "$DEBUG" ] && echo -n "." done # report current status ( virsh list | grep $vmName >/dev/null ) && echo " failed!" || echo " down." # if still running, destroy it if ( virsh list | grep $vmName >/dev/null ) then [ -n "$DEBUG" ] && echo -n "Attempting to destroy $vmName " [ -z "$FAKE" ] && virsh destroy $vmName # wait a limited time for the VM to be not running #count=60 while ( virsh list | grep $vmName >/dev/null ) && [ $destroy_count -gt 0 ] do sleep 1 let destroy_count=$destroy_count-1 [ -n "$DEBUG" ] && echo -n " $destroy_count " # [ -n "$DEBUG" ] && echo -n "." done # report current status ( virsh list | grep $vmName >/dev/null ) && echo " failed!" || echo " down." fi done fi Alternativ könnte man [[http://exain.wordpress.com/2009/05/22/auto-shutdown-kvm-virtual-machines-on-system-shutdown/|alle Gäste per SSH herunterfahren]], das erfordert allerdings [[netzwerke:SSH]]-Server und funktionierendes Netzwerk. Also lange nicht so robust wie den shutdown-Befehl direkt über libvirt abzusetzen. ==== KVM-Gäste mit den guest-tools abfragen ==== ''echo "/var/lib/libvirt/qemu/channel/target/* rw," >> /etc/apparmor.d/abstractions/libvirt-qemu'' # im Gast: ''sudo apt install qemu-guest-agent'' ''virsh edit $VM'' virsh qemu-agent-command $VM '{"execute":"guest-network-get-interfaces"}' | jq **arch-Version "pc-0.12"** hvm gibt es eine Fehlermeldung: error: Failed to start domain $VM error: internal error: process exited while connecting to monitor: 2019-11-18T22:46:28.642518Z qemu-system-x86_64: -device virtserialport,bus=virtio-serial0.0,nr=1,chardev=charchannel0,id=channel0,name=org.qemu.guest_agent.0: virtio-serial-bus: Out-of-range port id specified, max. allowed: 0 **Lösung**: hvm Quellen: * https://serverfault.com/questions/672253/how-to-configure-and-use-qemu-guest-agent-in-ubuntu-12-04-my-main-aim-is-to-get * http://wiki.stoney-cloud.org/wiki/Qemu_Guest_Agent_Integration * https://wiki.libvirt.org/page/Qemu_guest_agent