Interaktion von libvirt und AppArmor
Ich unterrichte an der Fachhochschule Burgenland in Eisenstadt (Österreich).
Dort hatten wir vor kurzem eine Laborübung (die zwar im Labor stattfand
aber alle Studenten arbeiteten von zuhause auf den Laborrechnern aus
Covid-Gründen) wo die Aufgabe war, mit libvirt
eine laufende
virtuelle Maschine auf einen anderen Server zu migrieren (wir verwenden
die Kommandozeile und virsh
).
Bei einer von mehreren Gruppen – alle mit identischen Debian Installationen – schlug die Migration mit einer Fehlermeldung fehl. Das Migrations-Kommando war:
virsh -c qemu+ssh://root@primary/system migrate --live --unsafe \ debian-1 qemu+ssh://root@secondary/system
Für die Laborübung verwenden wir NFS weil ein besseres verteiltes
Filesystem zu viel Zeit kosten würde, daher verwenden wir die
--unsafe
Option bei der Migration. Die folgende Fehlermeldung war
das Resultat (die Meldung ist in mehrere Zeilen zerlegt, die Meldung ist
normalerweise alles in einer Zeile):
error: internal error: Process exited prior to exec: libvirt: error : unable to set AppArmor profile 'libvirt-d22db7ca-50ca-43bd-b6da-1ccecf5a83e7' for '/usr/bin/kvm': No such file or directory
Es stellte sich dann heraus, dass es diese Gruppe geschafft hatte, die
/var
Partition mit Log-Dateien zu füllen. Aber auch nach Aufräumen
kam noch die gleiche Fehlermeldung. Das Gefühl sagte, dass hier von AppArmor
und/oder libvirt dynamisch erzeugte Dateien nicht erzeugt werden konnten
und dass dies der Grund für den Fehlschlag war. Ausserdem stellte sich
heraus, dass einige AppArmor Dateien die auf der ersten Maschine korrekt
installiert waren auf der zweiten Maschine fehlten.
Eine Neuinstallation von AppArmor und den zugehörigen Dateien mit
apt-get
mit der Option --reinstall
funktionierte nicht, die
fehlenden Konfigurationdateien in /etc/apparmor.d
wurden nicht neu
erzeugt. Daher war deinstallieren der Pakete mit dem purge
Kommando
(dieses entfernt auch die Konfigurationdateien) und dann Neuinstallation
der Ausweg um die fehlenden AppArmor Dateien zu bekommen und so die
Migration schlussendlich durchzuführen. Ich habe bis jetzt keine Ahnung,
welche Dateien gefehlt haben.
Wenn man nach der obigen Fehlermeldung googled, findet man einen
Debian Bug-Report wo eine der dynamisch erzeugten Dateien in
/etc/apparmor.d/libvirt
die Länge Null hatte. Dies war jedoch
nicht das Problem in unserem Fall, zeigt aber dass AppArmor nicht
besonders sorgfältig die Fehler prüft, z.B. wenn das Dateisystem voll
ist. Es gibt also vermutlich noch andere Dateien die dynamisch erzeugt
werden die in unserem Fall das Problem waren.
Die folgende Abfolge von Deinstallations und Re-Installations Kommandos hat das Problem in unserem Fall behoben. Es sei darauf hingewiesen dass das Entfernen der beiden Dateien wie im Debian Bug-Report das Problem in unserem Fall nicht gelöst hat:
dpkg --purge apparmor-utils apparmor-profiles dpkg --purge apparmor rm -rf /var/cache/apparmor apt-get install apparmor apparmor-utils apparmor-profiles dpkg --purge libvirt-daemon-system apt-get install libvirt-daemon-system systemctl restart libvirtd.service systemctl restart virtlogd.service systemctl restart virtlogd.socket
Ich bin nicht sicher dass man alle Services wirklich neu starten muss,
aber es gab ein Problem dass libvirt nicht auf den virtlog Socket
verbinden konnte und das ließ sich durch ein Restart von
virtlog.{service,socket}
beheben.