[[Vorlage(getestet, jammy)]] [[Vorlage(Fortgeschritten)]] {{{#!vorlage Wissen [:Pakete installieren: Installation von Programmen] [:Terminal: Ein Terminal öffnen] [:Programme starten: Ein Programm starten] [:KVM: KVM] Kernel-basierte virtuelle Maschinen [:QEMU:QEMU] Freier Emulator und Virtualisierer [:Virtualisierung:Virtualisierung] Allgemeine Einführung in die Virtualisierung [:mit Root-Rechten arbeiten:] }}} [[Inhaltsverzeichnis(3)]] [[Bild(libvirt-logo.png, 85, align=left)]] [https://libvirt.org/manpages/virsh.html virsh] {en} ist ein Werkzeug zum Verwalten virtueller Maschinen[6] unter Xen, QEMU, KVM, LXC, Test, OpenVZ, VirtualBox, OpenNebula oder VMware ESX. Man kann eine Maschine von der Kommandozeile aus erstellen, löschen, starten, stoppen und verwalten. Virsh ist für den fortgeschrittenen Linuxadministrator von Interesse, um einfache Skriptautomatismen für die Virtualisierung zu realisieren. Dieser Artikel ist besonders auf die Nutzung von virsh mit [:KVM:KVM] ausgelegt. Wenn man sich bisher noch nicht mit Virtualisierung[6] beschäftigt hat oder bisher nur graphische Oberflächen wie die von Virtual-Box gewohnt ist und jetzt tiefer einsteigen möchte, sollte nach Möglichkeit erst mit der reinen KVM- oder QEMU-Technik auf der Konsole beginnen, um die Konfigurationsspezifika z.B. für eine Windowsmaschine kennen zu lernen. Für einen stabilen Betrieb ist hier im Vorfeld einiges zu Themen, welche Virtuelle Netzwerkkarte oder welcher Festplattendateityp für den Fall das Beste sind[4][5], zu klären. Die Vorteile von virsh liegen dann im vereinfachten Verwalten der virtuellen Instanzen. virsh ist ein Teil des [http://libvirt.org/ Libvirt-Projekts] {en}, das eine Befehlssammlung (Library) für diverse Programmiersprachen zur Verfügung stellt, mit denen die [wikipedia:Hypervisor:Hypervisoren] gesteuert werden können. Es stellt gewissermaßen die Befehlssätze in der Shell zur Verfügung. = Installation = Virsh wird über das [packages:libvirt-daemon-system:]-Paket installiert [1]. Das Paket [packages:virtinst:] wird zusätzlich für den Befehl `virt-install` benötigt: {{{#!vorlage Paketinstallation libvirt-daemon-system, main virtinst, main }}} = Verbindung zum Hypervisor = Die virtuellen Maschinen werden über einen libvirt-[:Dienste:Daemon] verwaltet, den man z.B. mit virsh über die Kommandozeile bedienen kann. Der Daemon läuft entweder mit Root-Rechten, oder mit Benutzerrechten, dabei ist man jedoch in den Einstellungen Beschränkt (z.B. Netzwerk, USB-Geräte durchreichen). Siehe [https://libvirt.org/daemons.html#operating-modes libvirt daemon operation modes] {en}. Im Folgenden wird der Fall beschrieben, in der der Daemon mit Root-Rechten läuft, was unter Ubuntu als Standard vorkonfiguriert ist (die entsprechende Umgebungsvariable wird mit '''/etc/profile.d/libvirt-uri.sh''' gesetzt). Damit man beim Zugriff auf den libvirt-Daemon micht selbst Root-Rechte anwenden muss, kann man seinen Benutzer der Gruppe ''libvirt'' zuweisen: {{{#!vorlage Befehl sudo usermod -aG libvirt $USER }}} Die Änderung wird erst nach einem Neustart des Rechners übernommen. = Virtuelle Maschine erstellen = Virtuelle Maschinen, die mit virsh verwaltet werden, erstellt man durch Definition der Maschine in einer libvirt-XML-Datei. Soweit man die Syntax noch nicht kennt, sollte man mit `virt-install` eine erste XML-Datei bzw. die Virtuelle Maschine komplett damit erstellen. == virt-install– Einrichtung einer virtuellen Maschine == Der nachfolgende Befehl erstellt eine erste Linux-VM mittels virt-install. Sie heißt in diesem Fall [wikipedia:Foo:foo], hat 2048 MB Ram, eine CPU, eine Festplatte mit 20 GB sowie ein ISO-Image mit dem Betriebssystem-Installer. Wenn man schon mal eine VM unter QEMU direkt gestartet hat, wird man sich an dieser Stelle schnell zurecht finden. Näheres dazu welche Einstellung zu welcher VM passen findet man bei QEMU[5] oder KVM[6]. {{{#!vorlage Befehl virt-install --connect qemu:///system \ --name foo \ --memory 2048 \ --vcpus=1 --accelerate \ --graphics spice,keymap=de \ --disk /var/lib/libvirt/images/festplatte1.img,size=20 \ --cdrom /var/lib/libvirt/images/installer.iso \ --network=default }}} Die virtuelle Festplatte sollte sich im Ordner '''/var/lib/libvirt/images''' befinden. Für diesen Ordner existiert eine Ausnahmeregel in den Regeln der vorinstallierten [:AppArmor:]-Schutzsoftware, zu finden in der Datei '''/etc/apparmor.d/usr.lib.libvirt.virt-aa-helper'''. Auf andere Ordner kann wegen fehlenden Berechtigungen nicht zugegriffen werden. == Optionen von virt-install == {{{#!vorlage Tabelle Einige grundlegende Optionen von virt-install +++ '''Option''' '''Erklärung''' +++ ``--help`` Zeigt die Hilfe-Meldungen +++ ``--name=NAME `` Name der Gastinstanz bzw. in virt-install-Domäne genannt +++ ``--memory MEMORY`` Arbeitsspreicher +++ ``--vcpus=VCPUS`` Anzahl der virtuellen CPU's für die VM +++ ``--disk DISKFILE,size=SIZE`` Dateiname und Pfad, der als Festplattenimage mit Größe SIZE benutzt werden soll +++ ``--import`` erstellt das Festplatten-Image nicht neu (vorhandene VM's oder Backups aufnehmen) +++ ``--network=NETWORK`` verbindet den Gast zu einem virtuellen Netzwerk +++ ``--graphics `` Einstellung der Grafik, z.B. spice oder VNC }}} = Netzwerk = Libvirt kann aus den von [:QEMU/#Netzwerk: QEMU] zur Verfügung gestellten Netzwerk-Optionen automatisch oder mit Benutzerhilfe ein komplexeres Netzwerk erstellen: * ''user'': Einfaches QEMU-Netzwerk, bei dem die virtuelle Maschine über NAT mit dem Host verbunden ist. Wenig effizient. * ''default'': Erzeugt eine Brücke im Host und verbindet die virtuellen Maschinen über ein Tap-Device. Die Brücke wird über NAT mit dem Host-Netzwerk verbunden und es wird ein DHCP-Server für die Brücke gestartet. * ''bridge'': Die virtuelle Maschine wird mit einer vom Benutzer auf dem Host erstellten Netzwerkbrücke verbunden. * ''none'': Kein Netzwerk = Verbinden mit der virtuellen Maschine = Man kann sich in der virtuellen ''"foo"''-Maschine einloggen mit {{{#!vorlage Befehl virt-viewer foo }}} oder sich über virsh eine Konsole geben lassen: {{{#!vorlage Befehl virsh console foo }}} Die Konsole verlässt man dann mit den gleichzeitig gedrückten Tasten [[Vorlage(Tasten, Strg + AltGr + 9)]] oder [[Vorlage(Tasten, Strg + 5)]]. = Arbeiten mit virtuellen Maschinen = Hat man eine VM aufgesetzt, kann man sie auf verschiedene Arten mit virsh bearbeiten. * Starten der VM{{{#!vorlage Befehl virsh start foo }}} * Neustart der VM{{{#!vorlage Befehl virsh reboot foo }}} * Ausschalten der VM via [wikipedia:ACPI:]{{{#!vorlage Befehl virsh shutdown foo }}} {{{#!vorlage Hinweis Damit der Shutdown via ACPI funktioniert, muss dies auch vom Betriebssystem in der VM unterstützt werden. Alternativ bleibt sonst nur ein hartes Ausschalten über virsh destroy }}} * Hartes Auschschalten der VM ("Stecker ziehen"){{{#!vorlage Befehl virsh destroy foo }}} * Pausieren bzw. Einfrieren der VM{{{#!vorlage Befehl virsh suspend foo }}} * Aufheben des Pausezustands einer VM{{{#!vorlage Befehl virsh resume foo }}} * VM's auflisten{{{#!vorlage Befehl virsh list }}} {{{ Id Name State ---------------------------------- 1 foo running }}} == Löschen einer VM == Um eine VM löschen zu können, muss man sie erst einmal auflösen, um dann die Definition in libvirt aufheben zu können. {{{#!vorlage Befehl virsh destroy foo_new virsh undefine foo_new }}} Eventuell verknüpfte virtuelle Festplatten werden dabei nicht automatisch gelöscht. = VM-Konfiguration = Man kann aber auch die VMs direkt über eine Konfigurationsdatei im [wikipedia:XML:]-Format erstellen. Eine solche Datei kann man in das '''/tmp/'''-Verzeichnis exportieren, indem man in das Terminal [2] Folgendes eingibt: {{{#!vorlage Befehl virsh dumpxml foo > /tmp/foo.xml }}} Sobald man die XML-Datei angepasst hat, kann man daraus eine neue Virtuelle Maschine erstellen und automatisch laufen lassen: {{{#!vorlage Befehl virsh create /tmp/foo_new.xml }}} Alternativ kann man die VM auch nur definieren, ohne sie zu starten: {{{#!vorlage Befehl virsh define /tmp/foo_new.xml }}} Am einfachsten lässt sich die Datei mit dem Befehl `virsh edit` bearbeiten. Beim ersten Start des Befehls kann man sich aus einer Liste seinen bevorzugen Texteditor auswählen. {{{#!vorlage Befehl virsh edit foo }}} Wesentlich umfangreichere Optionen zur Verwendung finden sich in der [:man:Manpage] von virsh. = Werkzeuge = Mit` virt-top` kann man sich einen Überblick über die Lastverteilung unter den laufenden virtuellen Maschinen machen. {{{#!vorlage Paketinstallation virt-top }}} Mit folgendem Befehl ruft man `virt-top` dann auf: {{{#!vorlage Befehl virt-top }}} und mit [[Vorlage(Tasten, Q)]] kann man `virt-top` wieder verlassen. = Problemlösung = == Festplattenimage wird mit Maximalgröße angelegt == Beim [wikipedia_en:Qcow#qcow2:qcow2]-Format für Festplattenimages wird das Image mit einer maximalen Größe definiert, aber als ''"sparse"''-Image angelegt und nimmt damit als Datei nur so viel Platz ein, wie im Image belegt ist. Legt man ein solches Festplattenimage mit virt-install oder mit dem virt-manager an, wird das Image aber gleich mit der vollen Größe angelegt. Möchte man das nicht, kann man das Festplattenimage selbst mit [man:qemu-img:] anlegen, oder ein bestehendes Image mit `virt-sparsify` wieder verkleinern. = Links = * [:virt-manager:] - GNOME- und libvirt-basierter VM-Manager * [man:virsh:Manpage] {en} * [https://www.linux-magazin.de/Ausgaben/2011/12/Virsh Virtuelle Maschinen fernsteuern mit Virsh] {de} - Artikel Linux Magazin, 12/2011 * [https://libvirt.org/drivers.html Hypervisor] {en}, die von libvirt unterstützt werden * [youtube:HfNKpT2jo7U:Linux Hypervisor Setup (libvirt/qemu/kvm)] {en} - Installation und Konfiguration von libvirt * [youtube:6435eNKpyYw:VM Networking ( Libvirt / Bridge )] {en} - Netzwerkkonfiguration mit libvirt #tag: Emulation und Virtualisierung, Server