Gestern Nacht habe ich viele Stunden mit einem im Nachhinein ziemlich dämlichen Problem verbracht. Meine virtuelle Maschine wollte nach einem Neustart nicht mehr booten, GRUB erzählte zunächst etwas von „Error 15: File not found“ und später nach meinen vergeblichen Reparaturversuchen dann „Error 28: Selected item cannot fit into memory„.
Zum Glück hat mich diese zweite Fehlermeldung auf die richtige Fährte gebracht. Die virtuelle Maschine hatte plötzlich nur noch 16 KiB(!) RAM, und da ist es ja kein Wunder, dass sie nicht booten mochte. Sofort habe ich mir die XML-Definition der virtuellen Maschine anzeigen lassen und las dann Folgendes:
<domain type='kvm'> <name>webserver</name> <memory>16</memory> <currentMemory>16</currentMemory>
Es gab also tatsächlich nur 16 KiB RAM für die virtuelle Maschine. Wie konnte das passieren? Ganz einfach: Laut libvirt-Handbuch kann man im memory
-Element ein Attribut namens unit
benutzen, um die Einheit der im Element angegebenen Zahl festzulegen. Standardmäßig sind es KiB. Ich hatte Folgendes eingetragen, um der VM bis zu 16 GiB Speicher zu geben:
<domain type='kvm'> <name>webserver</name> <memory unit='GiB'>16</memory> <currentMemory unit='GiB'>16</currentMemory>
Und nun der böse Fehler, aber nicht meinerseits: Beim Speichern der XML-Definition vergisst libvirt das unit
-Attribut, so dass am Ende einfach nur noch die Zahl 16 ohne Einheit übrig bleibt, die dann beim nächsten Starten der VM als 16 KiB interpretiert wird. Nun benutze ich 16777216 (KiB), was meinen 16 GiB entspricht, und es gibt keine Probleme mehr.
Ziemlich ärgerlich! Aber immerhin habe ich bei meinen gar nicht notwendig gewesenen Reparaturversuchen etwas über GRUB gelernt und auch zum ersten Mal mit einem VNC-Client auf meine VM zugegriffen, was sehr hilfreich ist, da man ihr damit beim Booten zuschauen kann (ich habe TightVNC benutzt und fand es gut). Ohne VNC-Client hätte ich die Fehlermeldung beim Booten nicht sehen können und wäre noch ratloser gewesen …