Filesystems

縮小的虛擬磁碟文件,現在報告的文件大小不匹配

  • May 15, 2022

我最初有一個大約 3.5 TiB 的單個虛擬磁碟文件 (.qcow2),出於各種原因,我決定將所有類似的數據“分組”到它自己的虛擬磁碟文件中。顯然這意味著我可以縮小原始磁碟文件(到 900 GiB),但是lsstat朋友們仍然列出原始的 3.5 TiB:

$ ls -lhks mydisk.qcow2 
722G -rw-r--r-- 1 root root 3.5T Aug  6 18:06 mydisk.qcow2

當然,我縮小了文件系統本身(ext4)並在之後對文件進行了稀疏化,這就是為什麼目前只分配了 722 GiB 的原因。但是我的備份工具仍然檢測到 3.5 TiB,因此會在磁碟本身只能容納 900 GiB 的情況下對其進行掃描,這意味著完成所需的時間幾乎是必須完成的 4 倍。

如何“刷新”報告的大小?這是一台帶有 HDD 的機器,所以我在想文件可能過於碎片化,並且在 3.5 TiB 標記周圍有一些東西?但是不會自動複製文件修復(我試過了,至少沒有)?此外,磁碟文件本身駐留在 ZFS 上,如果這很重要的話。

如果可能的話,任何解決方案都最好就地工作。使用磁碟暫時關閉 VM 不是問題。

看起來有幾種方法可以就地進行:

  1. zerofree [-v] /dev/vdXY來賓虛擬機中使用(如果是 Linux,我的所有人都是)來查找非零未分配塊(“已刪除”的東西)並將它們替換為零。fallocate --dig-holes mydisk.qcow2主機跟隨以用孔替換零。儘管根據主機的文件系統可能不需要後者,但我相信如果啟用壓縮,ZFS 會自動將其視為稀疏。
  2. 只需使用virt-sparsify --in-place mydisk.qcow2似乎既可以歸零又可以打孔的方法。據我所知,這確實需要 libguestfs 中的修剪/丟棄/取消映射支持。但如果版本不是太古老,它應該在那裡。

為了進行測試,我創建了一個 10 GiB 的磁碟,添加了一些文本文件,填充了其余dd if=/dev/urandom文件並刪除了最後一個文件。du -h確認9.8G已分配。然後我直接複製了一些虛擬磁碟並分別測試:

  1. 由於我使用的是 ZFS 壓縮,zerofree因此它已經減少到 1173 kB(1200640 字節)。fallocate不會改變任何事情(預期)。
  2. 更進一步,達到 875 kB(895488 字節)。

很難判斷是 ZFS 壓縮還是zerofree這種情況下效率低下。但是virt-sparsify是來自主機的一個命令,它似乎也更快,所以我將使用它。

引用自:https://unix.stackexchange.com/questions/663594