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.
Virsh - Kommandozeilenwerkzeug zur Verwaltung virtueller Maschinen
| Virsh-Parameter | 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> | Schaltet die VM einfach aus |
| suspend <VM-Bezeichnung> | Pausiert die virtuelle Maschine / Ruhemodus |
| resume <VM-Bezeichnung> | Die VM wird fortgesetzt / aufwecken aus dem Ruhemodus |
| 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 anpassen |
| setvcpus <VM-Bezeichnung> <Anzahl-CPUs> | Anzahl die CPUs anpassen |
| migrate <VM-Bezeichnung> <URI> | Eine Migration der VM zum Host mit dessen angegebener URI wird durchgeführt |
| Verbindungsmöglichkeiten mit Virsh | |
|---|---|
| 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 |
| Verbindung per Virsh | |
|---|---|
| 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 |
virt-install \ --name centos7 \ --ram 1024 \ --disk path=./centos7.qcow2,size=8 \ --vcpus 1 \ --os-type linux \ --os-variant centos7 \ --network bridge=virbr0 \ --graphics none \ --console pty,target_type=serial \ --location 'http://mirror.i3d.net/pub/centos/7/os/x86_64/' \ --extra-args 'console=ttyS0,115200n8 serial'
> wget http://ftp.freebsd.org/pub/FreeBSD/releases/ISO-IMAGES/10.1/FreeBSD-10.1-RELEASE-amd64-dvd1.iso
virt-install \ --name freebsd10 \ --ram 1024 \ --disk path=./freebsd10.qcow2,size=8 \ --vcpus 1 \ --os-type generic \ --os-variant generic \ --network bridge=virbr0 \ --graphics vnc,port=5999 \ --console pty,target_type=serial \ --cdrom ./FreeBSD-10.1-RELEASE-amd64-dvd1.iso
> apt install bridge-utils virtinst libvirt-clients qemu-kvm libvirt-bin virt-manager
Jetzt muss sich der entsprechende (unprivilegierte) Benutzer neu anmelden, damit die Aufnahme in die Gruppe libvirt wirksam wird.
> virt-install -n web_devel -r 256 --disk path=/var/lib/libvirt/images/web_devel.img,bus=virtio,size=4 -c ubuntu-14.04-server-i386.iso --network network=default,model=virtio --graphics vnc,listen=0.0.0.0 --noautoconsole -v
Das Paket virt-manager enthält ein grafisches Werkzeug, um lokale und entfernte virtuelle Maschinen zu verwalten. Geben Sie folgendes ein, um virt-manager zu installieren:
> aptitude install virt-manager
Da virt-manager eine grafische Benutzeroberfläche erfordert, sollte es auf einer Workstation oder einer Testmaschine anstatt eines Servers installiert werden. Um sich mit dem lokalen libvirt-Dienst zu verbinden, geben Sie folgendes ein:
> virt-manager > virt-manager -c qemu:///system
Es sollten diese Einstellungen vorgenommen werden:
Sie können sich mit folgender Befehlszeileneingabe mit dem auf einem anderen Host laufenden libvirt-Dienst verbinden (hier muss der passwortlose SSH-Login möglich sein, siehe: SSH-Schlüssel austauschen für ein passwortlosen Login):
> virt-manager -c qemu+ssh://virtnode1.mydomain.com/system
> vi /etc/libvirt/qemu/networks/br-ext.xml
> virsh net-list Name State Autostart Persistent ---------------------------------------------------------- br-ext active yes yes
> virsh net-list --all Name State Autostart Persistent ---------------------------------------------------------- br-ext active yes yes default inactive no yes
Es gibt mehrere Möglichkeiten, später die virtuelle Maschine mit ein realen Netzwerk / Internet zu verbinden. Per Voreinstellung setzt VMM ein virtuelles Netzwerk im Adressraum 192.168.122.0/24 ein, dass per NAT mit der realen Netzwerkkarte verbunden ist. Mit dieser Konfiguration kann jede virtuelle Maschine ins Internet, es sind keine weiteren Schritte notwendig.
Grundsätzlich besteht auch die Möglichkeit, dass die virtuelle Maschine sich per Bridge direkt in das reale Netzwerk einklinkt. Dazu muss aber zuerst die Bridge eingerichtet werden, was etwas Handarbeit erfordert. Ein entsprechende Anleitung findet man im Englischen Wiki KvmWithBridge oder auch im libvirt-Wiki.
VM stoppen:
root@vmhost01:# virsh shutdown vmgast01
nach dem stoppen muss die VM erst wieder "definiert" werden:
root@vmhost01:# virsh define /etc/libvirt/qemu/vmgast01.xml Domain vmgast01 defined from /etc/libvirt/qemu/vmgast01.xml
…jetzt steht sie wieder in der Liste drin:
root@vmhost01:# virsh list --all Id Name State ---------------------------------------------------- 25 vmtest01 running - vmgast01 shut off
…dann kann man die VM wieder starten:
root@vmhost01:# virsh start vmgast01 Domain vmgast01 started root@vmhost01:# virsh list --all Id Name State ---------------------------------------------------- 25 vmtest01 running 27 vmgast01 running
in der VM alles entfernen, was individuel ist; die SSH-Host-Keys werden nur bei der SSH-Installation angelegt und SSH wird durch "cloud-init" per Standard wieder installiert:
root@vmgast01:# userdel -r ubuntu root@vmgast01:# apt -y purge openssh-server root@vmgast01:# exit
VM anhalten
root@vmhost01:# virsh stop vmgast01
Reset, unconfigure or customize
root@vmhost01:# virt-sysprep -d vmgast01
Reset, unconfigure or customize von einer Auswahl, nicht alle
root@vmhost01:# virt-sysprep --enable $(virt-sysprep --list-operations | awk '{print $1}' | egrep -v 'fs-uuids|lvm-uuids|user-account' | tr -s '\n' ',' | sed 's/[,]$//') -d vmgast01
> virt-install --virt-type kvm --name linux --ram 2048 --cdrom=ubuntu-18.04.1-server-amd64.iso --disk /tmp/linux.qcow2,format=qcow2 --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole --os-type=linux --os-variant=ubuntu17.10 Installation wird gestartet … ERROR internal error: process exited while connecting to monitor: 2018-10-31T15:45:33.829160Z qemu-system-x86_64: -drive file=/tmp/linux.qcow2,format=qcow2,if=none,id=drive-virtio-disk0: Could not open '/tmp/linux.qcow2': Permission denied Installation der Domäne scheint nicht erfolgreich gewesen zu sein..
Lösung:
> virt-install --virt-type kvm --name linux --ram 2048 --cdrom=ubuntu-18.04.1-server-amd64.iso --disk /var/lib/libvirt/images/linux.qcow2,format=qcow2 --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole --os-type=linux --os-variant=ubuntu17.10
Das HDD-Image muss im richtigen Pfad liegen, sonst verhindert AppArmor den Zugriff.
Start-Skript:
#!/bin/bash OS_VAR="ubuntu17.10" NAME="bionic" RAM="2048" IMG="/var/lib/libvirt/images/${NAME}.qcow2" ISO="/var/tmp/ISO/ubuntu-18.04.1-server-amd64.iso" rm -f ${IMG} qemu-img create -f qcow2 ${IMG} 10G chmod 0664 ${IMG} virt-install --virt-type kvm --name ${NAME} --ram ${RAM} --cdrom=${ISO} --disk ${IMG},format=qcow2 --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole --os-type=linux --os-variant=${OS_VAR} ls -lha ${IMG}