ESXi Windows虚拟机vmdk磁盘压缩操作指南

万能的“重新克隆法”

如果 -K (打孔) 提示功能未实现,最稳妥、最彻底的压缩方法就是再次使用克隆命令。克隆过程会自动跳过所有你刚刚置零(Zero out)过的块,生成一个最小化的新磁盘。

执行以下步骤:

  1. 克隆并压缩(将现有磁盘克隆到一个新文件):Bashvmkfstools -i M18.vmdk -d thin M18-compressed.vmdk
  2. 检查大小:Bashdu -h M18-compressed-flat.vmdk 此时你应该能看到文件大小已经显著减小了。
  3. 替换原文件:Bash# 删掉原来的(确认备份过) rm M18.vmdk M18-flat.vmdk # 把压缩后的改名回去 mv M18-compressed.vmdk M18.vmdk mv M18-compressed-flat.vmdk M18-flat.vmdk

为什么这个方法一定行?

-K 命令是在原有位置“挖洞”,对存储协议要求高;而 -i ... -d thin创建一个新文件。在创建新文件的过程中,ESXi 的克隆引擎会自动识别哪些块是全 0 并不再为它们分配物理空间。这就像是把一件旧衣服剪掉破洞(打孔)很难,但照着旧衣服的样子重新织一件(克隆)就简单多了。

你现在的存储环境(可能是家用 NAS、普通的 RAID 卡或特定版本的 ESXi)很可能不支持在线打孔,直接用克隆法是最快的。

一、操作前提(必做,避免失败)

  • 删除该虚拟机所有快照(有快照无法缩盘,会导致操作失败)
  • 备份虚拟机核心文件(至少备份vmdk和flat.vmdk文件,防止操作失误丢失数据)
  • 关机要求:仅“系统内收缩分区”可开机操作,后续ESXi端操作需关闭虚拟机
  • 磁盘模式:厚置备(thick)可先转精简(thin)再缩,精简置备可直接回收空闲空间

二、Windows虚拟机内部操作(开机执行)

步骤1:收缩系统/数据分区(释放未分配空间)

  1. 登录Windows虚拟机,按下Win+R,输入“diskmgmt.msc”,回车打开磁盘管理
  2. 右键点击需要压缩的磁盘分区(如C盘、D盘),选择“收缩卷”
  3. 输入要收缩的空间大小(例:500G缩至200G,输入300G),点击“确定”
  4. 确认结果:目标分区缩小,尾部出现“未分配”空间(建议留1-2G缓冲,避免缩盘失败)

步骤2:空闲空间填零(关键步骤,否则无法回收空间)

原理:ESXi仅能回收“全零块”,删除文件仅标记,需手动填零

推荐方法(微软官方工具sdelete)

  1. 下载sdelete工具:https://docs.microsoft.com/en-us/sysinternals/downloads/sdelete
  2. 以管理员身份打开CMD,进入sdelete存放目录
  3. 执行命令(清理C盘空闲空间):sdelete -z c:(数据盘替换为对应盘符,如sdelete -z d:)
  4. 等待执行完成(耗时取决于空闲空间大小,执行期间不要关闭CMD)

备选方法(PowerShell,Win10/2016+适用)

  1. 以管理员身份打开PowerShell,执行碎片整理:Optimize-Volume -DriveLetter C
  2. 执行填零操作:fsutil volume diskfree c:

操作完成后,关闭Windows虚拟机。

三、ESXi主机操作(SSH连接,虚拟机关机状态)

步骤1:开启ESXi SSH服务

  1. 登录ESXi网页端,找到目标主机
  2. 点击“管理”→“服务”,找到“SSH”服务,点击“启动”(操作完成后建议关闭)

步骤2:SSH登录ESXi主机

  1. 打开SSH工具(如Xshell、Putty),输入命令:ssh root@ESXi主机IP
  2. 输入ESXi root密码,登录成功

步骤3:进入虚拟机目录

  1. 查看虚拟机vmdk路径:ESXi网页端→目标虚拟机→编辑设置→硬盘→查看vmdk文件路径
  2. 执行命令进入目录(替换为实际路径):cd /vmfs/volumes/数据存储名/虚拟机名
  3. 执行命令查看vmdk文件:ls -lh *.vmdk(可看到描述文件.vmdk和实际数据文件-flat.vmdk)

步骤4:两种缩盘方案(二选一,按需选择)

方案一:直接缩小vmdk到指定大小(彻底缩容,厚/精简均适用)

  1. 修改vmdk描述文件:执行命令 vi 虚拟机名.vmdk
  2. 找到行:rw 扇区数 vmfs \"虚拟机名-flat.vmdk\"(扇区数=目标容量×1024×1024×1024÷512)
  3. 编辑修改扇区数(例:200G目标容量,扇区数=419430400)
  4. 保存退出:按ESC→输入:wq→回车
  5. 克隆并收缩磁盘:执行命令 vmkfstools -i 虚拟机名.vmdk 新虚拟机名.vmdk -d thin
  6. 替换旧磁盘:ESXi网页端→虚拟机→编辑设置→删除旧硬盘(保留文件)→添加硬盘→使用现有磁盘→选择新生成的.vmdk文件

方案二:精简置备回收空闲空间(不改变标称大小,仅回收物理空间)

  1. (厚置备需执行)转精简置备:vmkfstools -i 虚拟机名.vmdk 精简版.vmdk -d thin
  2. 回收零块空间:执行命令 vmkfstools -K 精简版.vmdk(精简版替换为实际文件名)
  3. 替换旧磁盘(同方案一第6步)

四、操作校验

  1. 启动Windows虚拟机,打开磁盘管理,确认分区大小符合预期
  2. ESXi网页端→数据存储,查看vmdk文件大小,确认已成功收缩

五、常见问题及解决方法

  • 有快照缩盘失败:删除所有快照后重新操作
  • 不填零无法回收空间:重新执行sdelete -z 盘符 操作
  • 缩盘后开机蓝屏:进WinPE用DiskGenius检查,确保未分配空间在磁盘尾部
  • SSH改vmdk报错只读:确认虚拟机已关机,解除磁盘锁定后再操作

六、最简流程总结

  1. Windows内:diskmgmt→收缩分区→sdelete -z 盘符→关机
  2. ESXi端:开启SSH→登录→进入虚拟机目录→修改vmdk扇区数→克隆收缩→替换磁盘
  3. 开机验证,完成缩盘

(注:文档部分内容可能由 AI 生成)