背景:有客户提及到之前没合理为虚拟机分配磁盘空间,虚拟机磁盘类型虽然选择精简置备,但是运行一段时间之后,虚拟机OS系统内看到的实际使用空间远小于存储占用空间。
原理:精简置备vmdk文件容量是随着写入置备增加,即虚拟机某个时间使用磁盘达到历史峰值后,即便删除文件,甚至格式化磁盘,vmdk文件所占用的空间依然是历史峰值容量。删除操作是在OS层面进行的,但是虚拟化底层并不能感知这个删除操作,因此也就不会回收。
因为NTFS文件系统的机制,被写入过的文件即使将文件删除系统也不会将磁盘区块置零,下次再写入数据只会优先操作标记为零的区块来写。
解决思路:分两步:
1、使用磁盘置零工具(Windows下有SDelete工具,Linux下有DD工具)将虚拟机未使用的空间填零;
2、使用vmkfstools 移除置零的块,收缩VMDK文件。
下文以一台Win7虚拟机为例,介绍回收过程。
1、前提:开启主机SSH权限,登录到当前虚拟机所在的存储路径,使用
du - sh *
查看当前vmdk所占空间为16.5G
2、在虚拟机操作系统内拷贝文件,拷贝大约5G文件之后,并删除。
3、因为Windows不会自动将已删除的块清零。Windows下可以使用 SDelete工具 填零,SDelete v2.04工具下载,运行sdelete.exe -z 盘符,运行过程比较慢,耐心等待,期间在操作系统中会看见你的磁盘会被占满,等运行完成后又会回到正常的容量。
请注意,在此过程中,该虚拟磁盘vmdk文件将增长到精简置备分配完整大小。
4、第一次查询为拷贝并删除5G文件后vmdk占用的文件大小为21.5G,可见删除文件后并不会减少vmdk的占用空间大小。如下图:
第二次查询为运行 SDelete工具 之后vmdk的占用空间大小为37.3G。(这里注意:一定要确保存储有足够空间以允许该虚拟机磁盘空间增长到其置备的最大值,否则撑爆存储后果不堪设想。)
5、将虚拟机关机,并使用vmkfstools进行磁盘回收。(备注:不关机强制运行vmkfstools会提示Failed to open virtual disk ‘new-win7.vmdk’: Failed to lock the file (16392);)
vmkfstools -K [disk-name].vmdk
vmdk回收中,有进度百分比。
需要注意:转换过程中需要用到的文件是vmdk磁盘文件,有两种vmdk,一种是”虚拟机名.vmdk”,另一种是”虚拟机名-flat.vmdk”,vmdk文件很小,存放了虚拟磁盘的一些配置信息(如虚拟磁盘数据文件等),实际数据都存放在flat.vmdk文件中,转换时需要使用vmdk文件而不是flat.vmdk文件。
6、直到显示100%表示回收成功,查询vmdk占用空间已经减少到15.5G。
7、打开虚拟机电源,验证虚拟机可以正常使用。
注意事项:
回收前请注意备份虚拟机;虚拟机不能有快照,虚拟机需要关机或者将虚拟磁盘移除以确保磁盘未在使用(需要评估停机窗口,回收时间取决于vmdk大小),并确保存储空间足够。
经验证,Storage vMotion过程修改厚置备和精简置备,来回迁移两次,实际并不能回收vmdk空间。
如果以上方式满足不了要求,VMware vCenter Converter也是可行的。
,