QEMU/KVM: Discard-Support für (QCOW2) Images
Ein guter Freund hat mich gestern gebeten, das kurz zu dokumentieren: Wenn man mit QEMU/KVM, z.B. via libvirt interagierend, VMs mit Images im QCOW2-Format anlegt, dann kann man diese sparse erzeugen, es wird also nicht gleich der ganze Platz auf der Festplatte belegt (das funktioniert übrigens wohl auch für Images im raw-Format). Kopiert man jetzt große Datenmengen auf eine VM und löscht diese danach wieder, dann ist der Platz im Host-System erstmal vergeben und wird auch nicht wieder frei gegegeben. Um das zu erreichen sind folgende Schritte notwendig:
- man definiert die VM neu, so dass sie einen SCSI-Disk-Controller hat und verwendet als Backend-Devices für alle Disks auch SCSI-Disks
- man definiert bei der Storage den Parameter
discard='unmap'
- man löst periodisch ein
fstrim
aus
Ich hab mir jetzt mal eine Beispiel-VM genommen und erst mal die Konfiguration
mit virsh dumpxml example > example.xml
gesichert. In der Maschinen-Definition
fand sich folgender Block zur Storage:
|
|
Ich habe mittels virsh edit example
den discard-Parameter eingefügt, den Bus
auf SCSI gestellt und die ganzen Address-Angaben entfernt:
|
|
Ferner fügte ich weiter unten noch den SCSI-Controller ein:
|
|
Nachdem ich die VM abgeschaltet und danach neu gestartet hatte war es dann Zeit für einen kurzen Test:
|
|
Update 10.07.2018: Man beachte, dass ich hier den Befehl du
verwendet
habe ;-)
Man muss in der VM also jetzt einfach dafür Sorgen, das (semi-)regelmäßig ein
fstrim -a
aufgerufen wird - hallo, cron
. Unter Debian liefert man die
systemd-Unit-Files für fstrim.timer
und fstrim.service
mit:
|
|
Und mehr ist nicht dabei :-)