Cette page décrit comment optimiser la gestion de l'espace disque quand on virtualise avec Libvirt/KVM.
== Configuration de la VM ==
Les disques doivent être sur un bus SCSI et le contrôleur SCSI en mode VirtIO.
Le format de l'image disque peut être au moins un des choix `qcow2` ou `raw` (autres choix pas testés).
De plus il faut indiquer l'option `discard='unmap'` sur ces disques et passer à une émulation de machine « assez moderne » (au minimum `pc-i440fx-2.1`, spécifier `pc` basculant automatiquement vers la dernière version).
Cela ne peut se faire via `virt-manager`, il faut donc passer par `virsh edit nom-de-vm`.
Exemple d'extrait de configuration XML : {{{#!xml
hvm
}}}
== Configuration du système Debian hébergé ==
Les systèmes de fichiers peuvent être sur des partitions du disque ou des volumes logiques LVM (autres choix pas testés).
Dans le cas de LVM, il faudra configurer l'option suivante dans `/etc/lvm/lvm.conf` : {{{#!config
issue_discards = 1
}}}
Le format des systèmes de fichiers doit être `ext4` (autres choix pas testés), sur lequel on positionnera l'option `discard` : {{{#!shell
tune2fs -o discard /dev/sda1
tune2fs -o discard /dev/mapper/vg0-racine
}}}
Si la configuration des disques a changé (par exemple elle n'était pas `scsi` mais `virtio`), il faut ajuster la liste des modules noyau disponibles au démarrage : {{{#!shell
echo MODULES=most >> /etc/initramfs-tools/conf.d/driver-policy
update-initramfs -u -k all
}}}
== Validation de la mise en place ==
La configuration ne sera totalement active qu'après un arrêt puis démarrage (et non redémarrage) de la VM : {{{#!shell
virsh shutdown nom-de-vm
virsh start nom-de-vm
}}}
Pour vérifier le support du mode `discard` on utilisera la commande suivante : {{{#!shell
lsblk --discard
}}}
Ceci devrait afficher des valeurs non nulles dans les colonnes `DISC-GRAN` et `DISC-MAX`.
Pour tester il suffit de suivre la procédure suivante :
* côté hôte, vérifier l'occupation disque actuelle : {{{#!shell
qemu-img info /var/lib/libvirt/images/nom-de-vm.img
}}}
* côté VM, créer un fichier volumineux : {{{#!shell
dd if=/dev/urandom of=/var/tmp/tempo bs=1M count=500
}}}
* côté VM, déclencher l'écriture sur disque : {{{#!shell
sync
}}}
* côté hôte, constater l'espace supplémentaire occupé : {{{#!shell
qemu-img info /var/lib/libvirt/images/nom-de-vm.img
}}}
* côté VM, supprimer le fichier volumineux : {{{#!shell
rm /var/tmp/tempo
}}}
* côté VM, déclencher la libération de l'espace disque : {{{#!shell
fstrim -v /var/tmp
}}}
* côté hôte, vérifier la libération de l'espace : {{{#!shell
qemu-img info /var/lib/libvirt/images/nom-de-vm.img
}}}