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.
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
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.
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.
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.
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.
Im folgendem Fenster werden wir gebeten, den Namen und den Speicherort anzugeben.
Nach dem Anwählen der Schaltfläche [Klonen] wird eine Kopie unseres vHOST angefertigt.
Zum Schluß finden wir im Virtual Machine Managers auch unseren zweiten vHOST.
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]
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/.
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:
- <graphics type='vnc' port='-1' autoport='yes'/>
- <model type='cirrus' vram='9216' heads='1'/>
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:
- <graphics type='spice' port='5930' autoport='no' listen='0.0.0.0' passwd='nerdbert-ist-doof!'/>
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:
- <model type='qxl' vram='32768' heads='1'/>
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:
- -h Hostname oder IP-Adresse des Wirt-Systems
- -p gewählter Port, den wir bei der Serverkonfiguration gewählt hatten
- -w Passwort für den Zufgriff auf die virtuelle Maschine.
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.
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:
- Name der VM:
vml000200
- Beschreibung:
Arch-Linux Test VM
- RAM:
8 GB
- CPU:
4
- Disk:
30G
- Boot-Image:
archlinux-2022.12.17-x86_64.iso
- Netzwerk:
br-dmz
- Bei der Installation soll der
virt-viewer
automatisch gestartet werden.
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
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:
- ON_SHUTDOWN=shutdown
- SHUTDOWN_TIMEOUT=75
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