use*_*731 9 virtualization filesystems virtual-machines qemu kvm-virtualization
df并ls在我的主机上报告不同的大小,因为分配的大小与 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-scsi、scsi和sata/ahci。所有这些驱动程序都使用经典/dev/sd[abcd...]命名法公开块设备。另一方面,您的来宾似乎正在使用不支持修剪/丢弃的普通virtio驱动程序(带有/dev/vd[abcd...]名称)。您可以通过发出来检查您的驱动程序支持是否丢弃;lsblk -D
最后,您的主机必须使用hole_punching支持 ext4(您正在使用)和 xfs的文件系统。
您可以阅读此处了解更多信息。
如果所有先决条件都为真,则fstrim <mount_point>在您的来宾中发出也会自动取消分配主机上未使用的空间。请务必了解逻辑/表观文件大小将保持不变(即:它将显示 2.0 TB 之后fstrim),但使用qemu-img或du将显示真实(较小)分配的文件大小。
如果不满足先决条件,您需要通过virt-sparsify或在用零清理来宾可用空间(即:)之后离线压缩您的图像文件。qemu-img convert dd if=/dev/zero of=bigfile bs=1M count=<almost_all_free_space>; rm bigfile
请务必了解上述步骤的含义:做任何错误都可能无可挽回地损坏您的图像文件。并确保在尝试对磁盘映像文件进行任何操作之前进行良好的备份!*
这是预期的行为。正如你写的,“在我删除了一些文件并将使用空间从 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/
| 归档时间: |
|
| 查看次数: |
2518 次 |
| 最近记录: |