web-dev-qa-db-fra.com

QEMU - Taille de disque réelle incorrecte d'un lecteur virtuel

df et ls Signaler différentes tailles de ma machine hôte en raison de la différence entre la taille allouée et la quantité d'espace réellement utilisée dans le système de fichiers ext4. Le problème est que les deux signalent la mauvaise taille. qemu-img N'apportez pas non plus l'espace réel utilisé à l'intérieur du système de fichiers de l'invité (également ext4).

sur l'hôte :

# qemu-img info sdb.raw
image: sdb.raw
file format: raw
virtual size: 2.0T (2173253451776 bytes)
disk size: 1.9T

# ls -larth sdb.raw 
-rw-r--r-- 1 hypervisor hypervisor 2.0T Mar  6 13:47 sdb.raw

# du -sh sdb.raw 
1.9T   sdb.raw

# fdisk -l sdb.raw 
Disk sdb.raw: 2 TiB, 2173253451776 bytes, 4244635648 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: E6242A7E-1253-E74A-9389-68654A21E4F4

Device     Start        End    Sectors Size Type
sdb.raw1    2048 4244635614 4244633567   2T Linux filesystem

sur l'invité (/ dev/vdb1) :

# df -h
Filesystem      Size  Used Avail Use% Mounted on
dev              32G     0   32G   0% /dev
run              32G  496K   32G   1% /run
/dev/vda2       220G  100G  111G  48% /
tmpfs            32G     0   32G   0% /dev/shm
tmpfs            32G     0   32G   0% /sys/fs/cgroup
tmpfs            32G   26M   32G   1% /tmp
/dev/vdb1       2.0T  761G  1.2T  41% /root
tmpfs           6.3G     0  6.3G   0% /run/user/1002

Comme vous pouvez le constater, je n'utilise que 761g sur le système invité et il y a encore 1,2 t disponible. Malgré que, qemu-img dit que j'utilise 1,9 t. Quelle est la raison? Y'a t'il un moyen d'arranger cela? J'aimerais voir l'espace utilisé actuellement sur la machine hôte. Je sais que cela peut être atteint parce que cela fonctionnait correctement avant que je remplissais sdb.raw Avec les données - QEMU a signalé la bonne taille de disque en fonction de l'espace utilisé à l'intérieur du disque. Malheureusement, cela n'a fonctionné qu'une seule façon - lorsque l'espace utilisé augmente progressivement. Après avoir supprimé certains fichiers et réduit l'espace utilisé de 1,9 t à 761 g, la taille rapportée par qemu-img n'a pas changé à une valeur inférieure, il restait à 1,9 t.

8
user3125731

qemu-img et du _ les deux signalent l'espace alloué réel du point de vue de l'hôte. Ils ne peuvent pas savoir/comprendre si le système d'exploitation veut vraiment utiliser cet espace ou si, comme dans Votre cas, il a été libéré par l'utilisateur.

Pour informer l'hôte que votre invité a une tonne d'espace libre dont vous avez besoin pour fstrim votre système de fichiers invités et Vous devez être sûr que votre La pile de périphériques QEMU/Guest Block passe correctement TRIM/discard demandes. Pour ce faire, vous devez:

  • utilisez un pilote de périphérique de bloc QEMU avec support de garniture/défausse. Exemple de tels lecteurs sont virtio-scsi, scsi et sata/ahci. Tous ces pilotes exposent des dispositifs de bloc utilisant le classique /dev/sd[abcd...] nomenclature. D'autre part, il apparaît que votre invité utilise un pilote uni virtio (avec /dev/vd[abcd...] noms), qui comporte non prend en charge la garniture/rejeter. Vous pouvez vérifier si votre pilote prend en charge les rejets en émettant lsblk -D;

  • activer le relatif Libvirt Domain discard=unmap option ;

Enfin, votre hôte doit utiliser un système de fichiers avec hole_punching Prise en charge d'EXT4 (que vous utilisez) et XFS.

Vous pouvez lire ici pour plus d'informations supplémentaires.

Si toutes les conditions préalables sont vraies, émettant fstrim <mount_point> À l'intérieur de votre invité désaffectera automatiquement l'espace inutilisé sur l'hôte. Assurez-vous de comprendre que la taille du fichier logique/apparent restera inchangée (c'est-à-dire: elle affichera 2.0 TB jamais après fstrim), mais en utilisant qemu-img ou du _ révélera la taille de fichier réelle (plus petite) allouée.

Si les conditions préalables ne sont pas remplies, vous devez décompact votre fichier image via virt-sparsify ou qemu-img convert Après avoir nettoyé votre espace libre avec zéros (IE: dd if=/dev/zero of=bigfile bs=1M count=<almost_all_free_space>; rm bigfile).

Assurez-vous de comprendre ce que signifie les étapes ci-dessus: faire toute erreur peut corrompre irrémédiablement votre fichier image. et assurez-vous d'avoir une sauvegarde de savoir avant de tenter toute opération sur votre fichier image disque! *

10
shodanshok

C'est le comportement attendu. Comme vous l'avez écrit, "Après avoir supprimé certains fichiers et réduit l'espace utilisé de 1,9 t à 761g" - l'image virtuelle brute ne peut pas "collecter des ordures" automatiquement et que l'espace réel restera écrit et attribué même pour supprimer des fichiers. La solution de contournement est d'effectuer (double) conversion RAW> QCow2 (> RAW).

Plus détaillé expliqué ici - https://balau82.wordpress.com/2011/05/08/qemu-raw-images-real-size/ et ici - https: // teckpiezo .Com/Tech-Insights/Raw-VS-QCow2-Disk-IMAGES-IN-QEMU-KVM /

5
batistuta09