QEMU - 虛擬驅動器的實際磁碟大小不正確
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
在來賓 (/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
此類驅動器的範例是scsi
和sata/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-img
ordu
將顯示真實(較小)分配的文件大小。如果不滿足先決條件,您需要通過
virt-sparsify
或在使用零(即*:)清理來賓可用空間之後*離線壓縮您的圖像文件。qemu-img convert
dd if=/dev/zero of=bigfile bs=1M count=<almost_all_free_space>; rm bigfile
請務必了解上述步驟的含義:任何錯誤都可能無法挽回地損壞您的圖像文件。在嘗試對您的磁碟映像文件進行任何操作之前,請務必進行可靠的備份!*