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

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

在我的 Linux Mint 17.2 VMware guest 虚拟机上,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不允许回收更多空间(在前几个 vmdk(从 6GB 左右开始)没有显示收缩迹象后,我终止了收缩。)

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

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

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

对于具有 10GB 实际数据的虚拟机来说,这大约可以节省 85GB 的空间。

当要求未使用的块时,似乎ext4不会重新使用以前使用过的块,通常更愿意给出以前从未使用过的块。

问题

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

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

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

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

答案1

没有文件系统将已删除文件的块归零,它们只是将这些集群标记为可用。这就是为什么恢复工具可以恢复已删除的文件(如果它们未被其他文件覆盖)。如果文件系统驱动程序尽快重用这些块,那么您将不再能够恢复意外删除的文件,客户会哭泣,如果他们必须用零覆盖集群,那么性能将受到严重影响。

需要安全存储的文件应该进行加密,而不是按原样保留在磁盘上。如果需要,请使用碎纸机工具喜欢撕碎在 Unix 和ccleaner 驱动器擦拭器、橡皮擦、sdelete...在 Windows 上安全删除。

关于VMDK,你应该知道它把扇区存储在一个稀疏格式,就像 VHD、VDI 或任何其他 VM 的动态大小虚拟磁盘映像格式一样。因此,将扇区清零将它们标记为不需要如果超过了,压缩器就会将它们排除在外,从而产生更小的文件。任何非零扇区都必须显式存储,因为虚拟机不知道该扇区是否属于已删除的文件

使用dd if=/dev/zero是一种不好的方法,因为

  • 它很慢;
  • 它使磁盘映像(暂时)增长到最大程度;
  • 它(暂时)使用磁盘上的所有可用空间,因此其他并发写入操作可能会失败。

如中提到的zerofree联机帮助页。使用专门用于将磁盘清零的工具,例如zerofree反而。

没有办法阻止虚拟磁盘映像扩展,因为如果需要在磁盘上写入更多数据,您会期望什么?即使文件被删除,它们的数据仍然在磁盘上并占用映像文件的空间。如果你不想让文件变大,唯一的方法就是让它变大固定大小关于创作。

答案2

  1. 是的,从安全角度来看,最好立即删除任何未使用的块。未完成的原因(忽略chattr安全删除标志和补丁)是性能。不使用任何最近释放的块也是如此——这会导致严重的碎片,从而损害性能。

  2. 不,不是真的。你可以让你的整个图像变得更小(格式化它15G,然后仅在必要时才增长。) - 那么它永远不会增长到超过 15Gb。

  3. 您可以尝试使用discard选项 - see挂载文件系统fstab(5),但我不确定您的是否vmware 会注意到这一点

答案3

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

相关内容