Inhaltsverzeichnis

Administration der vHOSTs

Für die Administration unserer vHOSTs stehen uns mehrere Wege und Mittel zur Verfügung.

Virtual Machine Viewer

Möchten wir nur kurz Zugriff auf eine Maschine, so muss nicht unbedingt der Virtual Machine Manager gestartet werden. Ähnlich wie beim Zugriff per VNC oder Terminal Server Client kann hier ohne grossen Aufwand auf einen vHOST zugegriffen werden.

So kann man z.B. einem Nutzer nur Zufgriff auf eine Maschine geben und muss diesen nicht über den Virtual Machine Manager Zugriff auf alle vHOSTs geben.

Aufgerufen wird der Virtual Machine Viewer z.B. über folgenden Aufruf:

 # virt-viewer --connect qemu:///system CentOS_6_minimal_Desktop

Dabei verbindet sich der Viewer auf den vHOST CentOS_6_minimal_Desktop der auf dem System system unter QEMU läuft.

Bild: Photo des Virtual Machine Viewer

Natürlich können wir uns auch von remote mit der virtuellen Maschine verbinden. Hierzu muss der Nutzer mit den administrativen Rechten auf dem Virtualisierungs-Host der Gruppe libvirt angehören. Wir überprüfen also zunächst ob der Admin-Nutzer django der Gruppe libvirt angehört.

 # getent group libvirt
libvirt:x:982

Wir weisen also der Gruppe libvirt dem Nutzer django zu.

 # usermod -aG libvirt django

Auf dem Administrationsrechner installieren wir das Paket virt-viewer mit dem Paketverwaltungsprogramm des Systems.

 # dnf install virt-viewer -y
 $ sudo apt install virt-viewer -y
 # zyppr in virt-viewer -y

Nun können wir uns mit der virtuellen-Maschine des Virtualisierungssystem verbinden. In folgendem Beispiel verbindet sich der Admin django mit der virtuellen Maschine android-x86 auf dem Virtualisierungs-Host kvm.dmz.nausch.org

 $ virt-viewer --connect qemu+ssh://django@kvm.dmz.nausch.org/system android-x86

Bild: Photo des Virtual Machine Viewer

Virtual Machine Manager

Autostart eines vHOST aktivieren

Soll ein vHOSt nach dem Boten des Wirt-Systems automatisch gestartet werden, so ist der vHOST auf Autostart zu stellen. Hierzu öffnet man die Detailansicht der virtuellen Hardware des betreffenden vHOSTs. Unter dem Menüpunkt Boot Options verbirgt sich die Checkbox [Virtuelle Maschine beim Start des Host starten]. Soll der vHOST automatisch starten, so ist diese Checkbox einfach anzuwählen und die Konfiguration des Autostarts über die Schaltfläche [Anwenden] fertig zu stellen.

Bild: Photo "Autostart Aktivierung" beim des Virtual Machine Managers

vHOST ein-/ausschalten und rebooten

Möchten wir einen vHOST herunterfahren, rebooten oder „hart“ ausschalten, so haben wir meim Virtual Machine Manager unter dem Menüpunkt [Herunterfahren] bzw. über dem Menüpunkt [V], die entsprechenden Optionen.

Bild: "Menüauswahl zum Herunterfahren eines vHOSTS" beim Virtual Machine Manager

vHOST Klonen

Mit Hilfe des Virtual Machine Managers können wir sehr einfach und leicht, Duplikate einer bestehenden Installation (vHOST) anfertigen. Auf nachfolgendem Bild sehen wir den Virtual Machine Manager, bei dem gerade ein VHOST gestartet ist und läuf.

Bild: Photo des Virtual Machine Managers

Das betreffende QCOW2 Festplattenimage befindet sich gemäß unserer Konfiguration unter /var/lib/libvirt/images/.

 # ll /var/lib/libvirt/images/
 insgesamt 2471372
 -rw-------. 1 root root 2530803712  2. Aug 20:35 CentOS_6_minimal_Desktop.img

Die Konfiguration unseres ersten vHOST befindet sich im Ordner /etc/libvirt/qemu/.

 # ll /etc/libvirt/qemu/*xml
 -rw-------. 1 root root 2098  2. Aug 20:32 /etc/libvirt/qemu/CentOS_6_minimal_Desktop.xml
/etc/libvirt/qemu/CentOS_6_minimal_Desktop.xml
<domain type='kvm'>
  <name>CentOS_6_minimal_Desktop</name>
  <uuid>60df5028-ee63-3b33-2946-8839863a9c07</uuid>
  <memory>1048576</memory>
  <currentMemory>1048576</currentMemory>
  <vcpu>1</vcpu>
  <os>
    <type arch='x86_64' machine='rhel6.0.0'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <pae/>
  </features>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2' cache='none'/>
      <source file='/var/lib/libvirt/images/CentOS_6_minimal_Desktop.img'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </disk>
    <disk type='block' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <target dev='hdc' bus='ide'/>
      <readonly/>
      <address type='drive' controller='0' bus='1' unit='0'/>
    </disk>
    <controller type='ide' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
    </controller>
    <interface type='network'>
      <mac address='52:54:00:55:3e:a7'/>
      <source network='default'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <serial type='pty'>
      <target port='0'/>
    </serial>
    <console type='pty'>
      <target port='0'/>
    </console>
    <input type='tablet' bus='usb'/>
    <input type='mouse' bus='ps2'/>
    <graphics type='vnc' port='-1' autoport='yes'/>
    <sound model='ac97'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </sound>
    <video>
      <model type='cirrus' vram='9216' heads='1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </memballoon>
  </devices>
</domain>

Im nachfolgenden Beispiel werden wir den vorhandenen ersten vHOST klonen. Hierzu schalten wir diesen erst einam über den Virtual Machine Managers aus. Mit einem Klick mit der rechten Maustaste öffnet sich der Dialog, wo wir die Option zum Klonen eines Systemes finden.

Bild: Photo des Virtual Machine Managers

Im folgendem Fenster werden wir gebeten, den Namen und den Speicherort anzugeben.

Bild: Photo "Virtuelle Maschine Klonen" des Virtual Machine Managers

Nach dem Anwählen der Schaltfläche [Klonen] wird eine Kopie unseres vHOST angefertigt.

Bild: Photo "Virtuelle Maschine Klonen" des Virtual Machine Managers

Zum Schluß finden wir im Virtual Machine Managers auch unseren zweiten vHOST.

Bild: Photo des Virtual Machine Managers

Im Image-Verzeichmis findedn wir nun zwei QCOW2-Files, ein des originalen vHOST und eine für dessen Klone.

 # ll /var/lib/libvirt/images/
 insgesamt 4893016
 -rw-r--r--. 1 root root 2479882240  2. Aug 21:17 CentOS_6_minimal_Desktop-clone.img
 -rw-------. 1 root root 2530803712  2. Aug 20:35 CentOS_6_minimal_Desktop.img

Auch im Konfigurationsverzeichnis finden wor die beiden zugehörigen XML-Konfigurationsdateien.

 # ll /etc/libvirt/qemu/*xml
 -rw-------. 1 root root 2112  2. Aug 21:16 /etc/libvirt/qemu/CentOS_6_minimal_Desktop-clone_1.xml
 -rw-------. 1 root root 2098  2. Aug 20:32 /etc/libvirt/qemu/CentOS_6_minimal_Desktop.xml

vHOST Löschen

Möchten wir einen vHOST löschen so klicken wir im Virtual Machine Manager einfach mit der rechten Maustaste auf den betreffenden vHOST. Dort finden wir den Menüpunkt [Löschen]

Bild: "Löschen eines vHOSTs" beim Virtual Machine Manager

Mit der Checkbox [Zugehörige Dateien löschen] haben wir die Möglichkeit nicht nur die XML-Konfigurationsdatei im Verzeichnis /etc/libvirt/qemu/ zu löschen, sondern auch das Festpalttenimage (QCOW2) im Imageverzeichnis /var/lib/libvirt/images/.

Bild: "Bestätigen zum Löschen" beim Virtual Machine Manager

SPICE

Eine sehr interessante Alternative zum virt-mananger ist SPICE. SPICE 1) ist ein System zum Anzeigen von virtuellen Umgebungen, welches es erlaubt, virtuelle Desktopumgebungen überall über das Netzwerk anzuzeigen, auch auf verschiedenen Architekturen. Das interessante Feature gegenüber virt-manager und virt-viewer ist die Möglichkeit, neben den Videodaten auch die Audiodaten zu vom vHOST zum Client zu übertragen.

Server

Installation

Falls noch nicht bei der Grundinstallation erfolgt, installieren wir das RPM-Paket spice-server auf unserem Wirt-System.

 # yum install spice-server -y

Konfiguration

Zur Konfiguration unseres vHOSTs verwenden wir am besten die Option edit von virsh. Zuvor beenden wir aber erst noch unsere virtuelle Maschine.

 # virsh shutdown vml010008

Anschließend bearbeiten wir die zum vHOST passende XML-Konfigurationsdatei.

 # virsh edit vml010008

Ein standardmäßiges XML-File eines vHOSTs, welches wir mit Hilfe von virt-manager erzeugt haben, sieht exemplarisch wie folgt aus.

<domain type='kvm'>
  <name>vml010008</name>
  <uuid>422b4bb1-ee3c-7df3-805e-aa8f36feb7d3</uuid>
  <memory>1048576</memory>
  <currentMemory>1048576</currentMemory>
  <vcpu>1</vcpu>
  <os>
    <type arch='x86_64' machine='rhel6.0.0'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <pae/>
  </features>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2' cache='none'/>
      <source file='/var/lib/libvirt/images/vml010008.img'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </disk>
    <disk type='block' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <target dev='hdc' bus='ide'/>
      <readonly/>
      <address type='drive' controller='0' bus='1' unit='0'/>
    </disk>
    <controller type='ide' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
    </controller>
    <interface type='bridge'>
      <mac address='52:54:00:ab:de:7b'/>
      <source bridge='br1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <serial type='pty'>
      <target port='0'/>
    </serial>
    <console type='pty'>
      <target port='0'/>
    </console>
    <input type='tablet' bus='usb'/>
    <input type='mouse' bus='ps2'/>
    <graphics type='vnc' port='-1' autoport='yes'/>
    <sound model='ac97'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </sound>
    <video>
      <model type='cirrus' vram='9216' heads='1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </memballoon>
  </devices>
</domain>

Folgende Zeilen des XML-Files passen wir nun an:

Anstatt dem graphics type='vnc' setzen wir nun graphics type='spice', gefolgt von der Angabe des ports und letztliches eines Passwortes, welches zum Verbinden mit dem vHOST später benötigt wird. Die komplette Konfigurationszeile lautet:

Bei der Definition der Graphikkarte tauschen wir den model type='cirrus' gegen model type='qxl', so dass die komplette Zeile im XML-Fiel nunmehr lautet:

Das XML-File unseres exemplarischen vHOSTs lautet somit:

<domain type='kvm'>
  <name>vml010008</name>
  <uuid>422b4bb1-ee3c-7df3-805e-aa8f36feb7d3</uuid>
  <memory>1048576</memory>
  <currentMemory>1048576</currentMemory>
  <vcpu>1</vcpu>
  <os>
    <type arch='x86_64' machine='rhel6.0.0'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <pae/>
  </features>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2' cache='none'/>
      <source file='/var/lib/libvirt/images/vml010008.img'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </disk>
    <disk type='block' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <target dev='hdc' bus='ide'/>
      <readonly/>
      <address type='drive' controller='0' bus='1' unit='0'/>
    </disk>
    <controller type='ide' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
    </controller>
    <interface type='bridge'>
      <mac address='52:54:00:ab:de:7b'/>
      <source bridge='br1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <serial type='pty'>
      <target port='0'/>
    </serial>
    <console type='pty'>
      <target port='0'/>
    </console>
    <input type='tablet' bus='usb'/>
    <input type='mouse' bus='ps2'/>
    <graphics type='spice' port='5930' autoport='no' listen='0.0.0.0' passwd='nerdbert-ist-doof!'/>
    <sound model='ac97'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </sound>
    <video>
      <model type='qxl' vram='32768' heads='1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </memballoon>
  </devices>
</domain>

Abschließend brauchen wir nun nur noch unsere virtuelle Maschine zu starten

 # virsh start vml010008

Client

Installation

Auf Seite unseres CentOS 6.x Clients benötigen wir nun das RPM-Paket spice-client auf unserem Arbeitsplatzrechner.

 # yum install spice-client -y

Programmaufruf

Möchten wir uns nun mit unserem vHost verbinden benutzen wir folgende Befehlsfolge.

 $ spicec -h virtualisierungshost.intra.nausch.org -p 5930 -w nerdbert-ist-doof!

Die Optionen haben hierbei folgende Bewandnis:

Im folgenden Beispiel erfolgt die Anzeige der virtuellen Maschine im SPICE-Fenster und die Audiodaten werden von der virtuellen Maschien zum realen Host übertragen und dort über die Soundkarte ausgegeben.

SPICE Client Bildschirmfenster

Management mit virsh

Natürlich kann man auch die Administration auf Konsolebene durchführen und ist nicht zwingend auf die GUI Virtual Machine Manager angewiesen. Nachfolgend gehen wir auf die wichtigsten Befehle von virsh ein.

Liste aller laufenden vHOSTs

Eine Aufstellung aller gerade laufenden vHOSTs bekommt man mnit der Option list.

 # virsh list
 Id Name                 Status
----------------------------------
  4 vHOST_7              laufend
  5 vHOST_3              laufend
  7 vHOST_8              laufend
  8 vHOST_2              laufend
  9 vHOST_9              laufend
 10 vHOST_1              laufend

Liste aller vHOSTs

Möchte man eine Übersicht aller Gäste, also die gerade Laufen und welche die heruntergefahren oder pausiert wurden, ergänzt man die vorgenannte Option einfach auf list –all.

 # virsh list --all
 Id Name                 Status
----------------------------------
  4 vHOST_7              laufend
  5 vHOST_3              laufend
  7 vHOST_8              pausiert
  8 vHOST_2              laufend
  9 vHOST_9              laufend
 10 vHOST_1              laufend
  - CentOS_6_minimal_Desktop ausschalten
  - vHOST_4              ausschalten
  - vHOST_5              ausschalten
  - vHOST_6              ausschalten

Starten eines vHOSTs

Zum Starten eines vHOSTs benötigt man die Option start.

 # virsh start vHOST_5
 Domain vHOST_5 gestartet

Anhalten eines vHOSTs

Will man hingegen ein Gast-System „pausieren“, also in den Suspend-Mode versetzen, verwendet amn die Option suspend.

 # virsh suspend vHOST_1
 Domain vHOST_1 angehalten

angehaltenen vHOST fortsetzen

Einen zuvor angehaltenen vHOST versetzt man mit der Option resume wieder in den Produktionsbetrieb.

  # virsh resume vHOST_8
 Domain vHOST_8 fortgesetzt

Shutdown eines vHOSTs

Zum kontrollierten Stillegen (shutdown) eines vHOSTs benutzt man einfach die Option shutdown.

 # virsh shutdown vHOST_7
 Domain vHOST_7 wird heruntergefahren

Poweroff eines vHOSTs

Bei einem normalen Rechner/Server kann man einfach den Stecker ziehen oder bei einem LapTop die Batterie entfernen. So ein hartes Ausschalten ist in der Regel keinesfalls zu empfehlen, kann doch so das System erheblichen Schaden nehmen. Bei unserer Virtualisierungsumgebung haben können wir auch das imaginäre Steckernetzteilkabel ziehen, hierzu benötigen wir die Option destroy.

ACHTUNG:

Es erfolgt keinerlei Warnung bei der Aktion!

 # virsh destroy vHOST_9
 Domain vHOST_9 gelöscht

Konfiguration eines vHOSTs editieren

Will man das XML-File einer virtuellen Maschine per Hand bearbeiten so nutzt man am besten den Befehl edit.

 # virsh edit vml010008
<domain type='kvm'>
  <name>vml010008</name>
  <uuid>422b4bb1-ee3c-7df3-805e-aa8f36feb7d3</uuid>
  <memory>1048576</memory>
  <currentMemory>1048576</currentMemory>
  <vcpu>1</vcpu>
  <os>
    <type arch='x86_64' machine='rhel6.0.0'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <pae/>
  </features>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2' cache='none'/>
      <source file='/var/lib/libvirt/images/vml010008.img'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </disk>
    <disk type='block' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <target dev='hdc' bus='ide'/>
      <readonly/>
      <address type='drive' controller='0' bus='1' unit='0'/>
    </disk>
    <controller type='ide' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
    </controller>
    <interface type='bridge'>
      <mac address='52:54:00:ab:de:7b'/>
      <source bridge='br1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <serial type='pty'>
      <target port='0'/>
    </serial>
    <console type='pty'>
      <target port='0'/>
    </console>
    <input type='tablet' bus='usb'/>
    <input type='mouse' bus='ps2'/>
    <graphics type='spice' port='5930' autoport='no' listen='0.0.0.0' passwd='yaq12wsx'/>
    <sound model='ac97'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </sound>
    <video>
      <model type='qxl' vram='32768' heads='1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </memballoon>
  </devices>
</domain>

Konfiguration eines vHOSTs exportieren

Möchte man das XML-Konfiguration eines vHOSTs exportieren, so bemüht man die Option dumpxml. Die Ausgabe erfolgt dabei auf dem Bildschirm, bei Bedarf leitet man die Ausagabe mit einem > dumpfilename einfach in eine Datei um.

 # virsh dumpxml vHOST_1
<domain type='kvm' id='10'>
  <name>vHOST_1</name>
  <uuid>fb8a8a5f-0252-1544-e71d-ed0dcbaab4ee</uuid>
  <memory>1048576</memory>
  <currentMemory>1048576</currentMemory>
  <vcpu>1</vcpu>
  <os>
    <type arch='x86_64' machine='rhel6.0.0'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <pae/>
  </features>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2' cache='none'/>
      <source file='/var/lib/libvirt/images/CentOS_6_minimal_Desktop-clone.img'/>
      <target dev='vda' bus='virtio'/>
      <alias name='virtio-disk0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </disk>
    <disk type='block' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <target dev='hdc' bus='ide'/>
      <readonly/>
      <alias name='ide0-1-0'/>
      <address type='drive' controller='0' bus='1' unit='0'/>
    </disk>
    <controller type='ide' index='0'>
      <alias name='ide0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
    </controller>
    <interface type='network'>
      <mac address='52:54:00:48:03:76'/>
      <source network='default'/>
      <target dev='vnet9'/>
      <model type='virtio'/>
      <alias name='net0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <serial type='pty'>
      <source path='/dev/pts/10'/>
      <target port='0'/>
      <alias name='serial0'/>
    </serial>
    <console type='pty' tty='/dev/pts/10'>
      <source path='/dev/pts/10'/>
      <target port='0'/>
      <alias name='serial0'/>
    </console>
    <input type='tablet' bus='usb'>
      <alias name='input0'/>
    </input>
    <input type='mouse' bus='ps2'/>
    <graphics type='vnc' port='5909' autoport='yes'/>
    <sound model='ac97'>
      <alias name='sound0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </sound>
    <video>
      <model type='cirrus' vram='9216' heads='1'/>
      <alias name='video0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
    <memballoon model='virtio'>
      <alias name='balloon0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </memballoon>
  </devices>
  <seclabel type='dynamic' model='selinux'>
    <label>system_u:system_r:svirt_t:s0:c188,c495</label>
    <imagelabel>system_u:object_r:svirt_image_t:s0:c188,c495</imagelabel>
  </seclabel>
</domain>

Snapshoot eines vHOSTs speichern

Möchten wir einen Snapshoot eines laufenden vHOSTs machen, so benutzen wir die Option save, damit der gesamte Domainstatus ein einer Datei gespeichert wird.

 # virsh save vHOST_3 /var/lib/libvirt/qemu/snapshot/vHOST_3_20110803
 Domain vHOST_3 nach /var/lib/libvirt/qemu/snapshot/vHOST_3_20110803 gespeichert

Snapshoot eines vHOSTs zurücksichern

Das Wiederherstellen eines vHOST mit Hilfe eines Snapshootfiles ist kein großer Aufwand- es wird hierzu die Option restore verwendet.

 # virsh restore /var/lib/libvirt/qemu/snapshot/vHOST_3_20110803
 Domain aus /var/lib/libvirt/qemu/snapshot/vHOST_3_20110803 wiederhergestellt

Löschen eines vHOSTs

Möchten wir einen vHOST wieder entfernen, ist auch das Dank des Befehls virsh kein allzu grosser Aufwand. Zunächst stoppen wir die VM, falls diese noch laufen sollte „auf die harte Tour“. In folgendem Beispiel werden wir die VM mit dem Namen vml000200 entfernen.

 # virsh destroy vml000200

Anschliessend löschen wir den vHOST. Da wir auch alle zugehörigen Image-Dateien löschen wollen, benutzen wir zum Löschen die Option –remove-all-storage.

 # virsh undefine vml000200 --remove-all-storage
Domain vml000200 has been undefined
Volume 'vda'(/var/lib/libvirt/images/vml000200.img) removed.

Eine Abfrage, ob diese Maschine weiterhin bekannt ist wird entsprechend negativ beschieden.

 # virsh list --all | grep vml000200

Befehlsliste von virsh abrufen

Eine Überischt aller virsh-Befehle bekommt man mit dem Punbkt help.

 # virsh help
Befehle:

    help            Hilfe ausgeben
    attach-device   Gerät aus einer XML-Datei anhängen
    attach-disk     Plattengerät anhängen
    attach-interface Netzwerkschnittstelle verbinden
    autostart       Eine Domain automatisch starten
    capabilities    Fähigkeiten
    cd              change the current directory
    connect         (Wieder)verbinden mit Hypervisor
    console         Verbindung mit der Gast-Konsole
    cpu-baseline    compute baseline CPU
    cpu-compare     compare host CPU with a CPU described by an XML file
    create          Eine Domain aus einer XML-Datei erstellen
    start           Eine (zuvor definierte) inaktive Domain starten
    destroy         Domain löschen
    detach-device   Gerät von einer XML-Datei lösen
    detach-disk     Plattengerät abtrennen
    detach-interface Netzwerkschnittstelle abhängen
    define          Definiere (aber starte keine) Domain aus einer XML-Datei
    domid           Einen Domain-Namen oder -UUID in Domain-ID konvertieren
    domuuid         Einen Domain-Namen oder -ID in Domain-UUID konvertieren
    dominfo         Domain-Informationen
    domjobinfo      domain job information
    domjobabort     abort active domain job
    domname         Eine Domain-ID oder UUID in Domain-Namen konvertieren
    domstate        Domain-Status
    domblkstat      Geräteblockstatistiken für eine Domain abrufen
    domifstat       Statistiken der Netzwerkschnittstelle für eine Domain abrufen
    dommemstat      get memory statistics for a domain
    domblkinfo      domain block device size information
    domxml-from-native Convert native config to domain XML
    domxml-to-native Convert domain XML to native config
    dumpxml         Domain-Informationen in XML
    edit            edit XML configuration for a domain
    find-storage-pool-sources discover potential storage pool sources
    find-storage-pool-sources-as find potential storage pool sources
    freecell        NUMA freier Speicher
    hostname        Hypervisor-Hostname ausgeben
    list            Domains auflisten
    migrate         Domain auf anderen Host migrieren
    migrate-setmaxdowntime set maximum tolerable downtime
    net-autostart   Ein Netzwerk automatisch starten
    net-create      Netzwerk aus einer XML-Datei erstellen
    net-define      Definiere (aber starte kein) Netzwerk aus einer XML-Datei
    net-destroy     Netzwerk löschen
    net-dumpxml     Netzwerk-Informationen in XML
    net-edit        edit XML configuration for a network
    net-list        Netzwerke auflisten
    net-name        Eine Netzwerk-UUID in einen Netzwerk-Namen konvertieren
    net-start       Ein (zuvor definiertes) inaktives Netzwerk starten
    net-undefine    Ein inaktives Netzwerk undefinieren
    net-uuid        Einen Netzwerk-Namen in eine Netzwerk-UUID konvertieren
    iface-list      list physical host interfaces
    iface-name      convert an interface MAC address to interface name
    iface-mac       convert an interface name to interface MAC address
    iface-dumpxml   interface information in XML
    iface-define    define (but don't start) a physical host interface from an XML file
    iface-undefine  undefine a physical host interface (remove it from configuration)
    iface-edit      edit XML configuration for a physical host interface
    iface-start     start a physical host interface (enable it / "if-up")
    iface-destroy   destroy a physical host interface (disable it / "if-down")
    managedsave     managed save of a domain state
    nodeinfo        Knoteninformation
    nodedev-list    enumerate devices on this host
    nodedev-dumpxml node device details in XML
    nodedev-dettach dettach node device from its device driver
    nodedev-reattach reattach node device to its device driver
    nodedev-reset   reset node device
    nodedev-create  create a device defined by an XML file on the node
    nodedev-destroy destroy a device on the node
    nwfilter-define define or update a network filter from an XML file
    nwfilter-undefine undefine a network filter
    nwfilter-dumpxml network filter information in XML
    nwfilter-list   list network filters
    nwfilter-edit   edit XML configuration for a network filter
    pool-autostart  autostart a pool
    pool-build      baue einen Pool
    pool-create     create a pool from an XML file
    pool-create-as  create a pool from a set of args
    pool-define     define (but don't start) a pool from an XML file
    pool-define-as  define a pool from a set of args
    pool-destroy    Zerstören eines Pools
    pool-delete     Pool löschen
    pool-dumpxml    Pool-Informationen in XML
    pool-edit       edit XML configuration for a storage pool
    pool-info       storage pool information
    pool-list       Poolliste
    pool-name       Konvertieren einer pool-UUID in einen Pool-Namen
    pool-refresh    Einen Pool aktualisieren
    pool-start      start a (previously defined) inactive pool
    pool-undefine   undefine an inactive pool
    pool-uuid       convert a pool name to pool UUID
    secret-define   define or modify a secret from an XML file
    secret-dumpxml  secret attributes in XML
    secret-set-value set a secret value
    secret-get-value Output a secret value
    secret-undefine undefine a secret
    secret-list     list secrets
    pwd             print the current directory
    quit            Dieses interaktive Terminal beenden
    exit            Dieses interaktive Terminal beenden
    reboot          Domain neu starten
    restore         Eine Domain aus einem gespeicherten Status in einer Datei wiederherstellen
    resume          Domain fortsetzen
    save            Einen Domainstatus in einer Datei speichern
    schedinfo       Scheduler-Parameter anzeigen/setzen
    dump            Den Kern einer Domain zu Analysezwecken in eine Datei dumpen
    shutdown        Kontrolliertes Stillegen einer Domain
    setmem          Speicherzuweisung ändern
    setmaxmem       Maximale Speichergrenze ändern
    setvcpus        Anzahl der virtuellen CPUs ändern
    suspend         Eine Domain anhalten
    ttyconsole      TTY-Konsole
    undefine        Eine inaktive Domain undefinieren
    update-device   update device from an XML file
    uri             Kanonisierte URI des Hypervisors ausgeben
    vol-create      create a vol from an XML file
    vol-create-from create a vol, using another volume as input
    vol-create-as   create a volume from a set of args
    vol-clone       clone a volume.
    vol-delete      Löschen eines Datenträgers
    vol-wipe        wipe a vol
    vol-dumpxml     vol information in XML
    vol-info        storage vol information
    vol-list        list vols
    vol-pool        returns the storage pool for a given volume key or path
    vol-path        returns the volume path for a given volume name or key
    vol-name        returns the volume name for a given volume key or path
    vol-key         returns the volume key for a given volume name or path
    vcpuinfo        Domain vcpu-Information
    vcpupin         Domain vcpu-Affinität kontrollieren
    version         Version anzeigen
    vncdisplay      VNC-Anzeige
    snapshot-create Create a snapshot
    snapshot-current Get the current snapshot
    snapshot-delete Delete a domain snapshot
    snapshot-dumpxml Dump XML for a domain snapshot
    snapshot-list   List snapshots for a domain
    snapshot-revert Revert a domain to a snapshot

Hilfe zu einem virsh Befehl abfragen

Benötigt man Hilfe oder ergänzende Hinweise zu einer Befehlsoption, so kann man einfach mit der Option help und dem betreffenden Befehl virsh aufrufen.

 # virsh help domifstat
  NAME
    domifstat - Statistiken der Netzwerkschnittstelle für eine Domain abrufen

  SYNOPSIS
    domifstat <domain> <interface>

  BESCHREIBUNG
    Statistiken der Netzwerkschnittstelle für eine laufende Domain abrufen.

  OPTIONEN
    [--domain] <string>  Domainname, ID oder UUID
    [--interface] <string>  Schnittstellengerät

Generieren einer virtuelle Maschine mit virt-install

vHOST anlegen mit virt-install

Im folgenden Beispiel wollen wir einen vHOST neu anlegen und dazu den Befehl virt-install verwenden. Unser Beispielhost soll hierbei folgende Eigenschaften haben:

Daraus ergibt sich folgender Befehl (zur besseren Lesbarkeit hier umgebrochen):

 # virt-install -n vml000200 \ 
                --description "Arch-Linux Test VM" \
                --os-type=Linux \
                --os-variant=generic \ 
                --ram=8192 \
                --vcpus=4 \
                --disk path=/var/lib/libvirt/images/vml000200.img,bus=virtio,size=30 \
                --cdrom /var/lib/libvirt/boot/archlinux-2022.12.17-x86_64.iso \
                --network bridge:br-dmz \ 
                && virt-viewer --connect qemu:///system vml000200
 # virt-install -n vml000200 --description "Arch-Linux Test VM" --os-type=Linux --os-variant=generic --ram=8192 --vcpus=4 --disk path=/var/lib/libvirt/images/vml000200.img,bus=virtio,size=30 --cdrom /var/lib/libvirt/boot/archlinux-2022.12.17-x86_64.iso --network bridge:br-dmz && virt-viewer --connect qemu:///system vml000200

Bild: Arch Linux Boot Screen

Shutdownoptimierung

Wird das Wirt-System heruntergefahren oder der libvirt-Daemon beendet, steht man in aller Regel vor einem Dilemma. Denn wie bei einem realen System, kann man nicht einfach den Powerknopf drücken. So versetzt der libvirt-Daemon in der Regel seine Gast-Systeme in den Suspend-Mode. Kritische Systemdienste, wie z.B. NTPD verweigern nach dem Aufwecken unter Umständen den weiteren Betrieb, so dass es unter Umständen wünschenswerter ist, den Gast erst herunterzufahren und dann den libvirt-Daemon zu beenden.

Zur Lösung dieser Herausforderung sind mehrere Änderungen, je nach erfolgter Konfiguration der Gastsysteme, notwendig. So wird z.B. bei einer Minimalinstallation kein acpid-Daemon installiert, den wir hierzu benötigen.

acpid-Daemon

Wie gerade beleuchtet, muss auf dem Gast.System der libvirt-daemon installiert sein und auch laufen, damit der libvirt-Daemon den Gast über definierte Signale auszuschalten ohne dass sich dieser via ssh mit dem vHOST verbinden muss.

Als erstes prüfen wir ob das benötigte RPM-Paket acpid installiert wurde.

 # rpm -q acpid

Wurde das Paket installiert erhalten wir als Antwort:

 acpid-1.0.10-2.1.el6.x86_64

Fehlt das Paket wird uns dies entsprechend angezeigt:

 package acpid is not installed

Ob der acpid-Daemon läuft kontrollieren ganz einfach mit folgendem Aufruf:

 # chkconfig --list | grep acpid
 acpid          	0:off	1:off	2:on	3:on	4:on	5:on	6:off

Fehlt das Paket acpid, so installieren wir dieses erst via yum.

 # yum install acpid -y

Bei Bedarf können wir uns genau ansehen, was dieses Paket mit ins System bringt. Wir benutzen hierzu einfach die Option qil beim Befehl yum.

 # rpm -qil acpid
Name        : acpid                        Relocations: (not relocatable)
Version     : 1.0.10                            Vendor: CentOS
Release     : 2.1.el6                       Build Date: Wed 18 Aug 2010 10:39:10 PM CEST
Install Date: Wed 26 Oct 2011 05:24:19 PM CEST      Build Host: c6b3.bsys.dev.centos.org
Group       : System Environment/Daemons    Source RPM: acpid-1.0.10-2.1.el6.src.rpm
Size        : 74381                            License: GPLv2+
Signature   : RSA/8, Sun 03 Jul 2011 06:01:31 AM CEST, Key ID 0946fca2c105b9de
Packager    : CentOS BuildSystem <http://bugs.centos.org>
URL         : http://acpid.sourceforge.net/
Summary     : ACPI Event Daemon
Description :
acpid is a daemon that dispatches ACPI events to user-space programs.
/etc/acpi
/etc/acpi/actions
/etc/acpi/actions/power.sh
/etc/acpi/events
/etc/acpi/events/power.conf
/etc/acpi/events/video.conf
/etc/rc.d/init.d/acpid
/usr/bin/acpi_listen
/usr/sbin/acpid
/usr/share/doc/acpid-1.0.10
/usr/share/doc/acpid-1.0.10/COPYING
/usr/share/doc/acpid-1.0.10/Changelog
/usr/share/doc/acpid-1.0.10/README
/usr/share/doc/acpid-1.0.10/TODO
/usr/share/man/man8/acpi_listen.8.gz
/usr/share/man/man8/acpid.8.gz

Damit der Systemdienst auch beim Neustart des vHOSTs mitgestartet wird, sorgen wir nun dafür, dass dieser auch automatisch gestartet wird.

 # chkconfig acpid on

Ob die Konfigurationsänderung auch gegriffen hat, kann man dies bei Bedarf entsprechend abfragen.

 # chkconfig --list | grep acpid
 acpid          	0:off	1:off	2:on	3:on	4:on	5:on	6:off

Wurde der Systemdienst erst installiert, ist dieser ggf. erst einmal händisch zu starten. Wir überprüfen also erst einmal ob der Dienst gerade läuft.

 # service acpid status
 acpid is stopped

Da der Dienst nicht läuft, werden wir diesen erst einmal per Hand starten.

 # service acpid start
 Starting acpi daemon:                                      [  OK  ]

libvirt-guests

Der entscheidende Eingriff zum Herunterfahren der vHOSTs erfolgt über das Startsript libvirt-guests bzw. über dessen Konfigurationsdatei /etc/sysconfig/libvirt-guests. Standardmäßige versetzet der Wirt seine Gäste mit Hilfe dieses Scriptes in den suspend-Modus, so unter anderem beim Herunterfahren des Wirt-Systems.

Möchte man nun an statt des Suspend-Modus einen Shutdown der vHOSTs initiieren lassen sind ein paar Änderungen an der Konfigurationsdatei für das Startup-/Shutdownscript notwendig.

Hierzu benutzen wir, wie so oft den Editor unserer Wahl.

 # vim /etc/sysconfig/libvirt-guests
/etc/sysconfig/libvirt-guests
# URIs to check for running guests
# example: URIS='default xen:/// vbox+tcp://host/system lxc:///'
#URIS=default
# Django  : 2012-03-30
# default : unset
URIS=default
 
# action taken on host boot
# - start   all guests which were running on shutdown are started on boot
#           regardless on their autostart settings
# - ignore  libvirt-guests init script won't start any guest on boot, however,
#           guests marked as autostart will still be automatically started by
#           libvirtd
#ON_BOOT=start
# Django  : 2012-03-30
# default : unset
ON_BOOT=start
 
# number of seconds to wait between each guest start
#START_DELAY=0
 
# action taken on host shutdown
# - suspend   all running guests are suspended using virsh managedsave
# - shutdown  all running guests are asked to shutdown. Please be careful with
#             this settings since there is no way to distinguish between a
#             guest which is stuck or ignores shutdown requests and a guest
#             which just needs a long time to shutdown. When setting
#             ON_SHUTDOWN=shutdown, you must also set SHUTDOWN_TIMEOUT to a
#             value suitable for your guests.
#ON_SHUTDOWN=suspend
# Django  : 2012-03-30
# default : unset
ON_SHUTDOWN=shutdown
 
# number of seconds we're willing to wait for a guest to shut down
#SHUTDOWN_TIMEOUT=0
# Django  : 2012-03-30
# default : unset
SHUTDOWN_TIMEOUT=75
 
# If non-zero, try to bypass the file system cache when saving and
# restoring guests, even though this may give slower operation for
# some file systems.
#BYPASS_CACHE=0

Die entscheidenden Änderungen betreffen dabei nun die folgenden beiden Konfigurationsparameter:

Wir haben also festgelegt, dass die vHOSTs nicht mehr in den Suspend-Mode versetzt, sondern ausgeschaltet werden. Dabei wird maximal 75 Sekunden gewartet, bis jeder einzelnen Gast heruntergefahren wurde. Der Zeitwert ist ggf, den eigenen Bedürfnissen anzupassen und ist nur ein Richtwert.

manueller Test

Im folgenden Beispiel fahren wir nun alle vHOSTs nacheinander runter, genauso wie dies bei einem Shutdown des Wirtsystemes erfolgen würde. Zu erst ermitteln wir noch die Anzahl aller laufenden vHOSTs. Hierzu benutzen wir den Befehl virsh mit der Option list.

 # virsh list
 Id Name                 Status
----------------------------------
 13 vml000010            laufend
 14 vml000020            laufend
 17 vml000030            laufend

Den eigentlichen Shutdown der vHOSTs initiieren wir mit folgenden Aufruf:

 # service libvirt-guests shutdown
Running guests on default URI: vml100010, vml100020, vml100030
Shutting down guests on default URI...
Shutting down vml100010: done
Shutting down vml100020: done         
Shutting down vml100030: done

Eine Überprüfung, ob alle Gast-Systeme tatsächlich heruntergefahren wurden, kann mit nachfolgendem Befehl erfolgen:

 # virsh list
  Id Name                 State
 ----------------------------------

Wir können natürlich auch die vHOSTs gesammelt hochfahren, genauso wie dies beim starten des Wirtsystemes erfolgen würde.

 # service libvirt-guests start
Resuming guests on default URI...
Resuming guest vml000010: done
Resuming guest vml000020: done
Resuming guest vml000030: done

Links

1)
Simple Protocol for Independent Computing Environments