ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

VMware虚拟机磁盘扩容实战:用GParted扩展Linux根分区与重建swap

VMware虚拟机磁盘扩容实战:用GParted扩展Linux根分区与重建swap 虚拟机的硬盘满了和物理机硬盘满了一样令人头大。我最近整理一台跑数据库测试的VMware Workstation虚拟机根分区40G被日志和测试数据塞满系统已经持续报警。直接换新虚拟机重来环境配置、依赖、数据的迁移成本太高。更务实的做法是在VMware里给虚拟磁盘“加容量”再用GParted Live这个开源分区工具把根分区扩过去。整个过程不需要重装系统也不影响虚拟机里的文件数据只是要记得按顺序操作尤其是别跳过备份。这篇内容就是把我的完整操作过程记录下来。先讲清楚为什么虚拟磁盘满了不能直接在VMware里改大小再讲快照和GParted Live的准备然后一步步拆解扩容分区和重建swap的细节最后附上我踩过的坑。适合所有用VMware跑Linux虚拟机、遇到“磁盘打满”问题的朋友不管是开发环境、测试机还是跑服务的常驻虚机基本都能照搬步骤。1. 先搞懂“虚拟磁盘满”是怎么发生的很多人第一反应是VMware设置里把磁盘调大就可以了结果调完回到Linuxdf -h一看容量还那样就懵了。要理解这个问题得先分清虚拟磁盘的“三层结构”虚拟磁盘文件层、分区表层、文件系统层。VMware只能改最外层分区表和文件系统需要另外的工具去调。1.1 vmdk的两种形态稀疏与厚置备VMware Workstation里创建虚拟机时硬盘类型的选项有两类一种是“立即分配所有磁盘空间”也就是厚置备另一种不勾选属于动态分配也就是稀疏文件。厚置备从一开始就占用全部物理空间vmdk文件大小和设定容量几乎一致动态分配则是“用多少占多少”实际文件远小于设定容量。这个区别在扩容时很重要。厚置备的虚拟机VMware扩展磁盘时物理宿主机必须有足够的剩余空间因为空间是实打实预分配出去的动态分配则只是修改vmdk的“表头容量”物理占用不会立刻变多。所以扩展之前先看一眼物理磁盘剩余空间免得扩展失败甚至把宿主机磁盘塞爆。1.2 为什么物理磁盘很空虚拟机却报磁盘满虚拟机内部看到的“/dev/sda2”之类的分区大小是创建Linux系统时分区表里写死的。比如你在Ubuntu安装界面把根分区划成40G那么就算vmdk文件容量还有几个T系统内部也只会认这40G。VMware的“扩展磁盘”操作只是把vmdk的容量上限调大分区表仍然是老的40G布局系统自然看不到多出来的空间。类似地如果你在VMware里把磁盘从40G扩到250G虚拟机内部看到的情况是/dev/sda整体容量变大了但/dev/sda2根分区仍然是40G多出来的空间以“未分配”的形式出现在磁盘末尾。只有把分区扩展、文件系统也扩展之后df -h才能看到容量增长。这就解释了为什么非要GParted这一步。1.3 扩展分区到底动了什么分区扩展本质是两步第一步改分区表把/dev/sda2的结束位置向后挪吞并后面的未分配空间第二步调整文件系统让ext4/xfs等文件系统感知到分区变大。如果用fdisk、parted这类命令行工具这两步可能都要手动处理中间还要解决好分区编号、UUID、开机启动项等问题。GParted之所以好用是因为它把两步合并成了图形化操作resize分区后会自动触发文件系统扩展。它支持ext4、xfs、btrfs、swap等常见格式操作前还会预检错误。这也是我选择GParted而不是fdisk的主要理由在图形界面上能看到完整的磁盘布局系统盘、swap盘、EFI分区一目了然不容易误操作。2. 动手前的准备快照、空间核查、镜像下载技术圈有条铁律改分区表之前先备份至少也要打个快照。很多人扩容失败不是GParted本身的问题而是准备阶段偷了懒。下面这几步是我每次操作前必做的缺一不可。2.1 快照是底线别拿生产环境开玩笑在VMware Workstation里对虚拟机打快照很简单VM菜单 - Snapshot - Take Snapshot。快照会记录当前磁盘状态GParted调整出错随时可以回滚到操作前。对生产虚拟机单靠快照还不够稳建议先克隆一份完整虚拟机Clone或者导出OVF作为兜底验证能正常启动再继续。有一点容易被忽略快照会占用宿主机物理空间。动态分配的虚拟机扩到250G快照文件也会随着后续写入不断增长所以操作前检查宿主机剩余空间至少留出虚拟磁盘当前实际占用大小的1.5倍以上才比较安全。2.2 给VMware磁盘“加容量”前的物理磁盘检查宿主机是Windows就打开资源管理器看看哪个盘还剩多少空间宿主机是Linux就df -h或者直接ls -lh查看vmdk文件大小。假如vmdk当前实际占用了30G又为虚拟机增加了210G容量那么扩展后虚拟磁盘的“设定容量”变成250G但物理占用不会立刻暴增——除非是厚置备磁盘。如果是厚置备磁盘VMware要求宿主机一次性分配新增的全部空间210G就是实打实的210G。物理空间不足时VMware会直接报错“unable to allocate disk space”这时候要么清理宿主机磁盘要么把现有厚置备磁盘转换为动态分配格式转换完成后再扩容。2.3 获取并挂载GParted Live ISO去gparted.org的下载页面获取最新版GParted Live镜像版本号大概在1.6左右体积约500MB。下载完在VMware里打开虚拟机设置把光驱指向这个ISO并勾选“启动时连接”。重启虚拟机时按Esc键就能弹出启动菜单直接用方向键选CD-ROM Drive进入GParted Live省去进BIOS改启动顺序的麻烦。GParted Live启动后一般会出现几个交互选项语言选默认英文键盘布局直接回车然后会问“Dont touch keymap”之类一路默认即可。最终会进入一个X图形桌面桌面上有GParted的快捷图标双击打开就是分区工具界面。如果是纯命令行环境也可以输入gparted直接启动图形界面前提是内存足够跑起X图形。3. VMware层扩容把虚拟硬盘加到位准备工作完成后接下来操作VMware自身。注意顺序不能反先扩VMware的虚拟磁盘再进GParted扩分区。如果先启动GParted再在VMware里扩磁盘GParted可能没识别到变化还得重新扫描一遍有点绕远。3.1 Workstation Pro 17的扩展入口VMware Workstation Pro 17现在已经免费面向个人用户功能上没有缩水。扩展磁盘的操作入口在虚拟机设置里选中虚拟机 - VM菜单 - Settings - Hard Disk - Utilities - Expand。在对话框里输入扩容后的目标容量比如原来80G想扩到250G就填250单位是GB。操作前提是虚拟机处于关机状态开机状态下这个按钮是灰色不可点的。点击Expand之后VMware会在几秒内完成vmdk元数据的修改这时候可以看到vmdk文件的“设定大小”变了。注意如果你用的是Workstation 17的管理界面有些版本菜单文字写的是“Expand”有些写的是“增加”本质一样。扩展完成后虚拟磁盘在VMware层面就已经变成了250G。3.2 扩展后“未分配空间”去哪里了从VMware层看来虚拟磁盘250G是一个整体但在虚拟机内部这个250G的磁盘依然保持着原来的分区表布局。比如原来的分区表可能是/dev/sda1是EFI分区500MB/dev/sda2是根分区79G左右/dev/sda3是swap2G。250G减去原来分区占用的82G左右剩下的空间会在磁盘末尾变成“未分配”。我用GParted打开后看到的就是这样的状态分区表没变最后面多了约168G的未分配区域。这个未分配区域不是给某个分区预留的哪个分区需要扩展就把它拉过来。GParted图形界面上未分配区域用灰色底色显示分区则用彩色方块标出很容易辨认。3.3 不同虚拟磁盘格式的附加说明vSphere/ESXi上操作方式略有不同在vCenter里选中虚拟机 - 编辑设置 - 硬盘 - 更改大小输入新容量。vSphere支持在线扩容虚拟机不必关机但扩容之后内部的GParted分区调整依然需要停机所以实际操作上还是先扩盘、再关机启动GParted流程没区别。如果虚拟磁盘总量超过2TB还需要注意分区表格式BIOS引导的传统虚拟磁盘使用MBR分区表只能寻址2TB如果创建虚拟机时选了UEFI引导那么虚拟磁盘默认是GPT分区表容量上限大得多GParted也能正常识别。绝大多数场景下2TB以内MBR/GPT都不用额外操心。4. GParted实操扩展根分区、重建swap等GParted Live启动完成图形界面弹出后先确认你选的是正确的磁盘。Workstation下的虚拟磁盘一般是/dev/sda如果虚拟机挂载了多个虚拟硬盘就要根据容量和分区布局逐一确认千万别在别的磁盘上操作。这一步看走眼轻则白忙活重则把数据搞没。4.1 分区布局分析你的swap挡道了吗GParted界面默认会把磁盘所有分区列出来包括/dev/sda1EFI或/boot、/dev/sda2Linux根分区、/dev/sda3swap。常见Linux自动分区布局中根分区和swap相邻而且swap往往排在根分区后面。这意味着未分配空间出现在swAP之后而不是紧挨着根分区。问题就在这里GParted不能把一个分区“跨过”swap去扩展。根分区后面紧跟着swap分区时想扩大根分区就得先把swap“挪走”。常规做法是先对swap分区执行删除Swapoff后删除把原来的swap空间变成未分配区域和磁盘末尾的未分配空间连在一起然后拖拽扩展根分区让它占满这部分未分配空间最后在磁盘末尾新建一个swap分区。我在实际操作时会先看一下fstab内容记下原来swap的UUID和大小方便后续重建时做对照。4.2 删除swap、扩展根分区、重建swap的具体操作操作前在交换分区的分区条上右键选择Swapoff避免系统还在引用它同样如果根分区已经挂载到GParted环境里也需要先卸载。GParted Live环境下一般不会自动挂载根分区但保险起见右键根分区选Unmount。然后右键根分区比如/dev/sda2选择“Resize/Move”在弹窗里把“New Size”调成最大值或直接拖动右侧的箭头到最右端。如果弹窗里显示“Free space following”为负数说明你没有先删掉swap往回退一步把swap处理好再来。确认数值无误后点击Resize/Move这时的分区扩展还只是在计划阶段界面上会出现一个待执行的队列绿色对勾按钮的Apply才是真正动手。先别急着点Apply。在磁盘末尾原来的swap区域上右键选择“New”分区类型保持“Primary”或逻辑分区文件系统类型选linux-swap大小可以按你原来的swap大小来比如我原来给的是2G重建时还是2G。如果你内存比较大比如8G以上重建swap时可以顺手调大一点比如给到8G反正分区空间富裕。确认布局没问题后点击绿色对勾Apply。GParted会依次执行移动并扩展根分区、扩展文件系统到新分区边界、创建swap分区、格式化swap。整个过程视磁盘大小和物理机IO速度可能几分钟到十几分钟不等。期间GParted会在底部状态栏显示进度不要关闭虚拟机不要强行重启耐心等它完成。4.3 swap分区新建后必须处理UUID这是最容易翻车的地方。原来的swap分区在/etc/fstab里有对应的UUID新建swap分区的UUID必然和旧的不同。如果你不更新fstab重启后系统会按旧UUID去找swap找不到就一直等待或者报错表现为开机卡在“A start job is running for dev-disk-by-uuid-xxxx”等字样要等很久才能进系统。解决办法是重启回正常系统后先在终端执行blkid看新swap分区的UUID然后编辑/etc/fstab把swap那一行的UUID替换成新的。如果你嫌麻烦也可以把swap那行直接改成/dev/sda3但建议还是用UUID方式更稳定路径和设备名在多磁盘环境下可能变化。改完之后执行swapon -a验证是否能正常开启。4.4 扩展后的系统验证扩容完成后关机在VMware设置里把光驱从GParted Live换回原来的“使用物理驱动器”或移除ISO连接然后正常开机。登录系统后依次执行df -h、free -h、lsblk检查根分区是否变成目标容量、swap是否正常挂载。这里有个容易误判的点df -h显示的是文件系统容量lsblk显示的是分区容量两者应该在扩展后保持一致。如果df -h仍旧是旧值但lsblk已经显示新大小说明GParted只改了分区表没改文件系统多见于手动fdisk扩容的场景在GParted图形界面下一般不会出现但万一手动操作时遗漏了resize2fs /dev/sda2可以补跑一次。4.5 LVM环境下该怎么做如果你的Linux虚拟机用了LVM逻辑卷管理分区布局在GParted里往往显示为一个“lvm2 pv”类型的物理卷分区比如/dev/sda2。这种情况无法在GParted里直接扩展根文件系统需要先扩容PV所在分区再在系统内完成后续步骤。具体做法是GParted中扩展/dev/sda2这个PV分区到最大空间然后重启进入系统依次执行pvs确认PV状态执行pvresize /dev/sda2让PV扩展执行lvextend -l 100%FREE /dev/mapper/你的卷组-逻辑卷名把LV扩展到全部剩余空间最后根据文件系统类型执行resize2fsext4或xfs_growfsxfs。注意xfs只能扩容不能缩容所以规划时就要留好余量。5. 扩展后常见故障与排查实录GParted扩容流程本身不复杂但实际环境千奇百怪下面几个问题是我自己遇到过或者在论坛里被反复问到的整理成速查表方便对照排查。故障现象可能原因排查与解决开机后df -h仍是旧容量未执行文件系统resize检查lsblk分区大小然后resize2fs /dev/sda2swap无法启用fstab里UUID还是旧的blkid查看新swap UUID更新fstab开机卡在A start job waitingfstab挂载项指向不存在的分区进入emergency mode修复fstab相关条目启动后提示文件系统有错误扩展前文件系统已有异常用e2fsck修复后再resize2fsGParted界面显示锁头无法操作分区仍处于挂载状态右键分区卸载swap右键SwapoffVMware报无法扩展磁盘虚拟磁盘未关机关闭虚拟机后再执行Expand物理空间不足导致扩容失败厚置备vmdk需预分配清理宿主机磁盘或转为动态磁盘5.1 系统启动变慢的坑等待dev-disk-by-uuid这个坑值得单拎出来。系统开机时如果找不到fstab里记录的swap UUID会默认等90秒才跳过表现就是黑屏或者一行日志卡很久。我在测试机上碰到过一次一开机就是3分钟等待排查了半天发现fstab里swap那行没更新。如果是LVM环境swap可能不在普通分区而是逻辑卷重建后逻辑卷路径一般不会变所以不太会遇到UUID问题传统分区布局则几乎必然变UUID。处理思路是进入救援模式挂载根分区编辑/etc/fstab把swap那行注释掉或改成新UUID然后重建initramfsupdate-initramfs -u重启就能恢复正常。5.2 扩展前把文件系统错误清一遍GParted在调整分区前如果检测到文件系统有问题会直接弹警告。比较稳妥的做法是在正式系统里先执行sudo e2fsck -f /dev/sda2检查根分区有没有异常。如果是xfs文件系统xfs_repair要求分区卸载才能执行但根分区没法卸载所以通常用只读模式检查。Linux根分区通常无法在虚拟机运行状态下卸载但e2fsck -f可以在挂载状态下执行只是不能修复所有问题GParted Live作为Live环境则完全不受影响可以在GParted启动后的终端里先跑一遍完整修复再执行扩容。省得扩容执行到一半因为文件系统错误中断。5.3 UEFI启动下的EFI分区风险很多Win11或新版Ubuntu虚拟机默认使用UEFI引导磁盘开头会有一个几百MB的EFI系统分区/dev/sda1。GParted扩展根分区时不需要动EFI分区但分区调整过程中界面会重绘分区表如果误把EFI分区删了或者移动了位置开机直接进不了引导。我的习惯是在GParted里对EFI分区“看都不要动”。如果空间实在不够必须调整EFI分区务必先备份在终端执行dd if/dev/sda1 of/root/efi-backup.img bs4M再操作。实际操作中基本没有移动EFI分区的必要根分区扩展以后空间问题基本都能解决。5.4 Windows虚拟机的对照参考如果你的虚拟机装的是Windows而不是Linux思路不同但流程简化不少。Windows系统自带磁盘管理如果C盘后面就是未分配空间右键C盘“扩展卷”就能直接扩容不需要GParted。但Windows下经常遇到C盘和未分配空间之间有恢复分区、OEM分区挡着自带工具扩展不了。这种情况下GParted同样能处理流程和Linux差不多VMware层扩容 - 启动GParted - 把未分配空间挪到C盘后面 - 扩展NTFS分区。NTFS在GParted里的调整方式与ext4类似操作前同样必须先打快照、备份数据。相比之下Windows Server系统里的磁盘管理更严格主分区的可用空间不足时即使C盘后面有空地也可能灰掉GParted这时候就是救火队员的角色。5.5 GParted操作中常见的误操作提醒GParted的Apply不可逆虽然中途可以Cancel但已经执行的分区操作不会自动恢复。我见过不少人在GParted里拖动分区位置而不是大小结果系统启动失败。原则是只调整“结束位置”不要试图改变“起始位置”除非你清楚自己在做什么。起始位置一变引导记录和启动项全部要重新处理。还有一点界面下方“信息”面板会显示分区的起始扇区、结束扇区、容量大小。手动微调时建议用数值输入而不是鼠标拖动避免因为鼠标偏移导致分区对齐不对SSD虚拟磁盘对齐到1MiB是基准要求。好在GParted默认MiB对齐输入目标大小后它会自动推荐合适的结束扇区直接用推荐值即可。最后再分享一个小技巧GParted Live启动时可以加一个引导参数“toram”把整个Live系统加载到内存运行这样调整分区过程中Live系统不会反复读ISO磁盘IO干扰更少。对于几十G到几百G的分区扩展实测下来稳定性和速度都有提升。如果你用的版本比较新还可以在启动菜单里选“Graphical safe mode”进入安全图形模式虚拟机显卡兼容性更好界面缩放也不会花屏。整个扩容流程做熟练之后从打快照到分区扩展完成、重启验证一般半小时以内就能搞定比重新搭一台虚拟机省太多时间了。
返回列表