VMware中Ubuntu 22.04虚拟机磁盘扩容完整指南:从分区到LVM一步到位

发布时间:2026/9/30 14:57:42
VMware中Ubuntu 22.04虚拟机磁盘扩容完整指南:从分区到LVM一步到位
不知道你有没有遇到过这种情况VMware里装了个Ubuntu 22.04当时觉得自己挺有经验硬盘随便给了20G结果过了一两个月编译一个大项目、拉几个Docker镜像、再装点ROS依赖系统盘就飘红了。清理缓存、删日志都是治标不治本删来删去还是没地方。这种时候只有一个彻底的解决办法——给虚拟机磁盘扩容。这篇文章要把VMware中的Ubuntu 22.04虚拟机磁盘扩容这件事讲透包括VMware层面的硬盘扩容、Ubuntu内部的分区调整和文件系统扩展以及我实际踩过的LVM卷组、快照、分区表重读这些坑。不管你是刚装的系统还是跑了很久的生产机只要不是把根文件系统放在房梁上的特殊布局按这套流程基本都能安全搞定。1. 动手前的三个准备别急着点“扩展”很多人拿到这个问题直接就去虚拟机设置里把硬盘调大然后开机一看系统里还是原来的容量然后就开始怀疑人生。这不是操作失败而是你跳过了操作系统内的扩容环节。VMware扩展的是虚拟磁盘文件本身的大小相当于把一块真实硬盘从20G换成了50G但硬盘上的分区表、分区、文件系统都还是按20G的状态记录的你得手动告诉系统“后面的空间现在归你了”。1.1 先分清你的存储布局普通分区还是LVMUbuntu 22.04有两种常见的磁盘布局扩容方法完全不同搞错了轻则没效果重则文件系统损坏。普通分区布局一般出现在Desktop版或者选择“整块磁盘直接使用”的安装方式。分区类似/dev/sda1EFI或/boot、/dev/sda2根分区根分区直接就是ext4文件系统。LVM逻辑卷管理布局一般出现在Server版或者安装时勾选了“Use LVM”的选项。你会看到/dev/sda2是一个物理卷上面建了ubuntu-vg卷组卷组里又划出ubuntu-lv逻辑卷最后逻辑卷挂在根目录上。所以第一步先跑一个命令确认自己属于哪种情况lsblk如果输出里有一层类似└─ubuntu--vg-ubuntu--lv的结构那就是LVM如果直接看到/dev/sda2挂载到根目录那就是普通分区。这一步判断错了后面的命令全部作废。1.2 快照不是可选项是保护伞我能理解那种“这虚拟机就我自己用随便搞搞就行”的心态但我真的建议在扩容前创建一个快照。VMware Workstation的快照在扩容场景里就是后悔药。虽然理论上扩容操作不复杂但分区表、文件系统这种东西一旦操作失误轻则分区丢失重则系统起不来。尤其你在生产环境里跑着服务ssh远程操作时一个growpart写错分区号可能比你想的严重得多。创建快照很简单虚拟机正常运行或关机时右键虚拟机 - 快照 - 拍摄快照命名随便。但注意快照会占用宿主机磁盘空间拍摄前确认宿主机的剩余磁盘空间足够。快照存在期间VMware的“扩展”按钮可能会变成灰色或者点击时提示你删除快照才能继续。这里有个顺序问题先拍快照再关机再扩容这时候快照还在VMware可能不允许扩容。所以实际流程应该是拍快照 - 验证虚拟机正常 - 删除快照那这不就没有快照保护了吗不对我实际测试下来的流程是拍快照后保持开机状态此时去尝试扩展如果按钮灰色就需要删掉快照才能扩。所以你真正要做的是在拍完快照确认当前状态干净健康后删除这个快照然后关机再扩展磁盘。这个“先拍再删”的操作听上去很绕但它的意义在于拍快照等于给当前系统状态做了一次健康检查。如果拍快照都失败说明系统本身有严重问题这时候扩容反而是次要的。虽然快照最后删了但“系统当前是干净状态”这个结论已经拿到了。当然如果你没有强迫症也可以在关机状态下先扩展再拍快照完全可行。1.3 记录原始信息备份关键数据扩容前把下面几条命令的输出保存下来一旦出问题可以用来恢复df -hT sudo fdisk -l /dev/sda sudo parted /dev/sda unit GB print free我吃过一次亏没记录扩容前的分区信息中途resize出了问题花了一晚上研究怎么恢复。分区工具虽说不至于把你数据全删了但真到要恢复分区表的时候有你之前记下的输出做参照会从容很多。至于备份如果你虚拟机上跑的是正经服务我建议别嫌麻烦至少在扩容前把/etc、数据库数据目录做一次tar备份或者用rsync拷到宿主机。思路很简单磁盘扩容动了分区表虽然不影响数据但“万一”这两个字在运维里不是靠运气扛的。2. VMware层面前置把虚拟磁盘本身变大准备做好之后现在开始第一个核心操作在VMware里把虚拟磁盘的容量扩大。这一步之前虚拟机必须处于关机状态。别问能不能开机状态搞VMware Workstation不允许我试过它会提示需要关机。2.1 界面操作设置里的“扩展”在VMware Workstation Pro 16/17里路径是关闭虚拟机。右键虚拟机 - 设置。左侧硬件列表里选中“硬盘”可能是SCSI 0:0或SATA。右侧窗口下方找到“工具”或“扩展”点击它。输入扩展后的磁盘总大小比如从20G改成50G点击“扩展”。等待进度条完成。这里有个关键点要搞清楚你填写的是“扩容后的总大小”不是“增加多少”。比如原来20G想加30G那填50G。别填成30G填成30G就是把磁盘缩小到30GVMware的扩展功能只允许单向变大不允许缩小。而且如果磁盘上有多个分区向小调整分区大小需要特殊工具VMware自身不支持。扩展完成后界面下方会提示“磁盘扩展成功”。此时不要直接开机先到虚拟机目录里看一眼原本的.vmdk文件后面可能多出-flat.vmdk这种描述文件容量确实变了说明成功。2.2 命令行方式vmware-vdiskmanager有些人就喜欢命令行而且有时候界面按钮是灰的比如虚拟机有快照存在或者磁盘类型特殊。这种情况可以试试VMware自带的vmware-vdiskmanager工具。在Windows宿主机上工具路径一般在VMware安装目录下我这边是C:\Program Files (x86)\VMware\VMware Workstation\vmware-vdiskmanager.exe命令行格式vmware-vdiskmanager.exe -x 50GB D:\Virtual Machines\ubuntu2204\ubuntu2204.vmdk-x参数指定扩展后的容量后面跟虚拟磁盘路径。这个命令同样要求虚拟机关机而且如果存在快照也会报错。我用这个工具解决过一次界面按钮灰色的问题有意思的是命令行模式下有些限制反而能绕过。注意如果虚拟磁盘被配置为“拆分多个2GB文件”split into 2GB files直接修改vmdk描述文件也行但强烈不建议手改除非你非常清楚内部格式。老老实实用界面或命令行工具是正路。2.3 扩容后磁盘设备名的变化VMware扩完容后进入Ubuntu前要有点心理准备如果虚拟机的磁盘接口是SCSI/SATA设备名还是/dev/sda如果是NVMe接口则是/dev/nvme0n1。如果原来机器里挂了一块20G的系统盘又挂了一块数据盘扩容后系统盘会变成/dev/sda50G数据盘还是/dev/sdb不会乱。不过有一点比较隐蔽如果你在扩容之前把系统装在/dev/nvme0n1上那扩容后还是/dev/nvme0n1growpart和resize2fs的命令参数需要对应调整别按网上的/dev/sda无脑抄。3. Ubuntu系统内部扩容核心环节拆解VMware把磁盘变成50G了但Ubuntu系统看到的还是20G。你可以验证一下fdisk -l /dev/sda会看到/dev/sda总容量已经是50G但分区仍然是原来的大小。从这一刻开始系统层面的大戏正式开场。3.1 第一步让内核重新读取分区表扩容后进入系统有时候fdisk -l已经能看到新容量但lsblk显示的分区大小还是旧的。这是因为内核缓存的分区表还没有更新。最粗暴有效的方式是重启系统。如果不想重启用partprobe让内核重新读取分区表sudo partprobe /dev/sda不过对于根分区所在的磁盘partprobe有时会提示设备忙因为根分区正在使用中。这时候别硬撑重启一次花不了一分钟换来的是稳定的环境值。3.2 普通分区布局growpart resize2fs假设你的布局是/dev/sda1是EFI分区几百M/dev/sda2是根分区ext4文件系统现在要把根分区扩展到整块磁盘末尾。执行sudo growpart /dev/sda 2注意几个细节growpart参数里设备名和分区号之间是空格分区号是数字2。如果你传的是/dev/sda2反而会报错。分区号必须是你要扩展的那个分区在这个例子里是2因为你不需要动EFI分区。如果你的根分区是/dev/sda1那就执行sudo growpart /dev/sda 1。growpart会把分区扩容到磁盘末尾但它只调整分区表不动文件系统。所以要紧接着做文件系统扩容sudo resize2fs /dev/sda2resize2fs会自动把扩展空间“吸收”进文件系统不用传参数。跑完以后验证df -h /你就能看到根分区已经变成约49G或者50G。为什么用growpart而不是直接用fdisk删除分区重建因为growpart保证不破坏现有分区数据和起始位置只修改分区的结束位置对新手最友好也不容易搞出数据丢失事故。但前提是分区后面必须有未分配空间而VMware扩容恰好就是在磁盘末尾加空间完美匹配。3.3 LVM布局pvresize lvextend resize2fs如果你的系统是LVM布局流程多两步。先看一下结构我机器上的输出大概是这样的NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 50G 0 disk ├─sda1 8:1 0 1M 0 part └─sda2 8:2 0 19G 0 part └─ubuntu--vg-ubuntu--lv 253:0 0 19G 0 part /sda总容量已经扩展到50G了但sda2这个物理卷还是19G卷组大小也是19G逻辑卷也是19G。这时要按顺序执行三个命令第一步扩展物理卷sudo pvresize /dev/sda2这个命令把物理卷扩展到分区的新大小。如果你是UBUNTU默认LVM布局物理卷在/dev/sda2如果你当时手动分的区可能在/dev/sda5自己用pvdisplay看一下。第二步扩展逻辑卷sudo lvextend -l 100%FREE /dev/ubuntu-vg/ubuntu-lv注意ubuntu-vg和ubuntu-lv是卷组名和逻辑卷名你的环境里可能不叫这个用sudo vgdisplay和sudo lvdisplay查看实际名称然后把命令里的名字替换掉。-l 100%FREE的意思是把卷组里所有剩余空间全部划给这个逻辑卷。如果卷组里有多个逻辑卷比如你已经单独划了一个逻辑卷给某个应用这时候用100%FREE会把剩余空间全部给指定卷可能不是你想要的。这种情况建议用-L 30G这种明确增加多少容量的方式。第三步扩展文件系统sudo resize2fs /dev/ubuntu-vg/ubuntu-lv如果用df -hT看到文件系统是xfs最后一步要换成sudo xfs_growfs /xfs不能在线缩容但可以在线扩容而且必须用xfs_growfs不是resize2fs。执行resize2fs在xfs文件系统上会报Couldnt find valid filesystem superblock这也是很多人踩的坑。完成后再看df -h /空间到位。3.4 特殊场景NVMe磁盘、btrfs和swap插队有几个不算少见但容易让人愣住的情况我集中说一下。NVMe磁盘设备名是/dev/nvme0n1分区是/dev/nvme0n1p1。growpart的写法是sudo growpart /dev/nvme0n1 1注意第二个参数还是分区号数字1不是p1。我在这一步卡过把1写成了p1growpart直接报参数错误。btrfs文件系统Ubuntu 22.04如果手动选择btrfsresize2fs这套就不适用了。挂载后直接用sudo btrfs filesystem resize max /btrfs会自己扩展到分区允许的最大空间。swap挡路有些同学安装系统时用了手动分区布局可能是/boot、/、swap这样的顺序根分区不在磁盘末尾后面还有swap分区。这种情况下growpart没法直接扩展根分区因为swap把路堵住了。处理思路有两种一种是把swap删除重建到别处风险高另一种是干脆别从这个方向走把VMware扩容出的空间直接新建分区并挂载到/data也能解决问题就是绕一点。从工程角度讲我建议能不动swap就不动保持简单。4. 实操演示从20G扩到50G的完整过程前面讲了一堆方法和原理这一节我带你把完整流程走一遍带着真实的命令输出走。假设虚拟机是Ubuntu 22.04 Server版当初安装时选了LVM根文件系统是ext4。4.1 VMware层操作关机后右键虚拟机 - 设置 - 硬盘 - 工具 - 扩展输入50G等待提示成功。4.2 Ubuntu系统内操作开机打开终端先看当前状态df -hT / lsblk扩容前输出Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/ubuntu--vg-ubuntu--lv ext4 19G 17G 1.6G 92% /lsblk显示/dev/sda为20G。扩容后VMware扩展完成但Ubuntu未处理Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/ubuntu--vg-ubuntu--lv ext4 19G 17G 1.6G 92% /但lsblk里/dev/sda已经是50G/dev/sda2还是19G。然后重启一下让分区表彻底刷新sudo reboot重启后依次执行sudo growpart /dev/sda 2输出里会有CHANGED: partition2 start... old: end... new: end...这样的信息说明分区已经被扩到磁盘末尾。继续sudo pvresize /dev/sda2 sudo lvextend -l 100%FREE /dev/ubuntu-vg/ubuntu-lv sudo resize2fs /dev/ubuntu-vg/ubuntu-lvlvextend输出Size ... (free) Logical volume ubuntu-lv successfully resized.resize2fs输出文件系统的大小变化。最后确认df -hT / lsblk输出变成Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/ubuntu--vg-ubuntu--lv ext4 49G 17G 31G 36% /到这里20G成功变成49G可用空间从1.6G变成31G整个扩容完成。4.3 非LVM的完整流程对照如果你的系统不是LVM操作更简单sudo growpart /dev/sda 2 sudo resize2fs /dev/sda2 df -h /这一套下来同样能解决。区别就是少了pvresize和lvextend两步。4.4 如何验证扩容是否“干净”我有个习惯扩容完以后用两道检查df -h sudo parted /dev/sda unit GB print freeparted print free可以看到整块磁盘的未分配空间是否为零。如果分区已经扩到磁盘末尾那么 “Free Space” 应该显示0.00GB或者一个非常小的尾部余量。如果还有几G的空闲说明分区没扩到底或者还有未分配区域这时候系统内的空间还没完全释放干净需要检查是不是分区号搞错了或者后面还有别的分区挡着。5. 常见问题与排查技巧实录这一节我要分享的是我在实际操作中踩过、以及在帮别人排查时遇到频率最高的几个问题。每个问题都会有现象、原因、解决办法。5.1 VMware扩展按钮是灰色现象虚拟机关机了设置里磁盘的“扩展”还是点不动。原因最常见的是存在快照。VMware Workstation在虚拟机有快照的时候不允许修改磁盘容量。解决办法先看“虚拟机 - 快照 - 快照管理器”删除所有快照删除完再看按钮。如果按钮还灰看一下磁盘配置页面上有没有“创建一个新的虚拟磁盘”的提示以及磁盘是不是独立模式Independent。独立模式的磁盘不参与快照但某些版本同样限制扩展可以尝试用命令行vmware-vdiskmanager绕一下。删除快照是不可逆的删除后请确认当前虚拟机运行状态是你想要的。如果你在快照链上没有其他分支删除快照不会删除原虚拟磁盘的数据。5.2 扩容后df -h没变化但lsblk显示磁盘变大了现象VMware扩容成功进入Ubuntu后df -h /还是旧容量但fdisk -l /dev/sda看到整个磁盘容量已经变大。原因分区表没被扩展或者内核未重读分区表。你的分区仍然停在原来的结束位置后面的空间相当于“未分配”。解决办法先执行sudo partprobe /dev/sda或重启然后用sudo growpart /dev/sda 分区号扩展分区再用resize2fs或xfs_growfs扩展文件系统。如果growpart提示no change说明分区可能已经是磁盘末尾了直接检查文件系统扩展步骤。5.3 resize2fs报错Couldnt find valid filesystem superblock现象执行sudo resize2fs /dev/sda1时直接报错看起来像文件系统不存在。原因你的根文件系统可能不是ext4而是xfs或者你指定的分区根本不是文件系统分区比如是swap、EFI分区、LVM物理卷。最典型的错误就是LVM环境下没有先扩展逻辑卷却对物理卷分区执行resize2fs。解决办法确认文件系统类型df -hT /xfs用xfs_growfs /LVM的话先lvextend再resize2fs /dev/ubuntu-vg/ubuntu-lv注意这里resize2fs的对象是逻辑卷路径不是物理分区/dev/sda2。5.4 lvextend提示没有剩余空间现象执行sudo lvextend -l 100%FREE /dev/ubuntu-vg/ubuntu-lv报错说没有可分配的空间。原因物理卷没有扩容到分区的新大小或者卷组里还有其他逻辑卷占着可用PE。解决办法先确认sudo pvresize /dev/sda2是否真的执行成功用sudo pvdisplay看PV Size是否接近50G。再看sudo vgdisplay里Free PE数量是否为0。如果PV没问题Free PE为0说明确实有别的LV占用了空间你可以用sudo lvdisplay查看所有逻辑卷调整策略要么把空间给目标LV要么先缩小其他LV这块操作复杂度高不建议新手做。5.5 扩容后开机卡在引导界面或提示找不到系统现象VMware扩容后启动虚拟机直接黑屏或者出现 “Reboot and Select proper Boot device” 或者grub直接进入rescue模式。原因大概率是在有快照、磁盘配置异常、或者扩容过程中虚拟磁盘路径发生变化时出现的。还有一种可能是你扩错了磁盘机器里有多个虚拟磁盘你把/dev/sdb数据盘扩容了系统盘的引导没毛病但挂载点变了导致引导找错分区。解决办法虚拟机设置里确认启动磁盘是否还是原系统盘检查SCSI/SATA设备顺序。如果确认扩展的是系统盘但在启动时出错尝试重启一次进入BIOS/引导菜单手动选一次启动项。如果还是不行回到VMware把磁盘大小改回去如果还能改用快照/备份恢复。这就是为什么我一直强调要拍快照。5.6 分区表类型是MBR扩容后超过2T限制现象磁盘从1T扩到3T结果系统里看不到超过2T的部分。原因MBR分区表最大支持2T磁盘。超过这个限制必须使用GPT分区表。VMware扩容只管虚拟磁盘文件不会自动帮你把MBR转成GPT。解决办法如果磁盘MBR且要超出2T需要转换分区表为GPT。Ubuntu上可以用sudo gdisk /dev/sda的w命令转换但这操作有一定风险而且转换后如果使用的是BIOS引导模式可能还需要调整引导方式。强烈建议在安装虚拟机的初始阶段就选择UEFIGPT这样以后扩容到多大都没这个问题。如果你已经踩进MBR的坑转换前务必备份。5.7 VMware扩展时提示磁盘正在使用现象点击扩展时提示“The virtual disk is in use”之类的信息。原因虚拟机没有完全关闭或者宿主机上还有其他进程正在使用该vmdk文件。解决办法确保VMware界面里虚拟机状态是“已关机”而不是“暂停”或“挂起”。挂起状态本质还是占用着内存和磁盘文件必须恢复后彻底关机。如果确认关机了还提示占盘检查是否有vmware-vmx.exe或vmware-vdiskmanager进程残留在任务管理器里结束掉再试。6. 一些值得记住的避坑经验磁盘扩容这件事做完一次以后你就会觉得“也就这么回事”但过程中有些心得是文档里很少写清楚的。把扩容的粒度想清楚。我见过不少人从20G直接扩到100G理由是“既然扩了就大方点”。这本身没问题但如果你用的是精简置备方式Thin ProvisionVMware里显示虚耗的容量会慢慢增长。你给虚拟机100G不代表宿主机马上占用100G但随着使用会逐渐消耗宿主机磁盘。VMware Workstation里你可以把虚拟磁盘预先分配好全部空间也可以保持动态增长。扩容之后如果宿主机剩余空间紧张可能导致虚拟机无法启动或崩溃。所以扩容计划要和宿主机磁盘容量一起看。Ubuntu 22.04的LVM默认预留了少量空闲空间吗安装时LVM会自动创建swap逻辑卷所以卷组里的空间不是全部给根逻辑卷。我用100%FREE的命令把所有剩余空间给了根逻辑卷如果系统里还挂载着swap逻辑卷它依然存在只是不占用新的空间不影响系统运行。但如果你的swap本来就在卷组里且容量很小建议顺便用sudo swapon --show看下swap状态确认它没被影响。别把“扩展”和“碎片整理/压缩”混在一起。VMware的“压缩”和“碎片整理”是另一码事千万别在扩容后立刻对这些按钮产生兴趣。压缩虚拟磁盘会尝试回收未使用空间这个过程可能很慢而且对正在运行的系统有影响。一般情况下扩展完磁盘进入系统把数据整理好重启一次确认一切正常再考虑要不要做这些维护操作。最后分享一个我的习惯。扩容完成后我会趁热在虚拟机里做个新的基础快照命名类似“after-disk-resize-50g”并把老的基础快照删掉。这样以后如果再折腾别的还能回到这个“磁盘状态良好”的检查点。平时可能用不上但真遇到问题的时候这一个快照能省下好几个小时。