Virsh - Kommandozeilenwerkzeug zur Verwaltung virtueller Maschinen

Aus Thomas-Krenn-Wiki
Wechseln zu: Navigation, Suche

Das Kommandozeilenwerkzeug Virsh des libvirt Toolkits dient zur Verwaltung von virtuellen Maschinen. Es unterstützt dabei zahlreiche Virtualisierungstechnologien, darunter KVM, Hyper-V, VMware, LXC oder Xen.[1] Dieser Artikel erklärt die Grundlagen von Virsh, zeigt das Zusammenspiel mit Libvirtd und erläutert anhand Beispiele an einem POWER8-System, wie die Administration von KVM-basierten VMs damit gelingt. Informationen zum grafischen Tool Virtual Machine Manager und eine Installationsanleitung von KVM mit OpenPOWER finden Sie in unserem Wiki.

Grundlagen

Das Libvirt-Projekt ermöglicht eine einheitliche Verwaltungszentrale für unterschiedliche Virtualisierungslösungen und Hypervisoren. Das Management kann über die grafische Oberfläche des Virtual Machine Managers erfolgen, aber auch über das Kommandozeilentool Virsh. Normalerweise wird Virsh zusammen mit dem Paket libvirt installiert, Ubuntu jedoch lagert, wie so viele Distributionen, die Libvirt-Tools in ein eigenes Paket aus, es ist über libvirt-bin verfügbar.[2]

Zusammenspiel der Komponenten

Installation unter Ubuntu

Installiert wird Virsh über das Paket libvirt-bin bequem über apt.

$ sudo apt-get install libvirt-bin

Virsh Version ausgeben

Die Ausgabe von virsh version zeigt, ob Virsh installiert ist und korrekt funktioniert. Kommen bei dieser Ausgabe Fehlermeldungen zu Tage, könnte der libvirtd-Daemon nicht aktiv sein. Nachfolgende zwei Ausgaben zeigen die zum Testzeitpunkt identischen Versionen unter POWER8 und X86.

Version bei Ubuntu 16.04.1 unter POWER8:

$ virsh version
Compiled against library: libvirt 1.3.1
Using library: libvirt 1.3.1
Using API: QEMU 1.3.1
Running hypervisor: QEMU 2.5.0

Version bei Ubuntu 16.04.1 unter X86:

$ sudo virsh version
Compiled against library: libvirt 1.3.1
Using library: libvirt 1.3.1
Using API: QEMU 1.3.1
Running hypervisor: QEMU 2.5.0

Verbindungsmöglichkeiten mit Virsh

Virsh unterstützt wie eingangs erwähnt zahlreiche Virtualisierungstechnologien. Zur Verbindung auf ein System sind abhängig von der verwendeten Technolgie, unterschiedliche URIs erforderlich. Die jeweiligen URIs zeigt die folgende Tabelle:

URI Hypervisor
lxc:/// LXC
qemu:///system Qemu/KVM
xen:/// Xen
openvz:///system OpenVZ
vbox:///session VirtualBox
hyperv:///<example.com> Microsoft Hyper-V
esx:///<example.com> VMware ESX-Server
gsx:///<example.com> VMware GSX
vmwareplayer:///session VMware Player
vmwarews:///session VMware Workstation

Virsh-Parameter im Überblick

Darüberhinaus erlaubt Virsh, unter Zuhilfename einer Vielzahl von Parametern, vielfältige Administrationsmöglichkeiten. Nachfolgende Tabelle zeigt die wichtigsten Parameter auf.

Befehl Erklärung
list --all Listet alle virtuellen Maschinen auf
list --inactive Listet alle inaktiven virtuellen Maschinen auf
dominfo <VM-Bezeichnung> Ausgabe aller Informationen zur virtuellen Maschine
nodeinfo Liefert Informationen zum KVM-Host (linux-magazin schreibt Gastsystem)
start <VM-Bezeichnung> Startet die virtuelle Maschine
shutdown <VM-Bezeichnung> Fährt die VM ordentlich herunter
destroy <VM-Bezeichnung> Die VM wird sofort heruntergefahren
suspend <VM-Bezeichnung> Pausiert die virtuelle Maschine
resume <VM-Bezeichnung> Die VM wird fortgesetzt
console <VM-Bezeichnung> Die Konsolenausgabe der VM wird gestartet
dumpxml <VM-Bezeichnung> Die XML-Konfigurationsdatei der angegebenen VM wird auf der Standardausgabe ausgegeben
create vm.xml Eine neue VM wird auf Basis der übergebenen XML-Datei erstellt
undefine <VM-Bezeichnung> Die angegebene VM wird gelöscht, die virtuelle Festplatte verbleibt aber im Datenspeicher
setmem <VM-Bezeichnung> <Speichergröße> Die RAM-Größe kann mit setmem angepasst werden
setvcpus <VM-Bezeichnung> <Anzahl-CPUs> Die CPUs können mit setvcpus angepasst werden
migrate <VM-Bezeichnung> <URI> Eine Migration der VM zum Host mit dessen angegebener URI wird durchgeführt

libvirtd-Daemon nicht gestartet

Falls der libvirtd-Daemon gerade nicht läuft, erfolgt folgende Fehlermeldung:

$ sudo virsh version
error: failed to connect to the hypervisor
error: no valid connection
error: Failed to connect socket to '/var/run/libvirt/libvirt-sock': No such file or directory

libvirtd Daemon starten

Dieser Daemon kann per folgendem Befehl gestartet werden:

$ sudo service libvirt-bin start

Lokale Verbindung per Virsh

Die Verbindung mit dem Libvirtd-Deamon kann per lokal auf dem KVM-Host installiertem Virsh erfolgen:

$ virsh -c qemu:///system

Remote-Verbindung

Zur Verbindung auf entfernte Maschinen werden folgende Protokolle unterstützt:[3]

URI Protokoll
virsh -c qemu+ssh://<USER>@<IP-Adresse>/system
SSH
virsh -c qemu://<USER>@<IP-Adresse>/system
TLS/x509
virsh -c qemu+tcp://<USER>@<IP-Adresse>/system
SASl/Kerberos

Ausgabe der Hostinformationen

Mit nodeinfo erfolgt eine Ausgabe der Hostinformationen:

tk@ubuntu:~$ virsh -c qemu:///system nodeinfo
CPU model:           ppc64le
CPU(s):              64
CPU frequency:       2061 MHz
CPU socket(s):       1
Core(s) per socket:  8
Thread(s) per core:  8
NUMA cell(s):        1
Memory size:         133861312 KiB

Administration mit Virsh

Nachfolgender Abschnitt zeigt die Administration der KVM-Gäste mit Virsh.

Virtuelle Maschine starten

Virtuelle Maschinen können mit Virsh bequem über den Parameter start gestartet werden.

$ virsh start ubuntu-kvm-test-vmm
Domain ubuntu-kvm-test-vmm started

Überblick über laufende virtuellen Maschinen

Mit dem Aufruf von nachfolgendem Kommando werden alle aktuell laufenden virtuellen Maschinen angezeigt. Der Parameter -c bedeutet connect und verbindet Virsh mit Qemu und list --all bewirkt eine Auflistung aller vorhandenen virtuellen Maschinen, darunter die laufenden und pausierten, auf. qemu:///system stellt eine URI dar, die Virsh die genutzte Virtualisierungsmethode zurückliefert, in diesem Fall qemu.

$ virsh -c qemu:///system list --all
 Id    Name                           State
----------------------------------------------------
 4     ubuntu-kvm-test-vmm            running
 -     ubuntu-kvm-test1               shut off
 -     ubuntu16.04                    shut off

Konsole der VM starten

Bei der gestarteten VM kann nun mittels des Parameters console eine Konsolensitzung gestartet werden.

$ virsh console ubuntu-kvm-test-vmm
Connected to domain ubuntu-kvm-test-vmm
Escape character is ^]
Linux ppc64le
#50-Ubuntu SMP W
Ubuntu 16.04.1 LTS ubuntu-kvm-test-vmm hvc0

ubuntu-kvm-test-vmm login:

Die Konsole kann per per STRG+5 beendet werden.

VM entfernen

Durch den Parameter undefine kann eine VM komplett entfernt werden, die Festplatten-Abbilder bleiben aber erhalten:

tk@ubuntu:~$ virsh -c qemu:///system undefine ubuntu-kvm-vmm
Domain ubuntu-kvm-vmm has been undefined

Die VM ist nun vom System entfernt:

tk@ubuntu:~$ virsh -c qemu:///system list --all
 Id    Name                           State
----------------------------------------------------

XML-Datei erstellen und bearbeiten

Sie können die Konfiguration einer spezifischen VM in eine XML-Datei umleiten, bearbeiten und mittels einer XML-Datei eine neue VM erstellen.

$ virsh -c qemu:///system dumpxml ubuntu-kvm-vmm > /home/tk/ubuntu-kvm-vmm.xml
  • Inhalt der XML-Datei:
<domain type='kvm' id='1'>
  <name>ubuntu-kvm-test1</name>
  <uuid>8720a1c6-658b-4390-8754-6b8327e81a70</uuid>
  <memory unit='KiB'>1048576</memory>
  <currentMemory unit='KiB'>1048576</currentMemory>
  <vcpu placement='static'>2</vcpu>
  <resource>
    <partition>/machine</partition>
  </resource>
  <os>
    <type arch='ppc64le' machine='pseries-2.5'>hvm</type>
    <boot dev='cdrom'/>
    <boot dev='hd'/>
  </os>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>destroy</on_reboot>
  <on_crash>destroy</on_crash>
  <devices>
    <emulator>/usr/bin/qemu-system-ppc64le</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/var/lib/libvirt/images/ubuntu-kvm-vmm.img'/>
      <backingStore/>
      <target dev='vda' bus='virtio'/>
      <alias name='virtio-disk0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </disk>
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <source file='/home/tk/Downloads/ubuntu-16.04.1-server-ppc64el.iso'/>
      <backingStore/>
      <target dev='sda' bus='scsi'/>
      <readonly/>
      <alias name='scsi0-0-0-0'/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>
    <controller type='usb' index='0'>
      <alias name='usb'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </controller>
    <controller type='pci' index='0' model='pci-root'>
      <alias name='pci.0'/>
    </controller>
    <controller type='scsi' index='0'>
      <alias name='scsi0'/>
      <address type='spapr-vio' reg='0x2000'/>
    </controller>
    <interface type='bridge'>
      <mac address='52:54:00:e4:6e:05'/>
      <source bridge='virbr0'/>
      <target dev='vnet0'/>
      <model type='rtl8139'/>
      <alias name='net0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
    </interface>
    <serial type='pty'>
      <source path='/dev/pts/1'/>
      <target port='0'/>
      <alias name='serial0'/>
      <address type='spapr-vio' reg='0x30000000'/>
    </serial>
    <console type='pty' tty='/dev/pts/1'>
      <source path='/dev/pts/1'/>
      <target type='serial' port='0'/>
      <alias name='serial0'/>
      <address type='spapr-vio' reg='0x30000000'/>
    </console>
    <input type='keyboard' bus='usb'>
      <alias name='input0'/>
    </input>
    <input type='mouse' bus='usb'>
      <alias name='input1'/>
    </input>
    <graphics type='vnc' port='5900' autoport='yes' listen='127.0.0.1'>
      <listen type='address' address='127.0.0.1'/>
    </graphics>
    <video>
      <model type='vga' vram='16384' heads='1'/>
      <alias name='video0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </video>
    <memballoon model='virtio'>
      <alias name='balloon0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </memballoon>
    <panic model='pseries'/>
  </devices>
  <seclabel type='dynamic' model='apparmor' relabel='yes'>
    <label>libvirt-8720a1c6-658b-4390-8754-6b8327e81a70</label>
    <imagelabel>libvirt-8720a1c6-658b-4390-8754-6b8327e81a70</imagelabel>
  </seclabel>
</domain>

Weitere Informationen

Einzelnachweise

  1. Internal drivers - Hypervisor drivers (libvirt.org)
  2. virsh (wiki.ubuntuusers.de)
  3. KVM/QEMU hypervisor driver (libvirt.org)


Foto Thomas Niedermeier.jpg

Autor: Thomas Niedermeier

Thomas Niedermeier, Abteilung Communications / Knowledge Transfer bei Thomas-Krenn, absolvierte an der Hochschule Deggendorf sein Studium zum Bachelor Wirtschaftsinformatik. Seit 2013 ist Thomas bei Thomas-Krenn beschäftigt und kümmert sich hier vor allem um das TKwiki. Er ist ein begeisterungsfähiger, technisch interessierter Linux und Mac Nutzer, fährt im Winter gerne Ski und geht im Sommer gern ins Schwimmbad.


Das könnte Sie auch interessieren

CEP CT63 Modem Installation unter Ubuntu 12.04 LTS
Oracle Java JRE unter Ubuntu installieren
Ubuntu LTS Hardware Enablement Stack