当前位置: 首页 > news >正文

VMware Ubuntu虚拟机磁盘扩容与空间回收完整指南

1. 问题场景:当你的Ubuntu虚拟机开始“报警”

如果你和我一样,长期在VMware Workstation里跑Ubuntu虚拟机做开发、测试或者学习,那么迟早会遇到这两个让人头疼的问题:虚拟机内部空间告急,以及宿主机上那个巨大的.vmdk文件只增不减。前者让你在虚拟机里装个新软件都战战兢兢,后者则让你的宿主机C盘或D盘日渐“消瘦”,最终可能连宿主机系统都运行不畅。

这其实是两个相互关联但又独立的问题。虚拟机内部空间不足,通常是因为当初分配磁盘时过于“保守”,随着系统更新、软件安装、日志累积,初始的20GB或40GB很快就不够用了。而宿主机存储占用越来越多,根源往往在于虚拟机磁盘文件的“膨胀”机制——默认的动态分配磁盘(Thin Provisioned)虽然创建时很小,但会随着虚拟机使用而不断增长,并且几乎不会自动缩减。更棘手的是,即使你在虚拟机内部删除了大量文件,这个.vmdk文件在宿主机上依然“巍然不动”,占着茅坑不拉屎。

我最近就刚处理完一台用于深度学习环境搭建的Ubuntu 22.04虚拟机。初始给了80GB,结果几个大型数据集和conda环境一下来,直接爆满。更离谱的是,我在虚拟机里删了30GB的临时数据,宿主机上对应的vmdk文件大小丝毫未减,白白浪费了宝贵的SSD空间。接下来,我就把解决这两个问题的完整思路和实操步骤,毫无保留地分享给你。整个过程会涉及虚拟机内部的磁盘扩容、文件系统调整,以及宿主机层面的磁盘空间回收,需要你仔细操作,但跟着做一定能成功。

2. 核心策略:分而治之,先内后外

面对这两个问题,最忌讳的就是眉毛胡子一把抓。我们必须采用“分而治之”的策略,并且遵循“先解决虚拟机内部空间,再清理宿主机占用”的顺序。这个顺序非常重要,原因在于:宿主机磁盘空间的回收,其有效性和安全性,高度依赖于虚拟机内部文件系统的状态。如果你先尝试在宿主机压缩vmdk,但虚拟机内部的文件系统依然是碎片化的、或者已删除文件的空间未被有效释放,那么压缩操作要么失败,要么效果甚微。

所以,我们的行动路线图非常清晰:

  1. 阶段一:为Ubuntu虚拟机扩容。这是解决“内部空间不足”的根本方法。我们需要在VMware层面扩大虚拟磁盘的“物理”容量,然后在Ubuntu内部,让操作系统识别并利用这部分新增的空间。
  2. 阶段二:为宿主机释放空间。这是在解决内部需求后,对宿主机资源的优化。我们需要在虚拟机内部进行“擦除”操作,然后在VMware层面进行磁盘压缩,让.vmdk文件瘦身。

注意:在进行任何磁盘操作前,务必为你的虚拟机创建一个完整的快照。这是你的“后悔药”,万一操作失误,可以瞬间回滚到安全状态。在VMware中,右键点击虚拟机 -> 快照 -> 拍摄快照,取个易懂的名字,比如“Pre-Disk-Operation”。

3. 实战第一步:为Ubuntu虚拟机扩容详解

扩容听起来有点吓人,但其实VMware和Linux的工具链对此支持得非常成熟。我们把它拆解成三个子步骤:VMware中扩大虚拟磁盘、Ubuntu内识别新空间、最后调整分区和文件系统。

3.1 在VMware中扩展虚拟磁盘容量

首先,你需要完全关闭Ubuntu虚拟机,不仅仅是休眠。然后,在VMware Workstation的虚拟机库列表中,右键点击目标虚拟机,选择“设置”。

  1. 定位硬盘:在硬件标签页,找到“硬盘(SCSI)”。你会看到当前磁盘的容量,例如“80 GB”。
  2. 扩展磁盘:点击右下角的“扩展”按钮(如果按钮是灰色的,请检查虚拟机是否已关闭,并且该磁盘是否被快照依赖。独立磁盘或链接克隆可能无法扩展)。在弹出的窗口中,输入你希望扩容到的总大小,比如从80GB扩展到120GB。这意味着我们将增加40GB的空间。
  3. 理解限制:VMware Workstation有单个虚拟磁盘2TB的限制,但对于绝大多数用户这都绰绰有余。点击“扩展”后,VMware会开始一个后台任务。这个过程很快,它只是在虚拟磁盘文件的元数据中标记了新的最大容量,并没有立即向宿主机申请120GB的物理空间,宿主机上的.vmdk文件大小暂时不会变。

至此,虚拟机的“硬件”磁盘已经变大了。但Ubuntu系统现在还完全不知道这回事,就像给电脑换了一块更大的硬盘,但还没分区格式化一样。

3.2 在Ubuntu中让系统识别扩容后的磁盘

启动你的Ubuntu虚拟机。我们需要使用Linux下的“瑞士军刀”——fdiskparted工具来查看和操作磁盘。

打开终端,首先查看磁盘情况:

sudo fdisk -l

或者用lsblk命令看得更直观:

lsblk

你会看到类似如下的输出:

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 120G 0 disk ├─sda1 8:1 0 1M 0 part ├─sda2 8:2 0 2G 0 part /boot └─sda3 8:3 0 78G 0 part /

注意sda磁盘的总大小已经变成了120G,但下面的分区sda3(通常是你的根分区)大小还是78G。这40G的未分配空间就是我们刚扩容出来的,目前处于“游离”状态。

接下来,我们需要使用parted工具来调整分区表,将这未分配空间合并到现有分区中。parted支持在线调整,比古老的fdisk更友好。

sudo parted /dev/sda

进入parted交互界面后,输入print free来确认未分配空间的位置。你会看到在某个分区后面有一段“Free Space”。假设我们要扩展sda3分区。

  1. 输入resizepart 3(这里的3是分区编号,对应sda3)。
  2. 它会询问结束位置。不要直接输入数字,输入100%,表示将这个分区扩展到占用所有剩余空间。
  3. 输入quit退出parted。

实操心得:使用100%是最安全的方式,避免了手动计算扇区的麻烦和出错风险。parted会自动计算最大可用空间。

3.3 调整文件系统以占用新增空间

分区调整好了,但文件系统(比如ext4)还不知道自己“地盘”变大了。我们需要“通知”文件系统去占据新地盘。

首先,再次用lsblk确认sda3分区的大小已经变成了118G(120G减去sda1和sda2的占用)。然后,针对ext4文件系统,使用resize2fs命令:

sudo resize2fs /dev/sda3

这个命令会检查/dev/sda3分区上的ext4文件系统,并将其扩展到填满整个分区。过程是联机进行的,无需卸载分区或进入救援模式,非常方便。

完成后,使用df -h命令检查,你应该会看到根目录/的可用空间大大增加了。

为什么选择ext4和resize2fs?在Linux桌面环境中,ext4是默认且最稳定的选择。resize2fs是专门用于调整ext2/3/4文件系统大小的工具,其在线扩展功能非常可靠。相比之下,XFS等文件系统虽然也有在线扩展能力,但操作命令不同(xfs_growfs),且收缩操作非常复杂。对于虚拟机扩容这种几乎只增不减的场景,ext4+resize2fs的组合是最简单直接的。

4. 实战第二步:为宿主机回收磁盘空间

虚拟机内部宽敞了,但宿主机上那个庞然大物般的.vmdk文件还在。我们的目标是让它“瘦身”。这需要虚拟机内部和VMware工具配合完成。

4.1 在Ubuntu虚拟机内部“准备”可回收空间

VMware的磁盘压缩工具很“笨”,它只能识别并压缩那些被虚拟机系统标记为“全零”的磁盘块。如果你只是简单地删除文件,这些磁盘块上原有的数据还在,只是文件系统标记它们为“可用”而已。因此,我们需要主动用零去填充这些空闲空间,制造出大片的“可压缩”区域。

核心命令是zerofree,但操作有门槛。

zerofree是一个强大的工具,它会遍历文件系统的空闲块并将其写零。但它必须在文件系统未被挂载(只读挂载也不行)的情况下运行。这意味着我们不能在正常运行的系统中执行它。

标准操作流程是:

  1. 重启虚拟机,在GRUB引导界面,选择“高级选项”,进入“恢复模式”。
  2. 在恢复模式菜单中,选择“root - Drop to root shell prompt”。
  3. 此时,根文件系统是以只读方式挂载的。我们需要将其重新挂载为只读(确保无写入),然后运行zerofree
mount -o remount,ro / zerofree -v /dev/sda3

-v参数用于显示进度。这个过程取决于磁盘速度和空闲空间大小,可能需要一段时间。

然而,这里有一个巨大的坑:新版本的Ubuntu(例如20.04之后)的恢复模式,其根文件系统可能是一个RAM disk(initrd),而并非真正的物理磁盘。你在恢复模式下执行zerofree,可能是在对内存盘操作,完全无效!这是我踩过的最大的坑。

更可靠的替代方案:使用Live CD/USB。

  1. 从Ubuntu官网下载一个与虚拟机内系统版本相同或相近的ISO镜像。
  2. 在VMware中,编辑虚拟机设置,将该ISO文件挂载到虚拟光驱,并设置从光驱启动。
  3. 启动虚拟机,进入Ubuntu Live桌面环境(选择“Try Ubuntu”)。
  4. 打开终端,安装zerofree工具(Live环境通常没有):
sudo apt update sudo apt install zerofree -y
  1. 使用sudo fdisk -llsblk确认你的根分区设备名(例如/dev/sda3)。务必确认无误!在Live环境中,你的硬盘分区可能不会被自动挂载,这正好。
  2. 运行zerofree
sudo zerofree -v /dev/sda3

为什么不用ddcat /dev/zero填充空闲空间?理论上可以,例如创建一个大文件:sudo dd if=/dev/zero of=/zero.file bs=1M,直到磁盘写满,再删除它。但这有两个问题:第一,你需要有root权限在根目录创建巨型文件;第二,更关键的是,你必须在文件系统挂载状态下操作,这可能导致系统缓存、日志等后台进程同时写入,你无法保证填充完成后,那些“空闲块”真的被零覆盖了。而zerofree在文件系统未挂载时工作,能保证原子性和彻底性。

4.2 在VMware中执行磁盘压缩

zerofree运行完毕后,关闭Live CD环境,重启虚拟机,正常进入你的Ubuntu系统。

现在,进行最关键的一步:在宿主机上压缩虚拟磁盘。

  1. 再次完全关闭Ubuntu虚拟机
  2. 在VMware Workstation中,右键点击该虚拟机 -> 管理 -> 清理磁盘。或者,在虚拟机设置 -> 硬盘 -> 碎片整理(这步可选,但建议做)-> 压缩。
  3. VMware会弹出一个对话框,显示预计可回收的空间。点击“是”或“压缩”。

这个过程,VMware会读取.vmdk文件,寻找那些全是零的块,并将它们从文件中剔除,从而减小物理文件的大小。压缩时间取决于磁盘文件大小和可回收空间多少。

压缩效果验证:完成后,去宿主机上找到你的.vmdk文件,查看其属性。你会发现它明显变小了,可能从之前的120GB(预分配最大值)缩减到了实际数据占用的80GB甚至更少。

重要警告:“清理磁盘”和“压缩”操作,对于“厚置备延迟清零”或“厚置备立即清零”的磁盘是无效的。这两种格式在创建时就在宿主机上占满了你分配的所有空间。VMware的压缩功能仅对“动态分配”(Thin Provisioned)的磁盘有效。你可以在虚拟机设置的硬盘摘要中查看磁盘类型。

5. 深度解析:问题根源与长效管理机制

解决了眼前的问题,我们更需要理解其根源,并建立长效管理机制,避免问题反复发生。

5.1 动态磁盘(Thin Provision)的工作原理与陷阱

VMware默认使用“动态分配”磁盘,这是一个“用多少,占多少”的聪明设计。但它有一个关键特性:只增不减。虚拟机操作系统写入新数据,vmdk文件就增长;操作系统删除数据,vmdk文件大小不变。这是因为从虚拟机内部看是“删除”,但从宿主机硬盘的物理扇区角度看,那些数据依然存在,只是被标记为“可覆盖”。VMware无法智能判断哪些块是“可安全丢弃”的,除非你明确地用零去覆盖它们(这就是zerofree的作用)。

这种机制导致了空间占用只升不降的假象。很多人误以为虚拟机“吃空间”,其实是管理策略使然。

5.2 除了扩容和压缩,还有哪些空间管理技巧?

  1. 日志管理:Linux系统日志(/var/log)是空间杀手。定期清理旧的日志文件。
    # 查看日志目录大小 sudo du -sh /var/log/ # 使用logrotate工具管理,或手动清理(谨慎!) sudo journalctl --vacuum-time=7d # 清理7天前的系统日志
  2. 包缓存清理:APT包管理器会缓存下载的.deb包(/var/cache/apt/archives)。
    sudo apt clean # 清理所有缓存包 sudo apt autoclean # 只清理过时的缓存包
  3. Docker/容器镜像:如果你用Docker,它的镜像和容器数据默认在/var/lib/docker,非常占空间。定期清理无用的镜像、容器和卷。
    docker system prune -a --volumes
  4. 用户缓存:用户主目录下的.cache文件夹(如~/.cache/pip,~/.cache/mozilla等)也可能很大。
  5. 使用LVM(逻辑卷管理):在初始安装Ubuntu时选择LVM分区方案。这样未来扩容时,你只需要在VMware扩展磁盘,然后在LVM层面添加物理卷、扩展卷组和逻辑卷即可,无需调整主分区,更加灵活和安全。

5.3 厚置备与动态分配的终极选择

如果你受够了动态磁盘的“虚胖”和定期压缩的麻烦,并且宿主机硬盘空间充足,可以考虑在创建新虚拟机时选择“厚置备”磁盘。

  • 厚置备延迟清零:创建时立即占用全部宿主机空间,但只在实际写入数据时才进行清零操作。性能较好,空间一次到位。
  • 厚置备立即清零:创建时立即占用并清零全部空间,耗时最长,但安全性最高,且后续无需压缩。

厚置备磁盘的缺点是初始占用大,但好处是空间管理简单明了,宿主机上看到多大就是多大,没有“压缩”这个概念。对于生产环境或追求性能稳定、厌恶复杂维护的开发者,厚置备是更省心的选择。你可以将旧的动态磁盘通过VMware的“转换”功能(编辑设置 -> 硬盘 -> 实用程序 -> 转换)改为厚置备,但这过程同样需要大量空闲磁盘空间和时间。

6. 高阶排错:当扩容与压缩遇到意外时

即使按照步骤操作,也可能遇到意外。这里分享几个我遇到过的典型问题及解决方案。

6.1 扩容后,parted中看不到未分配空间?

这种情况通常发生在磁盘使用的是MBR分区表,并且4个主分区槽位已满时。MBR分区表只支持最多4个主分区,或者3个主分区+1个扩展分区(内含多个逻辑分区)。用sudo fdisk -l查看,如果磁盘标识为Disklabel type: dos,就是MBR。

解决方案:将分区表从MBR转换为GPT。这需要借助gdisk工具,并且操作有风险,务必先备份数据!

sudo apt install gdisk sudo gdisk /dev/sda

在gdisk交互界面,输入r进入恢复与转换菜单,然后输入g将磁盘转换为GPT格式。转换后,你需要重新创建引导(因为MBR和GPT的引导方式不同,Ubuntu通常使用GRUB2,支持GPT),这涉及修复UEFI引导或重新安装GRUB,过程较为复杂。因此,最佳实践是在创建虚拟机时就选择GPT分区表

6.2zerofree运行极慢或卡住?

zerofree的速度取决于磁盘的读写速度和需要写零的空闲块数量。如果它看起来卡住了:

  1. 耐心等待:对于机械硬盘或大容量SSD,处理上百GB的空闲空间可能需要数小时。-v参数输出的进度更新可能不频繁。
  2. 检查是否正确运行:在另一个终端(或宿主机上通过VMware控制台)使用sudo pkill -USR1 zerofree可以向zerofree进程发送信号,使其打印当前进度(如果它支持)。
  3. 替代方案:如果实在无法忍受,可以考虑在虚拟机内部,挂载一个临时分区,用ddfio工具进行写零填充,但这需要更精细的空间规划。

6.3 压缩后,宿主机空间释放不明显?

如果压缩效果远低于预期:

  1. 确认磁盘类型:再次确认虚拟磁盘是“动态分配”的,而不是“厚置备”的。
  2. 检查快照:虚拟机如果存在快照,压缩操作可能无法作用于快照链中的基础磁盘。尝试合并或删除不必要的旧快照后再压缩。
  3. zerofree可能未完全生效:确保你在文件系统未挂载(通过Live CD)的状态下运行了zerofree。在已挂载的系统里运行是无效的。
  4. 虚拟机内存交换文件:Linux的swap分区或swap文件,即使被zerofree写零,由于其内容本身是易变的,压缩效果也可能不持久。可以考虑在运行zerofree前先禁用swap:sudo swapoff -a,操作完成后再启用。

6.4 扩展分区时,resizepart失败报错?

如果parted提示无法调整分区,可能是因为该分区正在被系统核心进程使用,或者分区后面紧跟着另一个分区,没有连续的空闲空间。对于后者,你需要先使用partedmove命令移动后面的分区(极其危险,务必备份!),或者考虑使用LVM这种更灵活的卷管理方案。对于前者,确保你是在Live CD环境下对未挂载的分区进行操作。

处理虚拟机磁盘空间,本质上是一场在“便利性”和“可控性”之间的权衡。动态磁盘带来了存储的超分配和灵活性,但代价是需要定期的手动维护。而厚置备磁盘则用前期的空间占用换来了后期的管理 simplicity。我的个人经验是,对于开发测试环境,动态磁盘配合我上面介绍的定期清理和压缩流程,是完全可控的。我会在日历上设置一个季度提醒,检查主要虚拟机的磁盘使用情况,并执行一次“内部清理 -> 关机压缩”的例行维护。对于承载重要服务或需要极致稳定性的环境,我会在初期就分配足够的厚置备磁盘,一劳永逸。记住,无论哪种方式,定期备份和快照都是你数据安全最坚实的防线。

http://www.jsqmd.com/news/1311886/

相关文章:

  • Matlab随机数生成全解析:从基础用法到并行计算与性能优化
  • 实盘杠杆交易的风控引擎:动态保证金模型与压力测试的底层逻辑
  • Godot引擎VRM虚拟化身插件实战:从导入到高级控制全流程
  • Webots机器人仿真入门:从控制器原理到避障实践
  • CSharp: Iterator Pattern
  • Nginx平滑升级实战:零停机更新与高可用保障
  • 平湖市阳台漏水维修_2026浙北杭州湾北岸漏水维修攻略与收费标准 - 雨婺虹房屋维修
  • 终极指南:如何用Blue Topaz Obsidian主题打造你的专属知识管理系统
  • 2026 年现阶段拱墅正规的长期集装箱厂家联系电话,存十年的货居然用它?成本比租仓库省七成! - 品质体验官
  • KNN算法实战指南:从距离度量到调优技巧
  • 企业AI落地,为什么总在最后一步翻车?
  • Unity后处理实战:Color Grading调色全解析与性能优化指南
  • 30B开源模型登顶科研榜:揭秘AI科研助手部署与微调实战
  • Faster RCNN网络架构与训练全解析:从RPN原理到工程实践
  • 2026 年新发布:汝阳可靠的全自动地磅销售厂家有哪些,你还在手动核对货物重量?这玩意儿让仓库效率翻了三倍!-美衡地磅 - 企业推荐官【认证】
  • Source Han Serif CN 字体架构解析:7种字重TTF子集化方案的技术实现与性能优化
  • 从XSS订单劫持到BeEF反制:一次完整的Web安全攻防实战推演
  • GD32F450Z移植LittleFS:SPI Flash掉电保护与文件系统实战
  • 基于ESP32-P4的工业级嵌入式开发板:集成大屏、以太网与继电器控制
  • Ollama本地大模型部署指南:从安装到API集成实战
  • 树莓派Pico驱动2.7寸电子墨水屏:SPI通信与低功耗显示实战
  • Amphenol LTW RCP-5SAFFM-SLM7B01线束组件解析及国产替代应用探讨
  • 【单片机课程设计/毕业设计】基于 RC522 刷卡验证智能闸控停车系统设计 单片机驱动舵机模拟闸道停车计费系统开发(016501)
  • 2026年四川管道修复维护公司怎么选?有实力的企业推荐与选择指南 - 优质品牌商家
  • GD32W51x HPDF硬件滤波器配置与中断管理实战指南
  • 终极免费解锁Wand专业版:永久移除2小时限制的完整指南
  • 非标设备ERP选型:选卓力ERP的理由
  • 技术人如何用溯源、量化与验证思维甄别信息真伪
  • 电工证学习笔记(三)
  • 智谱AI Coding Agent推理工程实践:吞吐量提升132%的架构优化之道