Mon pipeline GItlab de génération d’ISO Debian avec pressed s’est mis à échouer ce matin. Dans l’étape de test le pipeline lance un conteneur qui offre un démon libvirt et le client virsh afin de démarrer une installation de l’ISO dans une VM.
L’erreur était la suivante:
libvirt.libvirtError: unable to open '/sys/fs/cgroup/machine/qemu-1-buster-amd64.libvirt-qemu/': No such file or directory
La VM ne démarrait pas.
En comparant le test virt-host-validate
avec un pipeline qui avait réussi la semaine précédente, je constatais les différences suivantes:
pipelene KO:
root@a4766a18ce21:/# virt-host-validate
QEMU: Checking for hardware virtualization : PASS
QEMU: Checking if device /dev/kvm exists : PASS
QEMU: Checking if device /dev/kvm is accessible : PASS
QEMU: Checking if device /dev/vhost-net exists : PASS
QEMU: Checking if device /dev/net/tun exists : PASS
QEMU: Checking for cgroup 'cpu' controller support : PASS
QEMU: Checking for cgroup 'cpuacct' controller support : PASS
QEMU: Checking for cgroup 'cpuset' controller support : PASS
QEMU: Checking for cgroup 'memory' controller support : PASS
QEMU: Checking for cgroup 'devices' controller support : PASS
QEMU: Checking for cgroup 'blkio' controller support : PASS
QEMU: Checking for device assignment IOMMU support : WARN (No ACPI DMAR table found, IOMMU either disabled in BIOS or not supported by this hardware platform)
QEMU: Checking for secure guest support : WARN (Unknown if this platform has Secure Guest support)
LXC: Checking for Linux >= 2.6.26 : PASS
LXC: Checking for namespace ipc : PASS
LXC: Checking for namespace mnt : PASS
LXC: Checking for namespace pid : PASS
LXC: Checking for namespace uts : PASS
LXC: Checking for namespace net : PASS
LXC: Checking for namespace user : PASS
LXC: Checking for cgroup 'cpu' controller support : PASS
LXC: Checking for cgroup 'cpuacct' controller support : PASS
LXC: Checking for cgroup 'cpuset' controller support : PASS
LXC: Checking for cgroup 'memory' controller support : PASS
LXC: Checking for cgroup 'devices' controller support : PASS
LXC: Checking for cgroup 'freezer' controller support : FAIL (Enable 'freezer' in kernel Kconfig file or mount/enable cgroup controller in your system)
LXC: Checking for cgroup 'blkio' controller support : PASS
LXC: Checking if device /sys/fs/fuse/connections exists : PASS
Pipeline OK:
QEMU: Checking for hardware virtualization : PASS
QEMU: Checking if device /dev/kvm exists : PASS
QEMU: Checking if device /dev/kvm is accessible : PASS
QEMU: Checking if device /dev/vhost-net exists : PASS
QEMU: Checking if device /dev/net/tun exists : PASS
QEMU: Checking for cgroup 'cpu' controller support : PASS
QEMU: Checking for cgroup 'cpuacct' controller support : PASS
QEMU: Checking for cgroup 'cpuset' controller support : PASS
QEMU: Checking for cgroup 'memory' controller support : PASS
QEMU: Checking for cgroup 'devices' controller support : PASS
QEMU: Checking for cgroup 'blkio' controller support : PASS
QEMU: Checking for device assignment IOMMU support : WARN (No ACPI DMAR table found, IOMMU either disabled in BIOS or not supported by this hardware platform)
QEMU: Checking for secure guest support : WARN (Unknown if this platform has Secure Guest support)
LXC: Checking for Linux >= 2.6.26 : PASS
LXC: Checking for namespace ipc : PASS
LXC: Checking for namespace mnt : PASS
LXC: Checking for namespace pid : PASS
LXC: Checking for namespace uts : PASS
LXC: Checking for namespace net : PASS
LXC: Checking for namespace user : PASS
LXC: Checking for cgroup 'cpu' controller support : PASS
LXC: Checking for cgroup 'cpuacct' controller support : PASS
LXC: Checking for cgroup 'cpuset' controller support : PASS
LXC: Checking for cgroup 'memory' controller support : PASS
LXC: Checking for cgroup 'devices' controller support : PASS
LXC: Checking for cgroup 'freezer' controller support : PASS
LXC: Checking for cgroup 'blkio' controller support : PASS
LXC: Checking if device /sys/fs/fuse/connections exists : PASS
Ce qui est étrange c’est que la différence ce situe dans le test pour LXC et comme je veux ici créer une VM je pensais que seule la partie QEMU était pertinente. Mais en cherchant à résoudre le problème du cgroup FREEZER, je me suis dis que cela avait peut-être un lien avec mon problème car LXC et Docker utilisent des mécanismes de bas niveau communs. Or je suis dans un contexte conteneur.
La résolution de la différence concernant le cgroup FREEZER peu passer par l’adjonction d’un argument au lancement de kernel. Dans mon cas cela se passe au niveau du fichier /etc/default.grub
où il faut modifier le paramètre GRUB_CMDLINE_LINUX_DEFAULT pour lui donner au moins la valeur:
GRUB_CMDLINE_LINUX_DEFAULT= »systemd.unified_cgroup_hierarchy=0″
Puis passer
# update-grub
et redémarrer.
Cela corrige la validation virt-host-validate
et le pipeline refonctionne à nouveau.
La dernière fois où il avait fonctionné c’était il y a une semaine avant que je ne passe de Debian 10 à Debian 11. Je soupçonne que cela a dû changer la manière dont les cgroup sont gérés.
Tags: cgroup Docker libvirt Lxc virsh