ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

VMWARE 占用硬盘空间只增大不减少的清理办法:用 TaoToken 统一 Key 打通 vmdk 瘦身脚本

VMWARE 占用硬盘空间只增大不减少的清理办法:用 TaoToken 统一 Key 打通 vmdk 瘦身脚本 1. 为什么 vmdk 只增不减先搞懂 VMware 的磁盘账本VMware 虚拟机用久了宿主机硬盘空间被吃掉几十上百 GB进系统里删文件、清缓存、卸载软件宿主机那边却纹丝不动——这是很多人第一次遇到都会懵的问题。核心原因在于 vmdk 的分层设计虚拟机看到的是一块“逻辑磁盘”宿主机上真正占空间的是若干.vmdk数据文件两者之间隔着一层映射表。当你往虚拟机里写数据VMware 按需分配块写多少扩多少但当你删除文件Guest OS 只是把块标记为“空闲”VMware 并不知道这些块已经没用了它仍然认为这些块被占用于是宿主机上的 vmdk 文件不会自动缩小。这就是“只增不减”的本质空间回收需要显式触发而不是自动发生。要解决它得先分清两种磁盘模式模式特点能否收缩厚置备Thick创建时一次性分配全部空间不能收缩只能迁移重建精简置备Thin按需增长用多少占多少可以收缩需 Guest 内配合绝大多数“只增不减”的抱怨都发生在精简置备磁盘上。收缩分两步走先在 Guest 系统里把空闲块“归零”再让 VMware 把这些归零的块从 vmdk 里剔除。前者靠vmware-toolbox-cmd后者靠vmware-vdiskmanager。这两条命令是本文的主角配合一套可复制的脚本能把几十 GB 的浪费空间真正还回来。适合谁看本地跑 VMware Workstation/Player 的开发者、测试同学以及用虚拟机做长期构建环境、数据库实验、容器宿主的人。如果你发现宿主机 C 盘或数据盘被某个虚拟机目录越吃越满这篇就是给你的排查与瘦身手册。排查第一步永远是定位。先别急着删东西先看清楚空间到底被谁占了。下面从定位命令开始一步步走到收缩验证。2. 定位 vmdk 占用用命令找出真正吃空间的文件在动手收缩前必须先确认三件事哪个虚拟机目录最大、目录里哪些 vmdk 是数据盘、当前磁盘是不是精简置备。盲目收缩厚置备磁盘是白费功夫所以定位环节不能省。Windows 宿主机下用 PowerShell 按大小列出虚拟机目录里的 vmdk# 进入虚拟机存放根目录按大小降序排列所有 vmdk Get-ChildItem -Path F:\VMs -Recurse -Filter *.vmdk | Sort-Object Length -Descending | Select-Object FullName, {NameSizeGB;Expression{[math]::Round($_.Length/1GB,2)}} | Format-Table -AutoSize输出会告诉你哪个.vmdk是几十 GB 的大头。注意区分两类文件xxx.vmdk描述符很小和xxx-s001.vmdk、xxx-s002.vmdk真正的数据分片。精简置备的磁盘通常是一堆-s0xx分片收缩时要针对描述符文件操作而不是分片。Linux 宿主机下用du和find# 找出虚拟机目录下最大的 10 个 vmdk find /data/VMs -name *.vmdk -type f -printf %s\t%p\n \ | sort -rn | head -10 \ | awk {printf %.2f GB\t%s\n, $1/1024/1024/1024, $2}接着确认磁盘模式。打开虚拟机的.vmx配置文件搜索scsi0:0.mode或nvme0:0.modegrep -i mode /data/VMs/MyVM/MyVM.vmx如果看到independent或没有mode行多半是厚置备如果看到thin相关配置或磁盘文件明显小于配置容量就是精简置备。另一种判断方式在 VMware 界面里看虚拟机设置磁盘类型标注为“精简置备”即可收缩。定位阶段还要记录一个关键数字Guest 系统内的实际使用量。进虚拟机执行df -h假设 Guest 里/只用了 20 GB但宿主机上对应 vmdk 占了 60 GB那中间 40 GB 就是可回收的浪费。这个差值就是收缩的目标收益也是后面验证的基准。把这三个信息记下来vmdk 路径、磁盘模式、Guest 使用量 vs 宿主机占用。有了它们才能判断该不该收缩、能收回多少。3. 可复制配置vmware-toolbox 归零 vdiskmanager 收缩收缩分两阶段顺序不能反。第一阶段在 Guest 内把空闲块归零第二阶段在宿主机上把归零块剔除。跳过第一阶段直接收缩效果会大打折扣。3.1 Guest 内归零vmware-toolbox-cmd先确认 Guest 里装了 open-vm-tools现代 Linux 发行版基本自带# Debian/Ubuntu sudo apt-get install -y open-vm-tools # RHEL/CentOS/Rocky sudo dnf install -y open-vm-tools然后查看磁盘挂载点sudo vmware-toolbox-cmd disk list输出类似/ /boot /home对每个挂载点执行归零也叫 wipesudo vmware-toolbox-cmd disk wipe / sudo vmware-toolbox-cmd disk wipe /home如果只想一次性处理所有挂载点用sudo vmware-toolbox-cmd disk shrinkonlyshrinkonly会依次对每个挂载点做归零并触发收缩适合懒人。但要注意执行时宿主机当前盘剩余空间必须大于等于虚拟机配置的总容量否则中途会失败。空间不够时先把部分-s0xx.vmdk分片临时剪切到其他盘收缩完再移回来。归零过程可能很慢几十 GB 的盘跑十几分钟到半小时都正常进度条会显示Shrinking disk F:\FC\FC.vmdk。耐心等它跑完中途别关虚拟机。3.2 宿主机收缩vmware-vdiskmanager如果 Guest 内归零已经触发收缩这一步可以跳过。但很多时候归零只做了 wipe没做 shrink这时需要在宿主机上手动执行vmware-vdiskmanager。Windows 下进入 VMware 安装目录cd C:\Program Files (x86)\VMware\VMware Workstation .\vmware-vdiskmanager.exe -k F:\VMs\MyVM\MyVM.vmdkLinux 下路径通常是/usr/bin/vmware-vdiskmanagersudo vmware-vdiskmanager -k /data/VMs/MyVM/MyVM.vmdk-k就是 shrink 参数。执行前必须关闭虚拟机否则文件被占用会报错。输出会显示进度Shrink: 100% done. Shrink completed successfully.看到这行就说明宿主机侧的 vmdk 已经真正缩小了。3.3 用 TaoToken 统一 Key 管理收缩脚本如果你有多台虚拟机、多个环境要定期收缩手动敲命令容易漏。可以把收缩逻辑写成一个脚本用 TaoToken 的统一 Key 调用 API 做记录和调度。TaoToken 提供兼容 OpenAI 风格的接口一个 Key 就能打通多个模型调用适合把“收缩日志分析”“异常告警”这类轻量任务接进来。先在控制台创建 API Key拿到形如sk-xxxx的凭证。然后写一个配置文件把 Base URL、Key、Model ID 三件套固定下来{ base_url: https://taotoken.net/api, api_key: sk-你的Key, model: claude-3-5-sonnet, shrink_targets: [ {vmx: F:\\VMs\\MyVM\\MyVM.vmdk, guest_used_gb: 20}, {vmx: F:\\VMs\\BuildVM\\BuildVM.vmdk, guest_used_gb: 45} ] }对应的 Python 调用片段用来在收缩后把结果发给模型做摘要import json, subprocess, requests with open(shrink_config.json, encodingutf-8) as f: cfg json.load(f) def shrink(vmdk): result subprocess.run( [vmware-vdiskmanager.exe, -k, vmdk], capture_outputTrue, textTrue ) return result.stdout logs [] for t in cfg[shrink_targets]: logs.append(f{t[vmx]}: {shrink(t[vmx])}) resp requests.post( f{cfg[base_url]}/v1/chat/completions, headers{Authorization: fBearer {cfg[api_key]}}, json{ model: cfg[model], messages: [{role: user, content: 总结以下 vmdk 收缩结果\n \n.join(logs)}] }, timeout60 ) print(resp.json()[choices][0][message][content])这样每次收缩完日志自动汇总成一段可读报告省去人工翻输出。Base URL 用https://taotoken.net/apiKey 从控制台生成Model ID 按你实际开通的填。三件套对齐后脚本就能稳定跑起来。4. 验证请求与成功结果收缩前后对比脚本收缩做完不算完得用数据证明空间真的降了。写一个对比脚本在收缩前后各跑一次把宿主机占用和 Guest 使用量都记下来。#!/bin/bash # shrink_compare.sh —— 收缩前后对比 VMDK/data/VMs/MyVM/MyVM.vmdk GUEST_USED$(ssh uservm df -h / | tail -1 | awk {print \$3}) HOST_SIZE$(du -h $VMDK | awk {print $1}) echo 收缩前 echo Guest 使用量: $GUEST_USED echo 宿主机 vmdk 占用: $HOST_SIZE # 执行收缩 sudo vmware-vdiskmanager -k $VMDK HOST_SIZE_AFTER$(du -h $VMDK | awk {print $1}) echo 收缩后 echo 宿主机 vmdk 占用: $HOST_SIZE_AFTERWindows 下用 PowerShell 版本$vmdk F:\VMs\MyVM\MyVM.vmdk $before (Get-Item $vmdk).Length / 1GB Write-Host 收缩前: $([math]::Round($before,2)) GB C:\Program Files (x86)\VMware\VMware Workstation\vmware-vdiskmanager.exe -k $vmdk $after (Get-Item $vmdk).Length / 1GB Write-Host 收缩后: $([math]::Round($after,2)) GB Write-Host 回收: $([math]::Round($before - $after,2)) GB一次真实的结果参考某 Debian 虚拟机 Guest 内df显示用了 18 GB宿主机 vmdk 占 52 GB。执行vmware-toolbox-cmd disk shrinkonly加vmware-vdiskmanager -k后宿主机占用降到 21 GB回收约 31 GB。这个差值接近 Guest 使用量说明收缩到位了。验证清单宿主机 vmdk 文件大小明显下降接近 Guest 实际使用量vmware-vdiskmanager -k输出Shrink completed successfully虚拟机重新启动后系统正常文件无损坏df -h在 Guest 内显示的使用量不变收缩不影响 Guest 数据如果收缩后宿主机占用没降八成是归零阶段没做或者磁盘是厚置备模式。回到第 2 节重新确认磁盘模式。5. 常见报错排查401、local proxy failed、reading choices收缩脚本接上 API 后最容易撞的几类报错集中在这里。逐个对照排查。401 UnauthorizedKey 无效或没带上。检查请求头是不是Authorization: Bearer sk-xxxx注意 Bearer 后面有空格。Key 从控制台重新复制一次别用带省略号的显示值。如果 Key 刚创建等几秒生效再试。local proxy failed / connection refused本地网络到https://taotoken.net/api不通。先curl -I https://taotoken.net/api看能否返回状态码。如果是公司网络限制换网络环境或检查防火墙出站规则。注意 Base URL 不要多加/v1之外的路径/v1/chat/completions是完整端点。reading choices 报错 / KeyError: choices说明返回体里没有choices字段通常是请求体格式不对。确认messages是数组、model字段拼写正确。打印完整resp.text看服务端返回的错误信息比只看异常更直接。OAuth 相关报错如果你用的是需要 OAuth 的客户端比如某些 IDE 插件别把 OAuth token 和 API Key 混用。TaoToken 的 API Key 走 Bearer 认证OAuth 流程是另一套。两者分开配置别塞进同一个字段。vmware-vdiskmanager 报文件被占用虚拟机没关干净。确认 VMware 进程全部退出Windows 下检查任务管理器里有没有残留的vmware-vmx.exe。Linux 下lsof | grep vmdk看谁占着文件。收缩中途失败、空间不足宿主机当前盘剩余空间小于虚拟机配置容量。按第 3 节的办法先把部分-s0xx.vmdk分片临时移到其他盘收缩完再移回。移动时保持文件名和相对路径不变否则描述符找不到分片。Guest 内 vmware-toolbox-cmd 找不到命令open-vm-tools 没装或没启动。systemctl status open-vm-tools看服务状态没装就按 3.1 节安装。装完重启虚拟机再试。排查顺序建议先确认 Key 和 Base URL 三件套对齐再看网络连通性最后看请求体格式。大部分 401 和 choices 报错都是配置字段写错不是服务本身的问题。6. 把收缩接进日常用统一 Key 做长期维护单次收缩解决的是眼前的空间危机但虚拟机用久了还会再涨。与其每次手动救火不如把收缩做成定期任务用 TaoToken 的统一 Key 把日志和告警串起来。思路很简单写一个定时脚本每周检查各虚拟机 vmdk 的宿主机占用与 Guest 使用量差值超过阈值就自动触发收缩并把结果通过 API 汇总成报告。这样你不用天天盯盘空间也不会突然爆掉。配置上继续沿用第 3 节的三件套Base URL 用https://taotoken.net/apiKey 从控制台生成Model ID 按需选。把收缩目标写进 JSON脚本读取后批量处理。定时任务用 Windows 任务计划或 Linux cron 都行# 每周日凌晨 3 点执行收缩检查 0 3 * * 0 /usr/local/bin/shrink_check.sh /var/log/vmdk_shrink.log 21长期维护还有几个实用习惯给虚拟机目录单独放一个盘别和系统盘混用避免空间告急时影响宿主机定期清理 Guest 内的日志和缓存减少归零工作量对不再用的虚拟机直接删除整个目录比收缩更彻底。如果你同时管多台机器、多个环境统一 Key 的价值就体现出来了——不用为每个脚本单独配凭证一个 Key 打通所有调用日志汇总、异常告警、报告生成都能接进同一条链路。收缩本身是本地操作但围绕它的记录和调度可以交给 API 来做省下的是反复排查的时间。最后提醒一句收缩前一定确认磁盘是精简置备厚置备磁盘收缩无效只能通过迁移重建来回收空间。这个判断在第 2 节已经给过方法动手前花两分钟确认能避免白忙一场。
返回列表