在我的 Linux Mint 17.2 VMware guest 虚拟机上,df -h
报告我的总磁盘使用量稳定在 10GB 左右。我使用这台机器在运行 Workstation 12.1.1 Pro 的 Windows 主机内进行 Ruby on Rails 开发。
文件*.vmdk
持续稳定增长至约 100GB。尝试缩小vmware-vdiskmanager -k
或vmware-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
不会重新使用以前使用过的块,通常更愿意给出以前从未使用过的块。
问题
让旧数据保留更长时间似乎不太安全。为什么
ext4
不尽快重新使用最近使用过的块呢?有没有办法强制
ext4
重用刚刚使用过的块?有没有一种方法可以防止 VMware 来宾
*.vmdk
文件不断增长,而无需0
定期填充可用空间?- 如何安全地(例如,不完全填充文件系统)自动执行此操作?
答案1
没有文件系统将已删除文件的块归零,它们只是将这些集群标记为可用。这就是为什么恢复工具可以恢复已删除的文件(如果它们未被其他文件覆盖)。如果文件系统驱动程序尽快重用这些块,那么您将不再能够恢复意外删除的文件,客户会哭泣,如果他们必须用零覆盖集群,那么性能将受到严重影响。
需要安全存储的文件应该进行加密,而不是按原样保留在磁盘上。如果需要,请使用碎纸机工具喜欢撕碎在 Unix 和ccleaner 驱动器擦拭器、橡皮擦、sdelete...在 Windows 上安全删除。
关于VMDK,你应该知道它把扇区存储在一个稀疏格式,就像 VHD、VDI 或任何其他 VM 的动态大小虚拟磁盘映像格式一样。因此,将扇区清零将它们标记为不需要如果超过了,压缩器就会将它们排除在外,从而产生更小的文件。任何非零扇区都必须显式存储,因为虚拟机不知道该扇区是否属于已删除的文件
使用dd if=/dev/zero
是一种不好的方法,因为
- 它很慢;
- 它使磁盘映像(暂时)增长到最大程度;
- 它(暂时)使用磁盘上的所有可用空间,因此其他并发写入操作可能会失败。
如中提到的zerofree
联机帮助页。使用专门用于将磁盘清零的工具,例如zerofree
反而。
没有办法阻止虚拟磁盘映像扩展,因为如果需要在磁盘上写入更多数据,您会期望什么?即使文件被删除,它们的数据仍然在磁盘上并占用映像文件的空间。如果你不想让文件变大,唯一的方法就是让它变大固定大小关于创作。
答案2
是的,从安全角度来看,最好立即删除任何未使用的块。未完成的原因(忽略
chattr
安全删除标志和补丁)是性能。不使用任何最近释放的块也是如此——这会导致严重的碎片,从而损害性能。不,不是真的。你可以让你的整个图像变得更小(格式化它
15G
,然后仅在必要时才增长。) - 那么它永远不会增长到超过 15Gb。您可以尝试使用
discard
选项 - see挂载文件系统fstab(5)
,但我不确定您的是否vmware 会注意到这一点
答案3
可能是因为向 VMDK 写入大量 NUL 使其回收所有已删除的块并将它们分配给wipefile
.但是,e4defrag
我不明白为什么没有这样做。