一、为什么要写这篇文章?
在使用虚拟机进行开发、测试或学习的过程中,磁盘空间不足是几乎每个开发者都会遇到的问题。初始分配的 20GB、40GB 磁盘空间,随着系统更新、Docker 镜像堆积、项目文件增多,很快就会捉襟见肘。
很多同学在面对扩容问题时感到困惑:
- ✅ 虚拟机设置里扩展了磁盘,为什么
df -h看不到变化? - ❌ 扩容会不会丢失数据?
- ❌ 快照和扩容有什么关系?
二、概念
2.1 虚拟磁盘的两层结构
要理解扩容的本质,首先需要明白虚拟机磁盘的 "两层结构":
┌─────────────────────────────────────────────┐
│ 第一层:虚拟化层(Hypervisor) │
│ VMware / VirtualBox 管理的虚拟磁盘文件(.vmdk) │
│ ← 这一步是 "扩展物理边界" │
└─────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ 第二层:操作系统层(Guest OS) │
│ Ubuntu 的分区表和文件系统 │
│ ← 这一步是 "重新分区 & 扩容文件系统" │
└─────────────────────────────────────────────┘
关键认知:
- 在虚拟机设置中点击"扩展",只是增大了第一层的虚拟磁盘文件
- 必须进入操作系统内部,对第二层进行重新分区,才能让新空间生效
- 这就是为什么很多人扩展后用
df -h查看发现空间没变的原因!
2.2 扩容操作的三大阶段
| 阶段 | 操作位置 | 核心动作 | 风险等级 |
|---|---|---|---|
| 🟢 准备阶段 | 虚拟机管理界面 | 备份、清理快照 | 低 |
| 🟡 扩展阶段 | 虚拟机设置 → 硬盘 → 扩展 | 增大虚拟磁盘容量 | 中 |
| 🔵 分区阶段 | Ubuntu 系统内 | 重新分区、调整文件系统 | 中 |
三、前置准备
3.1 删除所有快照
快照(Snapshot) 是虚拟机在某个时间点的状态保存。扩容前必须删除所有快照,原因如下:
- 快照依赖的是差异磁盘(differential disk) 机制,扩容操作需要修改基础磁盘文件
- 存在快照时,扩容操作可能失败或导致快照数据损坏
- 某些虚拟化软件在存在快照时会直接禁用磁盘扩展选项
操作路径: 虚拟机菜单 → 快照管理器 → 选择所有快照 → 删除
3.2 完整备份(强烈建议!)
扩容操作虽然成熟可靠,但任何磁盘操作都存在风险,特别是:
- 第一次进行扩容操作
- 生产环境或包含重要数据的虚拟机
- 对 Linux 分区不熟悉的用户
推荐的备份方式:
bash
# 方式1:直接复制虚拟磁盘文件(需先关闭虚拟机)
cp my-vm.vmdk my-vm-backup.vmdk
# 方式2:使用虚拟机自带的克隆/导出功能
# VMware: 文件 → 导出为 OVF
# VirtualBox: 管理 → 克隆
💡 经验之谈:宁可备份了不用,也不要用的时候没有。这一步花费的时间,远低于数据丢失后恢复的成本。
四、实操步骤详解
步骤一:虚拟化层面扩展磁盘
以 VMware Workstation 为例(VirtualBox 类似):
-
关闭虚拟机(部分支持在线扩容,但建议关机操作更安全)
-
打开 虚拟机设置 → 硬盘(Hard Disk)
-
点击 "扩展(Expand)" 按钮
-
输入目标磁盘大小(例如从 40GB → 80GB)
-
点击确认,等待扩展完成
操作路径:
虚拟机 → 设置(Settings) → 硬盘(Hard Disk) →
→ 扩展(Expand) → 输入新大小 → 扩展(Expand)
扩展完成后,系统通常会弹出提示:
⚠️ 提示信息:"您需要在客户机操作系统中重新对磁盘进行分区,以利用新的磁盘空间。"
这个提示正是我们接下来要做的事情。
步骤二:验证当前状态
启动虚拟机,打开终端执行:
bash
df -h
此时会发现------磁盘大小还是原来的值! 这是正常现象。
原因回顾: 我们只完成了第一层的扩展,第二层的分区表还没有更新。新增的空间就像一个"未分配的房间",还没有被纳入文件系统的管理范围。
步骤三:Ubuntu 内重新分区(图形化方式)
这是让新空间生效的关键步骤!
方法 A:使用 GNOME Disks 工具(推荐 🌟)
这是 Ubuntu 自带的图形化磁盘管理工具,操作直观且安全:
- 打开 Ubuntu 的 活动概览(按 Super 键或点击左下角)
- 搜索 "Disks" 或中文 "磁盘"
- 打开 GNOME Disks 应用程序
在 Disks 界面中:
- 左侧选择需要扩容的虚拟硬盘设备 (通常显示为
/dev/sda) - 选择需要扩展的分区(通常是最后一个分区)
- 点击分区条目上的 齿轮图标 ⚙️
- 选择 "调整大小/Resize" 或 "调整分区大小"
- 拖动滑块到最大值(将圆球/滑块拖到最右侧,占用所有未分配空间)
- 点击 "Resize"(调整大小)按钮
- 等待操作完成
方法 B:使用命令行方式(进阶)
对于习惯终端操作的同学,也可以使用命令行完成:
bash
# 1. 安装 parted 工具(如果尚未安装)
sudo apt update && sudo apt install -y parted
# 2. 查看磁盘和分区情况
sudo parted /dev/sda print free
# 3. 使用 growpart 扩展分区(以扩展第1个分区的第1个分区为例)
sudo growpart /dev/sda 1
# 4. 扩展文件系统(ext4)
sudo resize2fs /dev/sda1
# 或者对于 LVM 逻辑卷
# sudo lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv
# sudo resize2fs /dev/ubuntu-vg/ubuntu-lv
步骤四:验证扩容结果
操作完成后,再次执行验证命令:
bash
df -h
预期输出示例:
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 75G 15G 56G 21% /
🎉 如果看到磁盘总容量已经变成设定的目标大小,说明扩容成功!









五、常见问题与排查指南(FAQ)
Q1:扩展选项是灰色的,无法点击?
可能原因及解决方案:
- ❌ 存在快照 → 先删除所有快照
- ❌ 虚拟机正在运行 → 关闭虚拟机后再操作
- ❌ 磁盘模式为"独立模式" → 更改磁盘模式设置
Q2:扩容后 df -h 还是没变?
检查清单:
- 是否完成了虚拟机设置中的"扩展"操作?→ 重新确认第一步
- 是否进入了 Ubuntu 并进行了分区调整?→ 执行步骤三
- 使用
sudo fdisk -l查看是否能看到更大的磁盘总量 → 如果能看到但分区没变,说明问题出在分区步骤
Q3:扩容过程报错怎么办?
- 错误类型: "Failed to extend the virtual disk"
- 解决方向: 检查宿主机磁盘是否有足够空间;尝试将虚拟机文件移动到空间充足的磁盘再操作
Q4:能否在线扩容(不关机)?
- VMware: 支持对 SCSI 控制器的磁盘进行热扩展,但分区调整仍需要在系统内操作
- VirtualBox: 一般需要关闭虚拟机后再进行磁盘扩展
- 建议: 无论哪种情况,关机操作更安全可靠
Q5:扩容有上限吗?
理论上限取决于:
- 宿主机可用磁盘空间
- 虚拟化软件的限制(一般可达数 TB)
- 文件系统的限制(ext4 单分区最大支持 1EB)
六、最佳实践与总结
✅ 推荐的操作流程图
┌─────────────┐
│ ① 备份虚拟机 │ ──→ 安全基石
└──────┬───────┘
↓
┌─────────────┐
│ ② 删除所有快照│ ──→ 解除依赖约束
└──────┬───────┘
↓
┌─────────────┐
│③ 虚拟机设置扩展│ ──→ 扩大物理边界
└──────┬───────┘
↓
┌─────────────┐
│④ 启动系统验证 │ ──→ df -h 确认现状
└──────┬───────┘
↓
┌──────────────┐
│⑤ GNOME Disks │ ──→ 重新分配分区
│ 调整分区大小 │
└──────┬───────┘
↓
┌─────────────┐
│⑥ 再次验证结果 │ ──-> 🎉 完成!
└─────────────┘
📝 总结要点
| 要点 | 说明 |
|---|---|
| 🔑 核心理解 | 扩容 = 虚拟层扩展 + OS 层重分区,缺一不可 |
| 🛡️ 安全第一 | 务必先备份,再操作 |
| 📸 快照清理 | 扩容前必须删除所有快照 |
| 🖥️ 工具选择 | 新手推荐 GNOME Disks 图形化工具 |
| ✅ 最终验证 | 用 df -h 确认扩容效果 |
写在最后
虚拟机磁盘扩容看似复杂,但只要理解了两层结构 的核心原理,按照正确的流程一步步操作,其实是一件非常可控且安全的事情。
如果在实际操作中遇到问题,欢迎在评论区留言交流~
适用环境:VMware Workstation / VirtualBox + Ubuntu 20.04/22.04/24.04
觉得有用的话,点个「在看」支持一下吧!关注我,获取更多运维开发实战干货 🚀