
写这篇博文之前我先把话撂这虚拟机磁盘扩容这个事你在网上能搜到一大堆教程但绝大多数都只告诉你“点这里、点那里”没人告诉你为什么会卡在某个地方也没人告诉你那些报错到底意味着什么。我这几年的经验是扩容本身也就五分钟的事真正花时间的是处理扩容后的各种幺蛾子。所以这篇不只是操作步骤我把我实际踩过的坑、修过的错一并摆出来。如果你在 VMware 或 VirtualBox 里装了 Ubuntu发现根分区快满了想扩磁盘却不敢动那这篇就是给你准备的。核心工具是 gparted目标是让 Ubuntu 虚拟机磁盘扩容这件事变得可控、可复现、出了问题也能自己排查。1. 先搞清楚一件事虚拟机扩容到底在扩哪一层很多人在这一步就懵了因为“扩容”这个词在不同的语境下指的东西完全不一样。你以为在虚拟机设置里把硬盘大小从 20G 改成 50G 就完事了结果开机一看系统里还是 20G于是到处找原因。原因其实很简单你只扩展了“虚拟硬盘”这个容器但容器里面的分区和文件系统还保持原样。1.1 磁盘扩容的三个层次我把这事拆开讲。虚拟机磁盘要真正变大需要经过三个层次的调整少一个都不行。第一层是虚拟磁盘层这一层的操作在宿主机上完成也就是给虚拟机这个“硬盘”扩大物理容量20G 变 50G。VMware 里叫“扩展磁盘容量”VirtualBox 里是通过 VBoxManage 命令修改。这一步做完虚拟机里lsblk能看到磁盘总容量变了但分区还是老样子。第二层是分区表层这一层的操作要在虚拟机内部完成核心就是调整分区大小。磁盘变大了但分区还占着原来的空间多出来的空间是“未分配”状态。比如/dev/sda3原来是 20G现在磁盘 50G你就得把/dev/sda3扩到 49G 左右剩下给 swap 或者其他用途。这一层就是 gparted 干的事。第三层是文件系统层分区扩大了但文件系统ext4、xfs 这些还要跟着扩展才能使用新增的空间。好消息是gparted 会自动帮你完成文件系统扩展坏消息是如果你用命令行工具比如fdisk只改了分区表没跑resize2fs那系统里依然看不到新空间。这三层的关系我用个生活类比来解释虚拟磁盘层就像你给房子扩建了地基分区表层是把房间的墙往外挪文件系统层是重新装修让房间真正能住人。三步都做完从外面到里面才算彻底变大了。1.2 为什么 gparted 是绕不开的主力工具Linux 下能调整分区的工具不少老的fdisk、parted都行但我个人强烈建议用 gparted尤其是对分区操作不熟的读者。原因很简单它把所有危险操作都变成了可视化操作你拖一拖、点一点就能完成而且每一步都有明确的图形反馈。gparted 底层调用的是libparted和文件系统工具比如e2fsprogs、xfsprogs但你不需要记那些复杂的命令行参数。更重要的是gparted 在做任何变更之前会生成一个操作列表你可以预先检查每一步操作确认无误再一次性执行这对避免误操作特别重要。命令行工具通常是一锤子买卖输错一个参数可能就把分区表搞坏了。另外 gparted 支持的文件系统类型非常广ext2/3/4、xfs、btrfs、ntfs、fat32 都能处理。如果你只操心 Ubuntu 的 ext4 分区gparted 绰绰有余如果你还有 ntfs 的数据盘要调整gparted Live 也能直接操作不用再装额外软件。1.3 三种扩容方案怎么选我把常见的扩容方案整理了一下大家可以根据自己的场景选择。方案适用场景优点缺点gparted Live ISO离线根分区已挂载无法在线卸载最安全分区可以完全卸载支持移动分区需要重启进 Live 环境在线安装 gpartedapt 安装非系统盘扩容或可卸载的分区不用重启直接在系统里操作根分区无法卸载时操作受限growpart resize2fs命令行远程服务器、无图形界面的云主机速度快无需重启适合自动化只支持扩展不支持移动分区对新手不友好如果你是在本机虚拟机里操作我推荐第一种方案也就是用 gparted Live ISO 启动离线完成分区调整。这样操作时没有任何分区处于挂载状态gparted 能放开手脚干也不会有“分区被占用”这种恼人的报错。后面我的实操也围绕这个方案展开。至于在线安装 gparted 的方式虽然简单sudo apt install gparted但如果你要调整的是根分区/系统不允许你在分区挂载的情况下修改它所以在线方案只能用来扩展独立的数据盘比如/home单独分区或者第二块硬盘。用途有限我一般不给别人推荐这条路。2. 动手前的准备工作从宿主机把“硬盘”先撑大不管用 gparted 还是命令行第一步永远是在宿主机层面扩大虚拟磁盘。这一步搞错了后面全白搭。我见过有人直接在 gparted 里想扩分区结果发现分区已经是磁盘的最大大小就是因为没在 VMware 里先扩展虚拟磁盘。2.1 VMware 和 VirtualBox 扩展虚拟磁盘的差异VMware Workstation 的操作比较直观先确保虚拟机处于关机状态然后编辑虚拟机设置选中硬盘点“工具”里的“扩展”输入你要扩展到的目标大小。注意这里填的是最终的磁盘总大小不是“增加多少”比如原来 20G 想加 30G就要填 50。VirtualBox 更麻烦一点因为图形界面没有直接扩展磁盘的按钮得用命令行。在 VirtualBox 安装目录下执行VBoxManage modifymedium disk C:\path\to\your.vdi --resize 51200其中51200是新的磁盘大小单位是 MB也就是 50G。执行完可以用VBoxManage showmediuminfo disk 路径验证容量是否变更。这里有个细节必须提醒虚拟磁盘的扩展只能往大了调不能往小了调。如果填错了比如填成比当前小的大小VirtualBox 会直接拒绝VMware 也会报错。所以在操作前先确认当前虚拟磁盘的大小再决定填多少。还有一点关于快照的警告如果你的虚拟机有快照某些虚拟机软件会在有快照的情况下限制磁盘扩展。遇到这种情况先删除旧的快照或者给当前状态另存一个“当前状态快照”再执行扩展操作。不删快照也没关系扩展后快照链会保留但性能会有一定影响。2.2 快照和备份扩容前必做的一件事我知道扩容这种事对老手来说已经轻车熟路但分区操作毕竟是高危动作。即使 gparted 很成熟也不能保证不会遇到意外断电、文件系统损坏这类小概率事件。所以我给自己定了个规矩只要动分区先拍快照或者备份关键数据。在 VMware 里拍快照很简单关机状态下右键虚拟机 → “快照” → “拍摄快照”。VirtualBox 的话也是在关机状态下“控制” → “生成备份”。快照的意义在于如果分区调整失败导致系统起不来你可以直接回滚五秒钟回到扩容前的状态。不过要注意快照不是万能的。如果你的数据非常重要比如里面有数据库文件、代码仓库或者论文草稿最好额外拷贝一份到宿主机或者移动硬盘。快照文件也有损坏的可能性双保险才安心。2.3 确认分区布局和文件系统类型在重启进 gparted Live 之前先花一分钟确认你的分区布局。在终端里跑几个命令lsblk df -h blkidlsblk会列出磁盘和分区树你能看到根分区是/dev/sda2还是/dev/sda3以及磁盘的总容量是否已经变成了新的大小。df -h能看出文件系统的使用率blkid则告诉你每个分区的文件系统类型和 UUID。这个步骤很关键因为你要在 gparted 里准确选中正确的分区进行操作同时也要知道 swap 分区在哪个位置。为什么要关注 swap因为很多 Linux 默认安装时根分区后面还会有一个 swap 分区而 gparted 扩展根分区时如果 swap 挡在根分区和未分配空间之间你得先把 swap 往右挪或者删掉重建才能让根分区吃到新增空间。这个问题我在后面的实操部分细讲。3. gparted 分区调整实操5分钟完成扩容准备工作做完下面就是正式操作。整个过程我自己实测下来正常情况真的只要 5 分钟左右前提是你别卡在那些我下面会提到的坑里。3.1 准备 gparted live 启动环境gparted 官方提供了独立的 Live ISO你需要下载它并挂载到虚拟机的光驱里。下载地址在 gparted.org 的 Download 页面或者 SourceForge 上文件名类似gparted-live-1.5.0-3-amd64.iso。下载完成后在 VMware 里编辑虚拟机设置把 ISO 文件挂载到 CD/DVD 光驱。然后启动虚拟机在启动界面短暂出现时按 F2 或 Esc 进入 BIOS 设置把光驱启动顺序调到硬盘之前或者直接从光驱启动。这里有个小技巧如果你不想进 BIOS 折腾最简单的方法是开机时猛按 F12VMware 默认是 F2 进 BIOSF12 进启动菜单直接选光驱启动。VirtualBox 的话启动时按 F12 也能调出启动菜单。选择光驱启动后你会看到 gparted live 的启动菜单屏幕上有几个选项。如果你用的是普通 x86_64 虚拟机直接选默认的“Default settings”回车即可。如果你遇到卡在某个界面不动的情况试试选“Safe graphic settings”这个模式会强制使用更保守的显卡驱动能解决不少显示问题。3.2 核心操作调整根分区大小启动之后gparted live 会进入一个桌面环境。这个过程需要一点耐心因为整个系统是从 ISO 加载到内存运行的速度比正常硬盘启动慢一些尤其是虚拟机分配给的内存不大的时候。等桌面出现后桌面上会有一个“GParted”图标双击打开。打开 gparted 主界面后右上角有一个磁盘下拉框确认你选中的是目标磁盘。如果虚拟机只有一块硬盘那默认就好不会选错。接下来是核心操作步骤我按顺序列出来右键点击根分区比如/dev/sda1或/dev/sda2选择“Resize/Move”。在弹出的窗口中你会看到一个表示分区大小的矩形条右侧可能有未分配空间。直接在“New Size”输入框里填入你想要的新大小或者直接用鼠标拖动矩形条的右边界把它拉到最右边。如果你只想把根分区扩大其余保持不变直接把“New Size”改成原来大小加上新增的未分配空间即可。点击“Resize/Move”确认操作。回到主界面你会看到底部多了一条待执行的操作记录但此时还没有真正执行。检查一下这条记录是否正确。点击工具栏上的绿色对勾“Apply All Operations”gparted 会弹出一个警告告诉你这是一次不可逆操作确认后它就开始执行了。执行过程中gparted 会依次完成以下动作卸载分区如果挂载了的话→ 检查文件系统 → 扩展文件系统 → 扩展分区表。每个动作都有进度条你看到的分区变化都是从文件系统层面开始的这是因为文件系统扩展必须先于分区表扩展完成逻辑上才能自洽。等待执行完成看到“All operations successfully completed”这类提示后就可以拔出 ISO虚拟机设置里断开光驱连接或者光盘图标右键“弹出”然后重启虚拟机。正常的话Ubuntu 会自动启动到桌面你再用df -h检查根分区已经变大了。3.3 swap 分区在扩容路径上的处理前面提到swap 分区是扩容时最大的绊脚石。这里我展开讲。大多数 Ubuntu 默认安装时分区布局是这样的/dev/sda1是 EFI 引导分区如果是 UEFI 安装/dev/sda2是根分区//dev/sda3是 swap 分区。如果你用 gparted 打开后看到这种情况那新增的未分配空间在最右边而 swap 分区挡在根分区和未分配空间之间你直接在根分区上做 Resize新空间还是吃不到。遇到这种布局你有两种处理方式方式一把 swap 分区往右移动。在 gparted 里右键 swap 分区“Resize/Move”把整个分区往右拖让未分配空间出现在 swap 的左边也就是紧挨着根分区的右侧然后再把根分区向右扩展。不过移动 swap 分区需要先swapoffgparted 也会自动处理但耗时不会短因为整块 swap 里的数据都要拷贝。方式二我推荐删掉 swap扩展根分区再重建 swap。操作顺序是先右键 swap 分区选“Swapoff”在 gparted 里叫“Deactivate”然后删除 swap 分区。此时未分配空间就连续了直接扩展根分区。最后在未分配空间上新建一个 swap 分区。注意新建 swap 分区后要记录新的 UUID去/etc/fstab里更新原来的 swap 行否则下次开机系统会找不到 swap 设备。我实际推荐方式二是因为移动 swap 分区真的很费时间而且如果虚拟机内存不大swap 用量一般也不高重建一个 swap 分区也就几秒钟的事。当然如果你对 fstab 不熟方式一可能更“省心”因为它会自动处理 UUID 的变化。权衡下来新手建议方式一老手随意。还有一个更省事的方案如果你的 swap 分区比较小比如只有 1G那干脆别折腾直接删掉 swap把根分区扩满不用 swap 也行。现在桌面级 Linux 日常使用内存够大的话swap 可有可无。最后在 fstab 里注释掉 swap 那行就行。4. 常见错误与排查技巧实录这块才是这篇博文真正的精华。我把自己在扩容过程中遇到过的、以及帮别人修过的问题都记录下来每个都有实际的解决思路。4.1 错误一gparted 里看不到新增的空间明明在 VMware 里已经把虚拟磁盘扩展了gparted 打开后却还是原来的分区大小未分配空间也看不到。这种情况有两种可能。第一种可能是虚拟磁盘扩展没真正生效。建议先确认虚拟机关机后扩展的还是开机时扩展的VMware 和 VirtualBox 都要求虚拟机关机或至少磁盘未被使用才能修改 vmdk/vdi 文件大小。如果你是在虚拟机运行中操作的多半没成功需要关机重来。第二种可能是 gparted 启动的是旧内核或者磁盘信息没刷新。遇到这种我一般先退出 gparted在终端里跑sudo partprobe或者直接重启虚拟机再进 gparted live。如果重进还是看不到那就拔掉 ISO正常启动 Ubuntu在系统里执行lsblk看看磁盘大小是否已更新。如果系统里能看到新大小那说明 gparted live 版本太老换新版 ISO 就行。4.2 错误二分区上有钥匙图标锁图标无法操作gparted 里分区旁边有个小钥匙图标表示这个分区处于挂载状态mounted。挂载状态的分区不能被修改这是为了保护文件系统完整性的设计。在 gparted live 环境下正常情况下所有分区都是未挂载的但如果你是在线打开 gparted那根分区基本上肯定是挂载的。解决办法在 gparted 里右键该分区选择“Unmount”卸载。如果卸载失败提示“target is busy”说明有进程还在使用该分区。可以把所有终端窗口关掉或者在终端里执行sudo lsof f -- /dev/sda2查看占用进程再杀掉。实在不行最稳妥的就是重启到 gparted live 环境再操作Live 环境下不会有多余进程占用分区。4.3 错误三resize 操作报错或中途失败这是最让人头皮发麻的情况但多数时候问题出在文件系统有错误。gparted 在调整 ext4 分区之前会先对文件系统做检查如果检查发现错误它就会中止操作避免在损坏的文件系统上动刀。解决办法其实很简单先对分区做一次完整的e2fsck检查。我不止一次看到类似e2fsck -f /dev/sda2的命令解决了报错问题。这里强调一下e2fsck 只有在分区未挂载或只读挂载状态下才能安全运行。在 gparted live 环境里执行是最安全的。sudo e2fsck -f /dev/sda2如果检查报告一堆“Fix”选项全部选y让它自动修复。修复完重新打开 gparted再试一次 Resize通常就能顺利执行了。这个操作并不危险但你一定要确保分区没有被挂载否则有数据损坏的风险。4.4 错误四扩容后系统引导失败系统启动时直接掉进grub rescue界面或者黑屏报错。这个问题的成因有好几种最典型的是分区调整过程中引导分区比如 /boot 分区或 EFI 分区被误操作了。还有一种情况是扩容后分区起始位置发生了变化导致 grub 找不到原来的根分区。如果只是根分区扩展通常 grub 能自动适应但如果你的系统是 UEFI 引导那 EFI 分区的顺序变化可能会出问题。我遇到过一次是因为 swap 分区被删除重建导致 grub 里用 UUID 定义的内核参数失效了。处理思路用 Ubuntu 安装 U 盘或 gparted live 进入修复环境。gparted live 的桌面环境里有终端你可以 chroot 进去修复 grub。网上有很多 grub 修复教程这里给一个大致的流程先把根分区挂载到/mnt把 /dev、/proc、/sys 挂载过去然后用chroot /mnt进入系统再执行grub-install /dev/sda和update-grub。如果你是 UEFI 引导还得额外把 EFI 分区挂到/mnt/boot/efi。这个操作对新手来说确实有点门槛所以再次强调扩容前快照的重要性——直接回滚比修复快得多。4.5 错误五gparted live 启动卡住或黑屏从 ISO 启动后屏幕上只有光标闪烁或者直接黑屏怎么按都没反应。最常见的原因是显卡兼容性问题。虚拟机的虚拟显卡有时候对 Linux 的启动界面支持不太好特别是启用了 3D 加速或者特定显存配置的场景。解决办法是启动时选择“Safe graphic settings”模式这个模式会禁用 KMS内核模式设置强制用框架缓冲framebuffer驱动显示兼容性高很多。我在 VMware 上遇到过两次选了 Safe 模式后一切正常。如果 Safe 模式也不行那可能是 ISO 镜像下载不完整。重新下载或者换一个版本的 gparted live 试试。老版本的 ISO 虽然工具旧但对老虚拟机兼容性反而更好。4.6 常见错误速查表错误现象可能原因快速解决看不到未分配空间虚拟磁盘未真正扩展/磁盘信息未刷新关机后重新扩展进系统lsblk验证换新版 ISO分区带锁图标分区已挂载右键 Unmount或用 Live 模式启动resize 报错终止文件系统有错误e2fsck -f修复后再试扩容后 grub rescue引导分区或根分区 UUID 变化恢复快照或 chroot 修复 grubLive ISO 启动黑屏显卡兼容性问题选 Safe graphic settings或重下 ISOswap 丢失删除 swap 未更新 fstab重建 swap更新 /etc/fstab 中的 UUID5. 最后再分享几个我常用的排查命令和心得扩容这活干多了我形成了自己的一套固定流程基本上每次都能一次过。除了上面说的我再补充几个命令行技巧这些在 gparted 图形界面出问题的时候很有用。启动进 gparted live 后打开终端我习惯先跑sudo dmesg | tail -30查看系统启动日志确认磁盘识别情况。再执行sudo fdisk -l看分区表全貌这比 gparted 图形界面在某些情况下更直观尤其是分区表损坏的时候。另外我偶尔也会用sudo parted /dev/sda print free它能显示所有分区和空闲空间比 fdisk 更详细。如果你扩容的是 LVM 逻辑卷那 gparted 图形界面就帮不上忙了得用 LVM 命令先扩展 PV物理卷再扩展 LV逻辑卷最后resize2fs扩展文件系统。很多人装了 Ubuntu 默认用了 LVM这时候直接进 gparted 会发现根分区是个 LVM 容器没法直接拉大。要先在虚拟机层面扩展磁盘然后在系统里依次执行sudo pvresize /dev/sda3 sudo lvextend -l 100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv sudo resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv这个流程跟 gparted 图形界面完全不同反而更简单一点。检测方法是在 gparted 里看到分区的文件系统类型显示为lvm2 pv或者df -h里的根分区挂载在/dev/mapper/路径下。如果你是这个情况直接忽略 gparted 调整的步骤用上面的命令搞定。另外我看到很多人问“要不要在虚拟机设置里勾选‘独立硬盘’或‘惰性零填充’”。我的建议是如果虚拟机已经装好系统了别去动这些高级选项扩容这种事跟这些设置没有直接关系。真的追求性能应该在创建虚拟机时就规划好磁盘类型扩容阶段就别折腾这些了。根据我个人经验扩容完之后顺手做一件事在系统里执行sudo apt autoremove和sudo apt clean把旧内核、缓存清掉。这样能释放不少空间让扩容后的余量更充裕。还有一个技巧如果你扩容后想确认文件系统扩展是否成功不要只用df -h配合df -i看看 inode 使用情况有时候是 inode 不够而不是容量不够那种情况下扩容是另一种玩法。最后说一个大家容易忽略的操作习惯修改分区时gparted 有个“Edit → Apply Operations”选项如果你临时反悔可以点菜单里的“Clear All Operations”取消本次所有的待执行操作这会让你回到操作前的状态非常实用。所以即使点错了也不用慌只要还没执行随时可以撤销。一旦点了 Apply那就是开弓没有回头箭只能靠快照兜底了。