背景
众所周知,VMware Workstation使用的vmdk虚拟磁盘的文件体积会随着使用越来越大。即使删除了虚拟磁盘里的文件,vmdk本体的体积也不会缩小。笔者的虚拟磁盘安装了CentOS7,实际只使用了14G,但vmdk文件达到了26G,这实在是一种浪费。
VMware在虚拟机设置中内置了磁盘压缩功能。该功能对装有Windows系统的虚拟磁盘效果往往立竿见影,但对Linux文件系统的磁盘似乎水土不服,压缩后和压缩前几乎没什么区别。
原因及解决
执行磁盘压缩时,VMware的compact工具会扫描全零区块,连续全零区块会被判定为可压缩空间。
在Windows(NTFS)中,当文件被删除时,系统会主动向底层存储(包括虚拟磁盘)发送TRIM指令。VMware Tools能实时接收这些指令,标记空闲区块为”可回收”。而Linux(ext4/xfs等)文件系统默认不自动发送TRIM指令,需要用以下命令为不使用的区块手动填充0:
cat /dev/zero > zero.fill
# 一段时间后会显示“写入错误,系统无空间可用”。此乃正常现象。
rm -f zero.fill
手动写0后再执行磁盘压缩,可以看到vmdk文件体积变小。笔者的vmdk文件从26G缩小到了14G,基本和实际使用情况一致。