Virtualization

QEMU - 虛擬驅動器的實際磁碟大小不正確

  • March 9, 2020

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

在來賓 (/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

可以看到,我在guest系統上只用了761G,還有1.2T可用。儘管如此,qemu-img說我使用的是1.9T。什麼原因?有沒有辦法解決這個問題?我想查看主機上的實際使用空間。我知道它可以實現,因為它在我填充sdb.raw數據之前正常工作 - qemu 根據磁碟內使用的空間報告了正確的磁碟大小。不幸的是,它只有一種方式起作用——當使用的空間逐漸增加時。在我刪除了一些文件並將使用空間從 1.9T 減少到 761G 後,報告的大小qemu-img並沒有變小,仍然保持在 1.9T。

qemu-img並且都從主機的角度du報告實際分配的空間。他們無法知道/理解來賓作業系統是否真的在使用該空間,或者在您的情況下,它是否已被使用者釋放。

要通知主機您的客戶有大量可用空間,您需要fstrim您的客戶文件系統**,並且**您必須確保您的 qemu/客戶塊設備堆棧正確傳遞TRIM/discard請求。為此,您需要:

  • 使用支持 TRIM/discard 的 qemu 塊設備驅動程序。virtio-scsi此類驅動器的範例是scsisata/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-imgordu將顯示真實(較小)分配的文件大小。

如果不滿足先決條件,您需要通過virt-sparsify或在使用零(即*:)清理來賓可用空間之後*離線壓縮您的圖像文件。qemu-img convert dd if=/dev/zero of=bigfile bs=1M count=<almost_all_free_space>; rm bigfile

請務必了解上述步驟的含義:任何錯誤都可能無法挽回地損壞您的圖像文件。在嘗試對您的磁碟映像文件進行任何操作之前,請務必進行可靠的備份!*

引用自:https://serverfault.com/questions/1006195