QEMU - 虚拟驱动器的实际磁盘大小不正确

use*_*731 9 virtualization filesystems virtual-machines qemu kvm-virtualization

dfls在我的主机上报告不同的大小,因为分配的大小与 EXT4 文件系统中实际使用的空间量之间存在差异。问题是两者都报告了错误的大小。qemu-img也不报告来宾文件系统(也是 EXT4)内使用的实际空间。

在主机上:

# 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
Run Code Online (Sandbox Code Playgroud)

在来宾 (/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
Run Code Online (Sandbox Code Playgroud)

如您所见,我仅在访客系统上使用 761G,仍然有 1.2T 可用。尽管如此,还是qemu-img说我使用的是 1.9T。什么原因?有没有办法来解决这个问题?我想查看主机上的实际使用空间。我知道它可以实现,因为它在我填充sdb.raw数据之前正常工作- qemu 根据磁盘内部使用的空间报告了正确的磁盘大小。不幸的是,它只有一种方式——当已用空间逐渐增加时。我删除了一些文件,使用空间从1.9T减少到761G后,报告的大小qemu-img没有变小,一直保持在1.9T。

sho*_*hok 11

qemu-img并且du从主机的角度报告实际分配的空间他们无法知道/理解来宾操作系统是否真的在使用该空间,或者在您的情况下,它是否已被用户释放。

要通知主机fstrim您的来宾文件系统需要大量可用空间,并且您必须确保您的 qemu/来宾块设备堆栈正确传递TRIM/discard请求。为此,您需要:

  • 使用带有 TRIM/discard 支持的 qemu 块设备驱动程序。此类驱动器的示例是virtio-scsiscsisata/ahci。所有这些驱动程序都使用经典/dev/sd[abcd...]命名法公开块设备。另一方面,您的来宾似乎正在使用支持修剪/丢弃的普通virtio驱动程序(带有/dev/vd[abcd...]名称)。您可以通过发出来检查您的驱动程序支持是否丢弃;lsblk -D

  • 启用相对libvirt 域discard=unmap选项

最后,您的主机必须使用hole_punching支持 ext4(您正在使用)和 xfs的文件系统。

您可以阅读此处了解更多信息。

如果所有先决条件都为真,则fstrim <mount_point>在您的来宾中发出也会自动取消分配主机上未使用的空间。请务必了解逻辑/表观文件大小将保持不变(即:它将显示 2.0 TB 之后fstrim),但使用qemu-imgdu将显示真实(较小)分配的文件大小。

如果不满足先决条件,您需要通过virt-sparsify在用零清理来宾可用空间(即:)之后离线压缩您的图像文件。qemu-img convert dd if=/dev/zero of=bigfile bs=1M count=<almost_all_free_space>; rm bigfile

请务必了解上述步骤的含义:做任何错误都可能无可挽回地损坏您的图像文件。并确保在尝试对磁盘映像文件进行任何操作之前进行良好的备份!*


bat*_*a09 5

这是预期的行为。正如你写的,“在我删除了一些文件并将使用空间从 1.9T 减少到 761G 之后” - 原始虚拟映像无法自动“收集垃圾”,即使删除文件,真实空间也会保持写入和分配。解决方法是执行(双重)转换 raw>qcow2(>raw)。

更详细的解释在这里 - https://balau82.wordpress.com/2011/05/08/qemu-raw-images-real-size/ 和这里 - https://techpiezo.com/tech-insights/raw-vs- qcow2-disk-images-in-qemu-kvm/

  • 同样的问题已经在这里回答 - https://serverfault.com/questions/329287/free-up-not-used-space-on-a-qcow2-image-file-on-kvm-qemu (2认同)
  • 太好了,谢谢你的回答。 (2认同)