Na prácí poměrně často používám jak virtualizaci, tak i různé typy kontejnerizace od LXC (LXD) přes MOCK, až po podman a docker. Plnotučná virtualizaci s KVM+QEMU+libvirt má spoustu výhod, ale už párkrát mně docela potrápila. Než jsem pochopil, jak nastavit bootvání s EFI a jak ušetřit nějaké to místo na disku, tak mi to dalo pěkně zabrat.
Základní postup pro vytvoření virtuálky je jednoduchý a uživatelsky přívětivý. Ve Fedoře se to nainstaluje příslušná skupina balíčků, a pak už se jednoduše naklikají nové nebo upraví už existující virtuální mašiny.
dnf install @virtualization
virt-manager
Pokud chcete mít virtuálky s podporou (U)EFI, tak musíte doinstalovat ještě balíček edk2-ovmf
(a možná ještě přidat adresář s firmware, aby byl vidět). Škaredý trik v celém postupu je, že EFI boot nelze nastavit na existující virtuálku, ale musí se nastavit už jejím při vytváření (zašktrnout Customize configuration before install):
A pokud je OVMF firmware dobře nainstalovaný, tak se dá místo položky BIOS zvolit UEFI. V případě nejasností se celkem dá dohledat v dokumentaci.
Další věc, která mně potrápila je Thin Provisioning. Je způsob práce s uložištěm, kdy to zabírá jenom tolik místa kolik je opravdu potřeba. Naopak thick provisioning znamená, že je všechno místo vyhrazené najednou a vyhneme se režii navíc při jeho uvolňování a případné další fragmentaci dat na disku.
Pro virtuálku mám například alokované 30GB místa, ale nainstalovaný systém zabíra jenom 6.6 GB místa. Je škoda nevyužité 23.4 GB nechat jenom tak.
Jako výchozí se používá formát QCOW2, který thin provisinioning umí. První krok je ověřit kolik místa data skutečně zabírají. Podle ls -l
je to těch 30GB.
[root@jmlich-dell ~]# ls -l /var/lib/libvirt/images/
-rw-r--r--. 1 qemu qemu 32518635520 Apr 23 10:39 centos7.qcow2
-rw-------. 1 qemu qemu 32217432064 Apr 23 13:19 manjaro.qcow2
Podle du
je to ale jenom 6.6GB.
[root@jmlich-dell ~]# du -h /var/lib/libvirt/images/*
6.6G /var/lib/libvirt/images/centos7.qcow2
11G /var/lib/libvirt/images/manjaro.qcow2
To je ale počateční stav, který se ale používáním virtuálky časem změní. Při běžné práci se prostě nějaké soubory vytvoří a jiné zase smažou. Aby se volné místo z virtuálky zase vrátilo operačnímu systému, tak musí dojít k discard, tedy zneplatnění bloku dat, případně k jeho přepsání nulami. Pak může dojít k uvolnění místa pomocí unmap .
Toto musíme provést uvnitř virtuálky. Můžeme to udělat jednou pomocí příkazu fstrim
, případně automaticky systemctl enable fstrim.timer
. Toto nastavení je ve Fedoře výchozí od verze 32.
[root@manjaro-virt ~]$ fstrim -va
/: 18,9 GiB (20243005440 bytes) trimmed on /dev/sda1
Trošku past je, ve výchozí VirtIO toto asi neumí, takže je potřeba přidat SCSI řadič a nastavit typ disku SCSI. Pak se dá nastavit kdy se uvolňuje místo na disku (a hlavně se to opravdu provede).
Změna typu disku z VirtIO nebo SATA na SCSI se dá naštěstí provést bez nutnosti vytvářet novou virtuálku. Může se stát, že operační systém bude mít vypnutý “driver” SCSI řadiče, aby se urychlil start systému. Proč taky zavádět v initramfs modul něčeho co se nepouzívá? V takovém případě se nejdřív přidá řadič disku, pak se přegeneruje initramfs, a nakonec se přepne disk na SCSI.