Tips en Trucs 2021

KVM/QEmu virtuele computers

Naast de door VMware en Oracle ontwikkelde virtuele machine software is er een minder bekende, maar zeer goede en volledig open source virtuele machine beschikbaar, namelijk KVM/QEmu. Dit duo werkt enkel onder Linux maar heeft wel het voordeel dat het onderdeel uitmaakt van de Linux kernel (Kernel Virtual Machine) waardoor het snel en efficiënt werkt. Je hebt dus enkel bijhorende software nodig om KVM virtuele machine's te beheren. En vanzelfsprekend een processor waarvan de virtuele functies geactiveerd zijn (zie Linux distributies testen met VirtualBox).

KVM installeren

De KVM virtuele computer software heeft verschrikkelijk veel software pakketten nodig om alle hardware van je computer voor een virtuele computer te gebruiken. Daarenboven moeten alle onderdelen zoals virtuele stuurprogramma's en hardware, BIOS/UEFI, enz. eveneens beschikbaar zijn. De vele software pakketten voor KVM heeft openSUSE gebundeld in twee patronen die je met de volgende opdracht installeert:

dany@pindabook:~> sudo zypper install -t pattern kvm_server kvm_tools
[sudo] wachtwoord voor root:
Gegevens van opslagruimte laden...
Lezen van geïnstalleerde pakketten...
Pakketafhankelijkheden oplossen...

De volgende 193 NIEUWE pakketten zullen worden geïnstalleerd:
  btrfsmaintenance btrfsprogs btrfsprogs-udev-rules db48-utils gnutls grub2-snapper-plugin gtksourceview4-lang gtksourceview-lang
  gtk-vnc-lang guestfs-data guestfs-tools guestfs-winsupport jfsutils jq kdump kvm_stat ldmtool libappindicator3-1 libbtrfs0
  libcacard0 libconfig11 libdbusmenu-glib4 libdbusmenu-gtk3-4 libefa1 libfdt1 libgtksourceview-3_0-1 libgtksourceview-4-0
  libgtk-vnc-2_0-0 libguestfs0 libgvnc-1_0-0 libhivex0 libibverbs libibverbs1 libindicator3-7 libiscsi8 libjq1 libldm-1_0-0
  liblttng-ust0 liblvm2cmd2_03 libmlx4-1 libmlx5-1 libndctl6 libnetcontrol0 libopeniscsiusr0_2_0 libopts25 libosinfo libosinfo-1_0-0
  libosinfo-lang libphodav-2_0-0 libpmem1 librados2 librbd1 librdmacm1 libreiserfscore0 libslirp0 libsnapper5
  libspice-client-glib-2_0-8 libspice-client-glib-helper libspice-client-gtk-3_0-5 libspice-server1 libtpms0 libusbredirhost1
  libusbredirparser1 libvdeplug3 libvirglrenderer0 libvirt-bash-completion libvirt-client libvirt-daemon
  libvirt-daemon-config-network libvirt-daemon-driver-interface libvirt-daemon-driver-network libvirt-daemon-driver-nodedev
  libvirt-daemon-driver-nwfilter libvirt-daemon-driver-qemu libvirt-daemon-driver-secret libvirt-daemon-driver-storage
  libvirt-daemon-driver-storage-core libvirt-daemon-driver-storage-disk libvirt-daemon-driver-storage-iscsi
  libvirt-daemon-driver-storage-iscsi-direct libvirt-daemon-driver-storage-logical libvirt-daemon-driver-storage-mpath
  libvirt-daemon-driver-storage-rbd libvirt-daemon-driver-storage-scsi libvirt-daemon-qemu libvirt-glib-1_0-0 libvirt-libs
  libvte-2_91-0 lvm2 lzop makedumpfile mdevctl nfs-kernel-server numad open-iscsi osinfo-db ovmf patterns-server-kvm_server
  patterns-server-kvm_tools perl-Class-Inspector perl-File-ShareDir perl-libintl-perl perl-String-ShellQuote perl-Sys-Guestfs
  perl-Win-Hivex pmdk python3-asn1crypto python3-brotlipy python3-cairo python3-certifi python3-cffi python3-chardet
  python3-cryptography python3-evtx python3-gobject-cairo python3-gobject-Gdk python3-idna python3-ipaddr python3-libvirt-python
  python3-libxml2-python python3-netifaces python3-py python3-pyasn1 python3-pycparser python3-pyOpenSSL python3-PySocks
  python3-requests python3-urllib3 qemu qemu-audio-spice qemu-block-curl qemu-block-rbd qemu-block-ssh qemu-chardev-spice
  qemu-hw-display-qxl qemu-hw-display-virtio-gpu qemu-hw-display-virtio-gpu-pci qemu-hw-display-virtio-vga qemu-hw-usb-redirect
  qemu-hw-usb-smartcard qemu-ipxe qemu-ksm qemu-microvm qemu-ovmf-x86_64 qemu-seabios qemu-sgabios qemu-tools qemu-ui-curses
  qemu-ui-gtk qemu-ui-opengl qemu-ui-spice-app qemu-ui-spice-core qemu-vgabios qemu-x86 radvd rdma-core reiserfs snapper
  snapper-zypp-plugin supermin swtpm systemd-container system-group-libvirt system-user-qemu system-user-tss tftp trousers
  typelib-1_0-AppIndicator3-0_1 typelib-1_0-Atk-1_0 typelib-1_0-GdkPixbuf-2_0 typelib-1_0-Gst-1_0 typelib-1_0-Gtk-3_0
  typelib-1_0-GtkSource-4 typelib-1_0-GtkVnc-2_0 typelib-1_0-GVnc-1_0 typelib-1_0-Libosinfo-1_0 typelib-1_0-LibvirtGLib-1_0
  typelib-1_0-Pango-1_0 typelib-1_0-SpiceClientGlib-2_0 typelib-1_0-SpiceClientGtk-3_0 typelib-1_0-Vte-2.91 virt-install virt-manager
  virt-manager-common virt-v2v virt-viewer vm-install vte-lang xinetd xmlstarlet yast2-kdump yast2-snapper zerofree

De volgende 2 NIEUWE patronen zullen worden geïnstalleerd:
  kvm_server kvm_tools

De volgende 38 aanbevolen pakketten zijn automatisch geselecteerd:
  btrfsmaintenance btrfsprogs guestfs-winsupport jfsutils kvm_stat ldmtool libosinfo-lang libvirt-bash-completion libvirt-daemon-qemu
  ovmf perl-File-ShareDir python3-brotlipy python3-cryptography python3-idna python3-pyOpenSSL python3-PySocks qemu-block-curl
  qemu-hw-display-qxl qemu-hw-display-virtio-gpu qemu-hw-display-virtio-gpu-pci qemu-hw-display-virtio-vga qemu-hw-usb-redirect
  qemu-hw-usb-smartcard qemu-ksm qemu-microvm qemu-ovmf-x86_64 qemu-tools qemu-ui-curses qemu-ui-gtk qemu-ui-spice-app qemu-x86
  reiserfs virt-install virt-v2v virt-viewer vm-install xinetd zerofree

Het volgende pakket vereist dat het systeem opnieuw wordt opgestart:
  gnutls

193 nieuwe te installeren pakketten.
Totale downloadgrootte: 67,2 MiB. Reeds in de cache: 0 B. Na de bewerking zal aanvullend 268,2 MiB worden gebruikt.

    Opmerking: Systeemherstart vereist.
Doorgaan? [j/n/v/...? alle opties tonen] (j): 
pakket btrfsprogs-udev-rules-4.19.1-16.1.noarch wordt opgehaald                              (1/193),  49,6 KiB (  387   B uitgepakt)
Ophalen: btrfsprogs-udev-rules-4.19.1-16.1.noarch.rpm .......................................................................[gereed]
...
pakket patterns-server-kvm_tools-20180302-lp153.1.14.x86_64 wordt opgehaald                (193/193),   9,8 KiB (   55   B uitgepakt)
Ophalen: patterns-server-kvm_tools-20180302-lp153.1.14.x86_64.rpm ...........................................................[gereed]

Controleren op conflicten tussen bestanden: .................................................................................[gereed]
(  1/193) Installeren van: btrfsprogs-udev-rules-4.19.1-16.1.noarch .........................................................[gereed]
...
(193/193) Installeren van: patterns-server-kvm_tools-20180302-lp153.1.14.x86_64 .............................................[gereed]
%posttrans script 'lvm2-2.03.05-8.30.1.x86_64.rpm' wordt uitgevoerd --------------------------------------------------------------[/]
Output of lvm2-2.03.05-8.30.1.x86_64.rpm %posttrans script:
    Creating initrd: /boot/initrd-5.3.18-57-default                                                                                  
    dracut: Executing: /usr/bin/dracut --logfile /var/log/YaST2/mkinitrd.log --force /boot/initrd-5.3.18-57-default 5.3.18-57-default
...
    dracut: *** Creating initramfs image file '/boot/initrd-5.3.18-59.5-default' done ***

%posttrans scripts zijn uitgevoerd ..........................................................................................[gereed]

De Virtuele machine beheerder software gebruikt libvirt, deze dienst kan je automatisch laten starten met de opdracht:

dany@pindabook:~> sudo systemctl --now enable libvirtd.service 
Created symlink /etc/systemd/system/multi-user.target.wants/libvirtd.service → /usr/lib/systemd/system/libvirtd.service.
Created symlink /etc/systemd/system/sockets.target.wants/virtlockd.socket → /usr/lib/systemd/system/virtlockd.socket.
Created symlink /etc/systemd/system/sockets.target.wants/virtlogd.socket → /usr/lib/systemd/system/virtlogd.socket.
Created symlink /etc/systemd/system/sockets.target.wants/libvirtd.socket → /usr/lib/systemd/system/libvirtd.socket.
Created symlink /etc/systemd/system/sockets.target.wants/libvirtd-ro.socket → /usr/lib/systemd/system/libvirtd-ro.socket.

Eventjes testen of de libvirt dienst gestart is:

dany@pindabook:~> sudo systemctl status libvirtd.service 
● libvirtd.service - Virtualization daemon
     Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; vendor preset: disabled)
     Active: inactive (dead) since Sat 2021-06-26 10:16:43 CEST; 2min 32s ago
TriggeredBy: ● libvirtd.socket
             ● libvirtd-ro.socket
             ● libvirtd-admin.socket
       Docs: man:libvirtd(8)
             https://libvirt.org
    Process: 7837 ExecStart=/usr/sbin/libvirtd $LIBVIRTD_ARGS (code=exited, status=0/SUCCESS)
   Main PID: 7837 (code=exited, status=0/SUCCESS)

jun 26 10:14:43 pindabook systemd[1]: Starting Virtualization daemon...
jun 26 10:14:43 pindabook libvirtd[7837]: libvirt version: 7.1.0
jun 26 10:14:43 pindabook libvirtd[7837]: hostname: pindabook
jun 26 10:14:43 pindabook libvirtd[7837]: Failed to initialize libnetcontrol.  Management of interface devices is disabled
jun 26 10:14:43 pindabook systemd[1]: Started Virtualization daemon.
jun 26 10:16:43 pindabook systemd[1]: libvirtd.service: Succeeded.

De opmerking i.v.m. libnetcontrol komt doordat de meeste distributies voor netwerkbeheer NetworkManager gebruiken (netwerkbeheer door gebruikers). Terwijl de libvirt liever gebruik maakt van Wicked (netwerkbeheer via systeeminstellingen).

Ik gebruik virtuele computers die rechtstreeks op het netwerk worden aangeslotenn wat mogelijk is door een brug te slaan tussen de viruele computer en het netwerk. Zo'n netwerkbrug (bridge) maak je met NetworkManager met de volgende opdrachten:

Nog even controleren of de KVM (Kernel Virtual Machine) functies van de kernel beschikbaar zijn:

dany@pindabook:~> lsmod | grep kvm
kvm_intel             270336  0
kvm                   786432  1 kvm_intel
irqbypass              20480  1 kvm

Je merkt dat ik hier met een Intel processor werk.

De Virtuele machine beheerder

De Virtuele machine beheerder is niet in de Programmastarter opgenomen, je kunt hem er echter wel mee opstarten. Open de Programmastarter of druk Alt+F2, typ in het zoekvak virt en start het programma Virtuele machine beheerder. Virtuele computers en hun managers hebben root rechten nodig, m.a.w. geef het root wachtwoord in.

In het venster van de Virtuele machine beheerder, staat de status van de beschikbare virtuele machine systemen. Indien er bij QEMU/KVM de opmerking - Not Connected staat is de libvirt dienst niet goed opgestart. Dit controleer je met:

dany@pindabook:~> sudo systemctl status libvirtd.service 
● libvirtd.service - Virtualization daemon
     Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; vendor preset: disabled)
     Active: inactive (dead) since Sat 2021-06-26 14:00:22 CEST; 2min 29s ago
TriggeredBy: ● libvirtd-admin.socket
             ● libvirtd.socket
             ● libvirtd-ro.socket
       Docs: man:libvirtd(8)
             https://libvirt.org
    Process: 3219 ExecStart=/usr/sbin/libvirtd $LIBVIRTD_ARGS (code=exited, status=0/SUCCESS)
   Main PID: 3219 (code=exited, status=0/SUCCESS)

jun 26 13:57:51 pindabook systemd[1]: Starting Virtualization daemon...
jun 26 13:57:51 pindabook libvirtd[3219]: libvirt version: 7.1.0
jun 26 13:57:51 pindabook libvirtd[3219]: hostname: pindabook
jun 26 13:57:51 pindabook libvirtd[3219]: Failed to initialize libnetcontrol.  Management of interface devices is disabled
jun 26 13:57:52 pindabook systemd[1]: Started Virtualization daemon.
jun 26 13:58:22 pindabook libvirtd[3219]: error from service: Tijd is verlopen
jun 26 13:58:22 pindabook libvirtd[3219]: End of file while reading data: Invoer-/uitvoerfout
jun 26 14:00:22 pindabook systemd[1]: libvirtd.service: Succeeded.

En los je meestal op met een herstart van de libvirt dienst:

dany@pindabook:~> sudo systemctl restart libvirtd.service

Maak als volgt een virtuele computer voor openSUSE Leap 15.3 aan:

Via de werkbalkknop Toon virtuele hardware details krijg je een overzicht van de virtuele hardware. Deze kan je ook aanpassen als de virtuele computer is afgesloten.

KVM hardware

Via de werkbalkknop Toon de grafische console bekijk je het scherm van de virtuele computer.

KVM grafische console

Nuttige functies en opdrachten

Back-up maken

Virtuele computers zijn zeer handig om zaken te testen, maar om telkens het besturingssysteem opnieuw te installeren is erover. Via het venster van de virtuele computer kan je via een werkbalkknop Snaphots beheren. Maar je kunt ook vertrouwen op vertrouwde opdrachten (zorg dan wel dat de virtuele computer en de Virtuele machine beheerder is afgesloten). De virtuele schijven worden opgeslagen in bestanden in de volgende map:

dany@pindabook:~> sudo ls -lh /var/lib/libvirt/images/
[sudo] wachtwoord voor root: 
totaal 6,9G
-rw------- 1 root root 33G 26 jun 15:13 opensuse15.3.qcow2

Let op de tegenstrijdigheid: de totale ingenomen schijfruimte van de map bedraagt 6,9 GB, terwijl het schijfbestand zelf 33 GB groot is. Zoals reeds hierboven vermeld, wordt de volledige schijfruimte pas gebruikt als het virtuele besturingssysteem de volledige schijfruimte nodig heeft. Deze virtuele schijf werd ingesteld op 32 GB, en de installatie van openSUSE Leap 15.3 heeft 6,9 GB daarvan gebruikt (zie Sparse files).

Met de volgende opdracht maak je een back-up van de volledige virtuele harde schijf:

dany@pindabook:~> sudo gzip -c /var/lib/libvirt/images/opensuse15.3.qcow2 > Documenten/Qemu/opensuse15.3.qcow2.gz
dany@pindabook:~> ls -lh Documenten/Qemu/
totaal 2,6G
-rw-r--r-- 1 dany users 2,6G 26 jun 15:24 opensuse15.3.qcow2.gz

Deze back-up zet je terug met de volgende opdracht:

dany@pindabook:~> zcat Documenten/Qemu/opensuse15.3.qcow2.gz | sudo tee /var/lib/libvirt/images/opensuse15.3.qcow2 > /dev/null
[sudo] wachtwoord voor root:

De configuratiebestanden staan in de volgende map:

dany@pindabook:~> sudo ls -hl /etc/libvirt/qemu/
[sudo] wachtwoord voor root: 
totaal 12K
drwx------ 3 root root 4,0K 26 jun 10:14 networks
-rw------- 1 root root 5,9K 26 jun 14:44 opensuse15.3.xml

De configuratie wordt in XML bestanden opgeslagen en kunnen dus met elke teksteditor aangepast worden. Het is echter veiliger en eenvoudiger van dit via de Virtuele machine beheerder te doen.

Virtuele schijven koppelen

Je kunt virtuele schijfbestanden koppelen (zoals iso-bestanden) om de inhoud ervan de beheren. De volgende opdracht koppelt de tweede partitie van een virtuele schijf (read only) aan de map /mnt:

dany@pindabook:~> sudo guestmount -a /var/lib/libvirt/images/opensuse15.3.qcow2 -m /dev/sda2 --ro /mnt

De inhoud van de virtuele schijf is nu beschikbaar in de /mnt map:

dany@pindabook:~> sudo ls -lh /mnt
totaal 0
drwxr-xr-x 1 root root 1,8K 26 jun 15:00 bin
drwxr-xr-x 1 root root  524 26 jun 15:01 boot
drwxr-xr-x 1 root root    0 26 jun 14:53 dev
drwxr-xr-x 1 root root 5,0K 26 jun 15:08 etc
drwxr-xr-x 1 root root    0 26 jun 14:53 home
drwxr-xr-x 1 root root   64 26 jun 15:00 lib
drwxr-xr-x 1 root root 3,1K 26 jun 15:00 lib64
drwxr-xr-x 1 root root    0  3 mrt 12:52 mnt
drwxr-xr-x 1 root root    0 26 jun 14:53 opt
drwxr-xr-x 1 root root    0 26 jun 14:53 proc
drwxr-xr-x 1 root root    0 26 jun 14:53 root
drwxr-xr-x 1 root root    0 26 jun 14:53 run
drwxr-xr-x 1 root root 3,1K 26 jun 15:02 sbin
drwxr-xr-x 1 root root    0  3 mrt 12:52 selinux
drwxr-xr-x 1 root root    0 26 jun 14:53 srv
drwxr-xr-x 1 root root    0 26 jun 14:53 sys
drwxr-xr-x 1 root root    0 26 jun 14:53 tmp
drwxr-xr-x 1 root root  110 26 jun 14:56 usr
drwxr-xr-x 1 root root    0 26 jun 14:53 var

Je koppelt de virtuele schijf terug af met de opdracht:

dany@pindabook:~> sudo guestunmount /mnt

Conclusie

KVM/QEmu werkt voelbaar sneller dan VMWare of VirtualBox. Daarenboven is het door zijn open source karakter veel flexibeler. Maar ook wel minder gebruiksvriendelijk. Maar eenmaal je weet hoe het werkt, wil je nooit meer iets anders gebruiken.