Linux虚拟机磁盘容量不足?简单几步完成扩容!
适用场景:VMware Workstation / Player + Ubuntu(传统分区) · 面向有一定 Linux 基础的读者
虚拟机跑着跑着,突然一条 No space left on device 糊在脸上;df -h 一看,根分区赫然 100%。删缓存、清日志只能续命几天,治标不治本。其实给虚拟机扩容并不需要重装系统,全程三步就能搞定。本文带你走一遍完整流程。
一、先搞清楚:扩容为什么要分三步
很多人第一次扩容会踩这样的坑:在 VMware 里把磁盘从 20G 改成 40G,重启进系统一看,df -h 还是 20G,以为失败了。
原因在于,虚拟机里的磁盘空间其实是三层嵌套的结构,你只改了最外面一层,里面两层并不会自动跟着变大。所以完整的扩容动作也对应三步,缺一不可:
记住这张图,后面每一步你都知道自己在操作哪一层,排错时也不会抓瞎。
二、动手之前的准备工作
扩容本身很安全,但下面这几条准备能帮你避开 90% 的翻车现场:
⚠️ 关键:先删快照,再关机如果虚拟机存在快照(Snapshot),VMware 里"扩展磁盘"的按钮会是灰色不可点的。这是新手最常见的卡点。请先在“虚拟机 → 快照 → 快照管理器”里删除所有快照,再进行下一步。
准备清单:
- 关闭虚拟机:必须是完全关机(Power Off),挂起(Suspend)状态不行。
- 删除全部快照
- 确认磁盘不是"独立/非持久"模式
- 做个备份:正常操作不会丢数据,但重要虚拟机建议先复制一份 .vmdk 目录,图个安心。
三、第一步:在 VMware 里扩大磁盘
这一步操作的是最外层的虚拟磁盘文件,全程在图形界面完成:
- 选中该虚拟机,点击 「编辑虚拟机设置」(Edit virtual machine settings)。
- 在「硬件」列表中选中 「硬盘 (Hard Disk)」。
- 右侧点击 「扩展 (Expand)」,在弹框里填入新的磁盘大小(例如从 20 改为 40 GB),确认。
💡 提示VMware 弹框里通常会写一句:扩展磁盘容量后,还需要在客户机操作系统里对分区和文件系统进行扩展。—— 这正是我们下面第二、三步要做的事,VMware 自己并不会帮你做。
现在开机进入 Ubuntu。此时用 lsblk 查看,会发现磁盘 sda 已经变大,但分区 sda3 还是原来的大小,后面多出一块未分配空间:
$ lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 40G 0 disk ← 磁盘已经是 40G├─sda1 8:1 0 1M 0 part ├─sda2 8:2 0 2G 0 part /boot └─sda3 8:3 0 18G 0 part / ← 分区还停在 18G
- 要扩容的分区号:根分区
/ 挂在 sda3,所以分区号是 3。 - 再用
df -hT / 确认文件系统类型是 ext4(决定第三步用哪个命令)。
$ df -hT /Filesystem Type Size Used Avail Use% Mounted on /dev/sda3 ext4 18G 17G 0.5G 98% /← 类型 ext4,用量已 98%
四、第二步:用 growpart 扩展分区
growpart 能在分区已挂载、系统在线运行的状态下,安全地把分区边界推到磁盘末尾,无需卸载或进入 LiveCD。它由 cloud-guest-utils 包提供,默认可能没装:
# 安装 growpart(若提示 command not found)
$ sudo apt update
$ sudo apt install -y cloud-guest-utils
然后执行扩容。注意语法:磁盘设备和分区号是两个用空格分开的参数,不要用 /dev/sda3 这种写法:
# 格式: sudo growpart <磁盘设备> <分区号>$ sudo growpart /dev/sda 3CHANGED: partition=3 start=4198400 old: size=37746688 new: size=79693824
⚠️ 最容易写错的一行是 growpart /dev/sda 3(设备 + 空格 + 分区号),不是growpart /dev/sda3。写成后者会报 unexpected number of partitions 之类的错误。
再看一眼 lsblk,分区 sda3 已经变成 40G 附近了。但此时 df -h 里的可用空间还没变——因为文件系统还没跟上,这就是最后一步的事。
五、第三步:用 resize2fs 扩展文件系统
对 ext2/ext3/ext4 文件系统,用 resize2fs 把文件系统撑满整个分区。同样支持在线扩容,不用卸载:
# 参数是分区,不是磁盘$ sudo resize2fs /dev/sda3resize2fs 1.46.5 (30-Dec-2021) Filesystem at /dev/sda3 is mounted on /; on-line resizing required The filesystem on /dev/sda3 is now 9961728 (4k) blocks long.
💡 如果你的文件系统是 xfsUbuntu 默认是 ext4,但如果第一步 df -hT 显示类型是 xfs,就不能用 resize2fs,改用 xfs_growfs,且参数是挂载点而非分区:sudo xfs_growfs /
最后验证成果:
$ df -h /Filesystem Size Used Avail Use% Mounted on /dev/sda3 39G 17G 21G 45% /← 40G 到位,可用空间回来了
看到 Size 变大、Use% 降下来,扩容就彻底完成了。整个过程不用重启、不用重装、数据零丢失。
六、常见坑与排错清单
| |
|---|
| 存在快照,或磁盘为独立模式。删除全部快照、改回持久模式后重试。 |
| 只做了第一步。继续执行 growpart + resize2fs 这两步。 |
growpart 报 command not found | 没装工具:sudo apt install cloud-guest-utils。 |
growpart 报 unexpected number 等错 | 语法写错。正确是 growpart /dev/sda 3,设备与分区号之间要有空格。 |
| 分区后面没有空闲空间。确认第一步 VMware 磁盘确实已扩大,且开机后 lsblk 里 sda 已变大。 |
resize2fs 报 bad magic number | 文件系统不是 ext 系。八成是 xfs,改用 xfs_growfs /。 |
| growpart 只能向后吃相邻的空闲空间。若目标分区后面还有别的分区,需借助 parted/gparted 调整,操作前务必备份。 |
七、三条命令速查
确认好设备名和分区号后,核心其实就这三步(以根分区在 /dev/sda3、文件系统 ext4 为例):
▍扩容三连
# 0. VMware 里先把磁盘调大并开机,然后:
# 1. 装工具(已装可跳过)sudo apt install -y cloud-guest-utils
# 2. 扩分区(设备 空格 分区号)sudo growpart /dev/sda 3
# 3. 扩文件系统(ext4); sudo resize2fs /dev/sda3
# 4. 验证df -h /
把设备名(/dev/sda)和分区号(3)换成你自己 lsblk 里看到的值即可。收藏这篇,下次磁盘再告急,三分钟搞定。
本文流程适用于 VMware + Ubuntu 传统分区(MBR/GPT 普通分区)场景。