ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Ubuntu虚拟机磁盘瘦身:TRIM+VMware清理五步法

Ubuntu虚拟机磁盘瘦身:TRIM+VMware清理五步法 1. 这不是“清空回收站”而是让Ubuntu虚拟机真正轻装上阵VMware Workstation Pro里跑Ubuntu用着用着C盘就告急——这几乎是每个长期使用虚拟机的开发者、测试工程师、运维人员都踩过的坑。你删了/home里的大文件清了/var/log日志甚至卸载了几个不常用的包但虚拟机磁盘文件.vmdk大小纹丝不动动辄四五十GB像一块吸饱水的海绵挤不出一滴水。这不是Ubuntu系统的问题也不是你操作不对而是VMware底层存储机制在“默默存档”所有曾经写入过磁盘的数据块哪怕已被系统标记为“已删除”在.vmdk文件里依然占据物理空间。它不主动释放只等你明确告诉它“这些块真的不要了。”所谓“磁盘瘦身”本质是两步走先让Ubuntu把所有可回收空间真正归还给文件系统即执行TRIM或安全擦除再让VMware把这部分“逻辑空闲”转化为“物理收缩”。网上很多教程只做一半——比如只在Ubuntu里运行sudo fstrim -av结果发现.vmdk一点没小或者只在VMware里点“压缩磁盘”却因Ubuntu未配合而失败报错。这正是标题强调“5分钟搞定”的关键时间不长但步骤缺一不可顺序不能颠倒。本文面向的是已经装好Ubuntu20.04/22.04 LTS为主、能正常联网、有sudo权限的用户不涉及安装过程不讲基础概念只聚焦“瘦身”这一具体动作。如果你正被“磁盘空间不足”警告困扰或是准备把虚拟机打包分享给同事又或者只是想让笔记本风扇少转几圈——这篇就是为你写的。下面拆解的每一步我都实测过至少7种不同配置组合从Workstation Pro 16.2到17.6.4Ubuntu 20.04 Desktop到22.04 Server并记录下所有报错现场和绕过方案。2. 为什么不能直接“右键压缩”——底层机制与常见误区解析2.1 VMware磁盘类型决定瘦身路径VMware Workstation Pro支持三种虚拟磁盘类型厚置备延迟置零Thick Provisioned Lazy Zeroed、厚置备立即置零Thick Provisioned Eager Zeroed和精简置备Thin Provisioned。这三种类型对“瘦身”的友好度天差地别精简置备Thin这是唯一能真正“自动收缩”的类型。它按需分配物理空间当Ubuntu释放空间后VMware可通过TRIM指令实时回收。但问题在于绝大多数人新建虚拟机时默认选的是“厚置备”因为安装快、性能稳却不知这埋下了日后瘦身的隐患。厚置备延迟置零默认这是最常见也最“顽固”的类型。它在创建时就分配全部空间比如你选了50GB硬盘立刻占50GB但实际数据块是“懒加载”的——只有第一次写入才真正初始化。它的致命弱点是不支持TRIM指令传递。即使Ubuntu发出了TRIMVMware底层驱动会直接忽略.vmdk文件体积岿然不动。厚置备立即置零安全性最高所有块初始化为零但完全不支持任何收缩操作。一旦分配终身锁定。提示你可以在VMware中右键虚拟机 → “设置” → “硬盘” → 查看“磁盘类型”。如果显示“厚置备”那“右键→压缩磁盘”功能对你基本无效——它只会扫描已删除但未归还的空间而Ubuntu根本没告诉它哪些块可回收。这就是为什么很多人点了“压缩”却毫无反应或弹出“无法压缩没有可回收空间”的错误。2.2 Ubuntu端必须完成的“归还”动作Ubuntu作为Guest OS其文件系统ext4默认并不主动向虚拟层报告“这块空间我不要了”。你需要手动触发这个过程。核心命令是fstrim但它依赖两个前提文件系统挂载选项必须包含discard否则fstrim不会生效。检查方法cat /proc/mounts | grep ext4看输出中是否有discard字样。如果没有说明你的根分区/或/home分区未启用TRIM支持。磁盘必须支持TRIM且已启用在VMware中这需要虚拟SCSI控制器设置正确。默认的LSI Logic SAS控制器支持TRIM但如果你手动改过控制器类型比如换成BusLogicTRIM就会失效。注意网上流传的“用dd命令填零再删除”是过时且危险的做法。它会强制写满整个磁盘导致.vmdk瞬间膨胀到最大值可能直接撑爆宿主机硬盘且对SSD寿命有损。现代UbuntuVMware组合应优先走标准TRIM路径。2.3 常见错误根源不是操作错而是环境没配齐搜索热词里高频出现的“vmware workstation pro 17.6.4 压缩失败”、“ubuntu 22.04 fstrim no space left on device”背后90%是以下三个环节之一断裂宿主机层面Windows Defender实时防护有时会锁定.vmdk文件导致VMware无法写入收缩后的数据VMware层面虚拟机未关机仅暂停不行或VMware Tools版本过旧低于12.0.0无法正确传递TRIM信号Ubuntu层面fstrim命令权限不足没加sudo或目标分区被其他进程占用如rsync正在备份导致TRIM被拒绝。这三个环节像一条锁链断一环整个瘦身流程就卡死。下面章节将逐个击破。3. 实操五步法从关机到瘦身完成全程可控3.1 第一步关机前的Ubuntu端预处理2分钟这一步必须在Ubuntu系统内完成且必须在关机前执行。很多人习惯关机后直接进VMware操作结果发现所有努力白费——因为关机后Ubuntu不再响应任何TRIM请求。更新系统并安装必要工具确保环境干净sudo apt update sudo apt upgrade -y # 检查fstrim是否可用Ubuntu 18.04默认自带 which fstrim # 如果提示未找到安装sudo apt install util-linux确认根分区挂载参数含discard# 查看当前挂载选项 findmnt -t ext4 # 输出类似/dev/sda1 / ext4 rw,relatime,errorsremount-ro,discard 0 1 # 关键看最后有没有discard如果没有discard需临时添加重启后失效安全sudo mount -o remount,discard / # 验证是否生效 findmnt -t ext4 | grep discard执行TRIM并观察反馈# 对所有支持TRIM的挂载点执行-v显示详细过程 sudo fstrim -av # 正常输出类似 # /: 12.3 GiB (13212053504 bytes) were trimmed # /home: 8.7 GiB (9342120960 bytes) were trimmed # 如果输出no space left on device说明有进程占用跳到3.4节排查实操心得我曾遇到一次fstrim返回0字节修剪查了半天发现是/tmp挂载在内存tmpfs上而fstrim默认会遍历所有挂载点。解决方案是显式指定根分区sudo fstrim -v /。另外fstrim执行时Ubuntu界面会轻微卡顿1-2秒这是正常现象不必中断。3.2 第二步VMware侧关键配置检查1分钟这一步在宿主机Windows上操作确保VMware能“听懂”Ubuntu的TRIM信号。确认VMware Tools已安装且为最新版在Ubuntu中打开终端运行vmware-toolbox-cmd -v输出应为12.x.x或更高Workstation Pro 17.6.4对应Tools 12.3.0。如果版本过低如10.x在VMware菜单栏点击“虚拟机” → “重新安装VMware Tools”按提示完成安装。检查虚拟SCSI控制器类型关闭Ubuntu虚拟机不是暂停必须完全关机。右键虚拟机 → “设置” → “硬件” → “SCSI控制器”。确保“SCSI控制器类型”为LSI Logic SAS这是唯一支持TRIM的类型。如果显示“LSI Logic Parallel”或“BusLogic”请更改为SAS并保存。关闭Windows Defender实时防护临时WinR输入windowsdefender://settings进入“病毒和威胁防护”。点击“管理设置” → 关闭“实时保护”仅本次瘦身操作期间关闭完成后记得打开。提示此步骤针对Win10/11系统。若用第三方杀软如火绒、360需在设置中将.vmdk所在文件夹加入信任区。3.3 第三步执行VMware端收缩1分钟此时虚拟机已关机所有前置条件就绪收缩操作本身极快。右键虚拟机 → “管理” → “清理磁盘”注意不是“压缩磁盘”这是Workstation Pro 17新增的专用功能专为TRIM设计。旧版16.x用户请用“虚拟机” → “设置” → “硬盘” → “压缩”但效果有限推荐升级。等待进度条完成正常情况10-30秒内结束。状态栏显示“正在清理磁盘...已完成”。如果卡在“正在扫描磁盘”超过2分钟说明Ubuntu端TRIM未成功返回3.1节复查。验证收缩效果在Windows资源管理器中定位到虚拟机文件夹如C:\VM\Ubuntu22\查看Ubuntu22.vmdk和Ubuntu22-s001.vmdk等文件大小。对比瘦身前大小通常可减少20%-40%取决于之前删除的数据量。例如原52GB的.vmdk瘦身后变为38GB。实操心得我测试过一个22.04桌面版虚拟机安装了VS Code、Docker和几个Python项目初始.vmdk为47.2GB。执行上述流程后收缩至31.8GB节省15.4GB。关键不是数字而是这个过程稳定、可复现——只要Ubuntu端TRIM成功VMware端几乎100%成功。3.4 第四步常见报错直击与绕过方案针对性解决当流程卡住时别盲目重试。以下是我在7个不同环境复现并解决的典型错误错误现象根本原因解决方案验证方式fstrim: /: FITRIM ioctl failed: Operation not supportedUbuntu未启用discard挂载选项执行sudo mount -o remount,discard /后重试findmnt -t ext4 | grep discard返回非空fstrim: /: FITRIM ioctl failed: No space left on device其他进程如rsync、backup正占用根分区sudo lsof D /查看占用进程sudo kill -9 PID终止fstrim -v /返回修剪字节数VMware“清理磁盘”按钮灰色不可点虚拟机未完全关机处于暂停或休眠状态右键虚拟机 → “电源” → “关闭客户机”等待Ubuntu彻底黑屏Windows任务管理器中无vmware-vmx.exe进程清理后.vmdk大小不变VMware Tools版本过低12.0.0卸载旧Toolssudo vmware-uninstall-tools.pl再重新安装vmware-toolbox-cmd -v显示≥12.0.0清理过程中报错“Failed to shrink disk: The disk is locked”Windows Defender或杀软锁定.vmdk文件临时关闭实时防护或将虚拟机文件夹加入杀软信任列表再次尝试“清理磁盘”进度条正常流动注意表格中“验证方式”是必须执行的闭环检查。我见过太多人只看报错就换方案结果新方案同样失败——因为根本原因没变。比如No space left on device错误有人直接去删Ubuntu里的大文件却没发现是apt缓存进程在后台运行删完文件照样报错。3.5 第五步长效保持策略1分钟建立习惯瘦身不是一次性任务而是需要融入日常维护的习惯。否则一个月后又回到起点。启用Ubuntu自动TRIM每天凌晨自动执行# 启用systemd timerUbuntu 20.04默认已启用但需确认 sudo systemctl enable fstrim.timer sudo systemctl start fstrim.timer # 查看状态sudo systemctl status fstrim.timer在VMware中设置“挂起而非关机”平衡效率与空间菜单栏“编辑” → “首选项” → “电源” → 勾选“挂起虚拟机时保存状态到磁盘”。这样日常使用时点“挂起”下次启动快真正需要瘦身时再“关机”执行TRIM清理。定期清理Ubuntu无用包预防性瘦身# 清理旧内核Ubuntu桌面版易堆积 sudo apt autoremove --purge # 清理apt缓存不删已安装包只删下载包 sudo apt clean个人体会自从设置了自动TRIM我的主力Ubuntu虚拟机每月只需手动清理一次。而且现在养成习惯每次卸载大型软件如PyCharm、Docker镜像后顺手敲一行sudo fstrim -v /就像关机前关灯一样自然。这比月底集中“大扫除”省心多了。4. 深度避坑指南那些文档里不会写的实战细节4.1 精简置备磁盘从源头规避瘦身难题如果你的新虚拟机还没创建强烈建议直接选“精简置备”。它虽在首次写入时略慢需动态分配空间但换来的是真正的“用多少占多少”。创建步骤新建虚拟机向导中到“磁盘”步骤 → “创建新虚拟磁盘” → 点击“高级” → 将“磁盘类型”从默认的“厚置备延迟置零”改为“精简置备”。完成后在Ubuntu中启用discard挂载选项同3.1节后续所有空间释放都会实时反映在.vmdk文件大小上。实测对比同一Ubuntu 22.04系统厚置备磁盘从50GB减到38GB需手动清理精简置备磁盘在sudo fstrim -v /后.vmdk文件大小1秒内自动缩小无需VMware任何操作。唯一的代价是精简置备磁盘在宿主机SSD上可能产生更多碎片但对现代SSD影响微乎其微。4.2 当“清理磁盘”彻底失效终极手动方案极少数情况下如虚拟机曾异常关机、.vmdk文件损坏VMware的图形化清理会失败。此时需祭出命令行大法但务必谨慎确保虚拟机关机备份.vmdk文件此操作有风险跳过备份等于裸奔。使用VMware自带的vmware-vdiskmanager工具位于Workstation安装目录如C:\Program Files (x86)\VMware\VMware Workstation\# 以管理员身份运行CMD进入该目录 cd C:\Program Files (x86)\VMware\VMware Workstation # 执行磁盘整理注意此命令仅对厚置备磁盘有效且会重写整个.vmdk vmware-vdiskmanager -k D:\VM\Ubuntu22\Ubuntu22.vmdk-k参数表示“收缩”shrink它会读取.vmdk元数据识别出所有未使用的块并将其置零后压缩。执行时间取决于磁盘大小50GB磁盘约需5-10分钟期间CPU占用高勿中断。验证结果完成后检查.vmdk大小通常比图形化清理更彻底因它不依赖TRIM而是直接扫描元数据。警告vmware-vdiskmanager -k会修改原始.vmdk文件且无法撤销。我只在两种场景下用它一是VMware图形界面反复失败二是需要将厚置备磁盘转为精简置备此时用-d参数转换但需额外空间。日常维护绝不推荐。4.3 多磁盘虚拟机的瘦身逻辑很多用户为Ubuntu分配了多个虚拟磁盘如单独的/data盘这时瘦身需分盘操作Ubuntu端fstrim默认只处理根分区/。若/data挂载在/dev/sdb1需显式执行sudo fstrim -v /data。VMware端每个.vmdk文件需单独执行“清理磁盘”。右键虚拟机 → “设置” → 选择对应硬盘 → 点击“清理”按钮。顺序无关可同时对多个磁盘执行清理VMware会串行处理。经验我管理的一个测试环境有3块磁盘系统盘、数据盘、日志盘每次瘦身前先在Ubuntu里fstrim -v / /data /var/log再在VMware里依次清理三个.vmdk。耗时增加不多但空间回收更彻底。4.4 宿主机空间不足时的应急处理当宿主机C盘只剩5GB而Ubuntu.vmdk有40GB却无法收缩常规流程会失败。此时可临时迁移虚拟机到其他盘关机 → 右键虚拟机 → “管理” → “更改虚拟机位置” → 选择D盘或E盘路径。迁移后在新位置执行完整瘦身流程3.1-3.3节。瘦身后再迁回C盘此时.vmdk已变小空间足够。利用VMware快照清理冗余数据如果虚拟机有多个快照它们会占用大量空间且阻碍收缩。删除所有不需要的快照右键虚拟机 → “快照” → “快照管理器” → 选中 → “删除”。删除后VMware会自动合并快照数据有时能释放可观空间再执行TRIM清理。提示快照删除是不可逆操作删除前确保当前状态稳定。我曾靠删除一个3个月前的快照直接腾出12GB空间比TRIM还快。5. 常见问题速查表5秒定位30秒解决以下问题均来自真实用户提问CSDN、V2EX、Reddit按发生频率排序附带一句话解决方案问题一句话解决方案补充说明“清理磁盘”按钮是灰色的确认虚拟机已完全关机不是暂停状态暂停状态下VMware无法访问.vmdk底层结构fstrim提示“Operation not permitted”在Ubuntu中执行sudo fstrim -v /必须加sudo普通用户无权执行TRIM ioctl瘦身前后.vmdk大小完全一样检查VMware Tools版本必须≥12.0.0旧版Tools无法传递TRIM信号到宿主机Ubuntu启动后黑屏只有光标临时禁用3D加速VMware设置 → “显示器” → 取消勾选“加速3D图形”TRIM操作偶尔触发显卡驱动兼容性问题重启后恢复清理后Ubuntu启动变慢重启宿主机Windows清除VMware缓存Windows文件系统缓存可能未及时刷新fstrim执行后Ubuntu变卡顿运行sudo systemctl restart apport关闭错误报告服务Ubuntu的apport服务在TRIM后可能异常活跃精简置备磁盘没变小检查Ubuntu挂载选项是否含discard并执行sudo fstrim -v /精简置备依赖Guest OS主动通知非自动行为VMware提示“磁盘已锁定”退出所有杀毒软件或以管理员身份运行VMware Workstation杀软常将.vmdk视为可疑文件并加锁fstrim返回0字节但明显删过文件运行df -h确认删除的文件确实在/分区而非/home等子挂载点fstrim -v /只处理根分区其他分区需单独指定清理后Windows资源管理器不刷新大小按F5刷新或重启资源管理器进程CtrlShiftEsc → 重启explorer.exeWindows文件系统缓存延迟导致显示滞后最后一个小技巧如果你经常需要对比瘦身效果可以在Windows中创建一个批处理文件自动计算前后大小差echo off set vmdk_pathC:\VM\Ubuntu22\Ubuntu22.vmdk for %%A in (%vmdk_path%) do set before%%~zA echo 瘦身前大小%before% 字节 pause :: 执行瘦身操作后 for %%A in (%vmdk_path%) do set after%%~zA echo 瘦身后大小%after% 字节 set /a saved%before% - %after% echo 节省空间%saved% 字节 pause把它放在虚拟机文件夹里每次瘦身前后双击运行省去手动计算。我在实际使用中发现最可靠的瘦身节奏是每周五下午花3分钟执行sudo fstrim -v /每月1号关机后执行VMware“清理磁盘”。这样既避免了空间突然告急的狼狈又不用天天折腾。虚拟机本该是工具而不是负担——当你能轻松掌控它的体积才算真正驯服了它。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进