VMware:为什么需要零填充 ext4 可用空间来缩小 *.vmdk 文件?

Tom*_*ale 6 ext4 vmware

在我的 Linux Mint 17.2 VMware 来宾上,df -h报告我的总磁盘使用量稳定在 10GB 左右。我正在使用这台机器在运行 Workstation 12.1.1 Pro 的 Windows 主机中进行 Ruby on Rails 开发。

*.vmdk文件保存在稳步增长到大约100GB。试图缩小vmware-vdiskmanager -kvmware-toolbox-cmd disk shrinkonly没有任何区别。

我有Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize。有更完整的dumpe2fs输出可用

正在运行e4defrag /并且e2fsck -E discard不允许回收更多空间(在前几个 vmdks(从 6GB 左右开始)显示没有缩小的迹象后,我终止了缩小。)

最终的诀窍是用NUL字节填充所有可用空间:

dd if=/dev/zero of=wipefile bs=1M; sync; rm wipefile

我现在可以*.vmdk使用vmware-toolbox-cmd disk shrinkonly.

这在具有 10GB 实际数据的 VM 上节省了大约 85GB 空间。

ext4当被要求使用一个未使用的块时,似乎没有重新使用以前使用过的块,通常更喜欢给出从未使用过的块。

问题

  1. 让旧数据停留更长时间似乎不太安全。为什么ext4不尽快重新使用最近使用的块?

  2. 有没有办法强制ext4重用刚刚使用的块?

  3. 有没有办法防止 VMware 来宾的*.vmdk文件不断增长而无需0定期填充可用空间?

    • 您如何安全地(例如,不完全填充文件系统)自动执行此操作?

SAC*_*ARG 0

可能是因为向 VMDK 写入大量 NUL 使其回收所有已删除的块并将它们分配给wipefile. 但是,e4defrag我不明白为什么没有这样做。