
搞虚拟机最烦的一件事就是磁盘当初分区的时候没给足结果用着用着就满了。我最近就在VMware里遇到这个情况ubuntu 22.04的虚拟机跑一个编译任务日志文件蹭蹭涨根分区直接给干到98%。你说重新建一台吧环境重配一遍太折腾不扩容吧系统随时可能因为写不进东西直接崩掉。所以只能老老实实走一遍VMware虚拟机磁盘扩容流程。先说清楚这篇文章解决什么问题VMware Workstation16/17都适用其他版本同理里的ubuntu 22.04虚拟机磁盘空间不够了想要在不重装系统、不丢失现有数据的前提下给虚拟磁盘增加容量并且让Ubuntu系统真正能用上这些新增空间。适合的人群是已经装了ubuntu虚拟机、Linux基础一般、第一次做磁盘扩容的开发者或运维同学。接下来我把整个流程拆开讲包括VMware层的操作、Ubuntu层的分区处理、文件系统扩容以及我踩过的几个坑。1. 扩容前的准备工作与整体思路1.1 为什么需要磁盘扩容以及扩容的原理虚拟机磁盘扩容本质上分两个层面首先是宿主机上那个虚拟磁盘文件vmdk本身要变大然后才是客户机操作系统也就是ubuntu 22.04里面分区和文件系统要感知并利用这个变大的空间。VMware里面点“扩展磁盘”按钮改的只是vmdk的容量上限它把磁盘尾部未分配的空间多划出来一段。但ubuntu系统里看到的还是原来的分区大小因为分区表里根本没有记录这些新增空间。所以很多新手卡在“我在VMware里已经扩容了20G但Ubuntu里df -h看还是老样子”这一步其实就是忽略了这个两段式原理。讲的通俗一点VMware扩展磁盘相当于你给硬盘盒换了一个更大的硬盘但硬盘盒里面的分区还是老结构新空间就是一块“未分配”的空白区。Ubuntu系统默认只管理分区表里登记过的分区不会自动去认这块空白区。所以扩容必须分成“宿主机改vmdk大小”和“客户机改分区表文件系统”两步走缺一不可。1.2 扩容前的确认事项清单动手之前我建议花两分钟确认下面几件事不然中途容易翻车宿主机剩余磁盘空间是否充足VMware扩展磁盘时要确认宿主机磁盘有足够空间容纳扩容后的vmdk大小。比如原来vmdk分配100G你要扩到160G宿主机至少还能腾出60G以上的空间否则扩容会失败。虚拟机是否关机VMware里扩展磁盘必须是在虚拟机关机状态下操作开机状态扩不了。不过在ubuntu系统内部做文件系统扩容时可以不用关机后面会讲。检查虚拟机是否有快照如果虚拟机有快照VMware里扩展磁盘时会有提示一般建议扩容前先删除快照或者先对快照处理一下否则vmdk结构复杂扩容风险大后面我会专门讲这个坑。确认当前分区表类型MBR还是GPT。MBR最大支持2TGPT才能支持2T以上。ubuntu 22.04默认用GPT的居多但也不能一概而论先用命令确认一下再操作。确认完这些就可以进入实际操作环节了。整个过程我预估耗时在十到二十分钟左右绝大部分时间花在等待扩容和格式化上真正敲命令的时间并不长。2. VMware层面对虚拟磁盘进行扩容2.1 虚拟机设置中扩展磁盘的具体操作在VMware Workstation中打开虚拟机设置路径是这样选择虚拟机 - 右键“虚拟机设置”或者点击菜单栏里的“编辑虚拟机设置”- 切换到“硬件”选项卡 - 点击“硬盘” - 右侧会有“磁盘信息”和“实用工具”区域里面有一个“扩展”按钮。点击“扩展”后会弹出对话框让你输入扩展后的最大磁盘大小注意这个值是你期望的最终大小不是“增加多少”。比如原来是40G你想再加20G这里要填60。系统会给出一个最大可扩展范围一般情况下不要超过宿主机剩余空间。填好后点击“扩展”等待进度条走完即可。整个过程很快一般几十秒到几分钟取决于磁盘大小和宿主机的磁盘性能。完成后点击确定关闭设置窗口这时候vmdk文件容量已经变大了但ubuntu系统内还没有体现。有个细节值得说如果你在VMware界面里发现“扩展”按钮是灰色的多半是虚拟机处于开机状态或者虚拟机设置了加密磁盘。前者关机即可解决后者需要先在虚拟机设置里取消磁盘加密这个比较少见但遇到过的人会卡得很痛苦。2.2 扩容生效的几个关键细节第一扩展过程中一定别去动宿主机的其他写入操作尤其是别在扩展的同时跑一些大文件拷贝任务。我遇到过扩展到一半宿主机空间不足导致vmdk损坏的情况虽然概率不高但一旦发生就得靠备份恢复了。第二扩展后如果虚拟机有多个快照VMware会在界面上提示“此虚拟机具有快照无法扩展”。当时我的做法是先把快照都合并掉删除快照然后再执行扩展。删除快照最好在虚拟机关机状态下进行并且要确保对应的快照已经不再需要因为合并后会丢失快照点。第三如果你用的是共享虚拟磁盘或者RDM裸设备映射就不能在Workstation界面上直接扩展。不过正常单机使用场景基本不涉及这些知道有这个限制就行。第四扩展完成后建议顺手在宿主机上看一眼vmdk文件的大小变化确认它确实增大了。有时候因为磁盘类型是精简置备thin provisioning文件本身的大小不会立刻变成目标值而是随使用逐渐增长。这个不影响扩容结果只是让一些“看文件大小”判断的朋友虚惊一场。3. Ubuntu系统层面对新增空间进行分区规划3.1 确认系统磁盘设备信息VMware层面扩完后启动ubuntu 22.04虚拟机登入终端。第一件事是用lsblk或者fdisk -l看一下现在的磁盘状态。lsblk正常情况下你会看到类似这样的输出NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 60G 0 disk ├─sda1 8:1 0 1M 0 part ├─sda2 8:2 0 1G 0 part /boot └─sda3 8:3 0 39G 0 part └─ubuntu--vg--ubuntu--lv 253:0 0 39G 0 part /注意这里sda的总大小已经显示60G了但sda3分区还是39G根文件系统也还是39G。这个差异就是新增的约21G空间。接下来我们要做的是把这段未分配空间变成可以用的分区和文件系统。这里我多说一句有的朋友会发现自己的设备名是nvme0n1而不是sda这是因为虚拟磁盘类型选的是NVMe而非SCSI。操作逻辑完全一样只是把命令里的/dev/sda替换成/dev/nvme0n1分区名变成nvme0n1p1这样的格式别被名字吓到。3.2 使用fdisk创建新分区分区操作有两种常见思路一种是把新增空间单独划成一个新分区挂载到某个目录比如/data另一种是把新增空间合并到现有根分区。这里先讲第一种更简单也更稳妥适合大多数场景。使用fdisk操作sudo fdisk /dev/sda进入fdisk交互界面后依次输入输入p查看当前分区表输入n创建新分区。此时fdisk会提示分区号、第一个扇区等信息一般直接按回车接受默认值即可最后一个扇区默认会用到磁盘末尾输入p再次查看分区表确认新分区比如sda4已经创建输入w写入分区表并退出注意如果磁盘是GPT分区表fdisk会询问是否创建GPT分区跟着默认走就行。写入完成后用partprobe让内核重新读取分区表sudo partprobe如果有报错说分区忙说明有文件系统还在使用这个设备重启一下再执行也可以。这里有个特别容易犯的错fdisk输出里的扇区数很多人看着头晕干脆乱填。实际上你只需要记住创建分区时直接按回车接受默认的起始扇区和结束扇区系统会自动把新分区放到可用空间的头部和尾部根本不用手动计算。我见过有人非要自己填数字结果把原有分区给覆盖了数据全没太冤了。3.3 分区类型与文件系统选择新分区创建后还要格式化。选择什么样的文件系统取决于你的用途。ubuntu 22.04默认数据盘用ext4最省心如果你想以后方便在不同Linux发行版之间迁移也可以选xfs。这里我以ext4为例sudo mkfs.ext4 /dev/sda4如果新增空间大于2T注意分区表必须是GPT且格式化时建议加上-T largefile参数或者用xfs否则ext4在大容量下的inode分配策略效率不高。当然单机虚拟机一般到不了这个规模。格式化完成后可以给分区创建一个标签方便后面挂载时识别。我用的是sudo e2label /dev/sda4 data格式化是个不可逆操作执行前务必再三确认分区编号没有写错。最好的确认方式就是lsblk再看一遍认清sda4到底对应哪一段空间。多说一句如果你和我一样有强迫症格式化的时候用-m 0参数把保留块比例降为零对纯数据分区来说能省出不少空间比如10T数据盘能多出几十G可用容量还是挺香的。4. 文件系统扩容与挂载配置4.1 格式化新分区并创建挂载点接下来的事情就简单了把新分区挂载到目录上。先创建挂载点比如/datasudo mkdir -p /data sudo mount /dev/sda4 /data这时候再执行df -h你应该能看到/dev/sda4已经挂载在/data上容量大概就是你新增的空间大小可能略小一点因为文件系统本身要吃掉一部分metadata空间这是正常现象。比如你新增了20G格式化后df -h显示的可能是19.2G或者18.6G具体数值取决于块大小和文件系统保留块。很多人看到这个数值会以为扩容“缩水”了其实没有这是文件系统自身的开销任何分区方案都一样。4.2 自动挂载配置fstab手动挂载重启后就失效了所以要把挂载信息写入/etc/fstab。先获取分区的UUIDsudo blkid /dev/sda4会输出类似这样的一行/dev/sda4: UUIDa1b2c3d4-xxxx-xxxx-xxxx-xxxxxxxxxxxx TYPEext4然后编辑/etc/fstab在文件末尾追加一行echo UUIDa1b2c3d4-xxxx-xxxx-xxxx-xxxxxxxxxxxx /data ext4 defaults 0 2 | sudo tee -a /etc/fstab加完之后建议用mount -a检查一下配置是否语法正确sudo mount -a这一步很重要很多人fstab写错了下次开机直接进不去系统或者至少卡在紧急模式。别问我怎么知道的我在别的机器上就踩过这个坑所以强烈建议改完fstab先验证。顺带讲一下fstab最后一列那个“2”的含义0表示不检查1表示最先检查一般只有根分区用2表示在根分区之后检查。数据盘填2是常规做法但不是必须填0也不会有问题只是开机时少了文件系统自检环节。4.3 直接扩展根分区的方法growpart resize2fs如果你不想新建分区而是想把新增空间直接合并到现有根分区做法也不复杂。前提是你的根分区在虚拟磁盘的最后一个分区并且在分区表里它后面还有空闲空间。这种情况下用growpart和resize2fs就能在线扩容。安装工具如果缺失sudo apt update sudo apt install cloud-guest-utils然后执行sudo growpart /dev/sda 3这条命令会把sda3这个分区扩展到磁盘末尾也就是吃掉新增的未分配空间。注意growpart的语法是“设备 分区号”中间有空格不是/dev/sda3这种写法。扩展完分区后查看当前根文件系统的设备名df -h /如果根分区对应的是/dev/mapper/ubuntu--vg--ubuntu--lv那说明系统用了LVM可以先用lvextend扩展逻辑卷再执行resize2fs如果直接是/sda3那么直接resize2fs即可sudo lvextend -l 100%FREE /dev/mapper/ubuntu--vg--ubuntu--lv sudo resize2fs /dev/mapper/ubuntu--vg--ubuntu--lv执行完成后再df -h看一下根分区的容量应该已经变大了。这里提醒一句LVM逻辑卷的lv名称在ubuntu 22.04上默认带两个连字符的转义写法实际上LVM创建时名字是ubuntu-vg/ubuntu-lv映射到/dev/mapper/ubuntu--vg--ubuntu--lv是因为udev对连字符做了转义。用lsblk看清楚再操作别一股脑照抄命令。还有一个细节growpart扩展分区后你可能会看到内核提示“分区表已改变需要重启”。如果出现这个提示说明内核还没完全接受新分区表这时候resize2fs会失败或者无效。稳妥做法是先reboot一次再执行resize2fs别嫌麻烦。我在没有LVM的纯净ubuntu系统上测试过有时不重启也能直接resize但既然提示了还是重启一下心里踏实。5. 常见问题与排查技巧实录5.1 虚拟机快照导致扩容失败的坑我在做这次扩容时第一反应是去VMware界面点“扩展”结果弹窗提示“无法扩展磁盘因为此虚拟机具有快照”。当时这台虚拟机确实留了两个快照是为了测试某个软件环境备份用的。没办法只能先删除快照。删除快照的操作在“虚拟机 - 快照 - 快照管理器”里选中对应快照点“删除”VMware会把快照文件合并到主vmdk上。这个合并过程也是需要时间的而且一定要在虚拟机关机状态下做。合并完成后再回去点“扩展”就正常了。这个坑特别影响新手因为很多人根本不知道有就不能扩展磁盘。以后如果遇到扩容需求建议在创建虚拟机的时候就规划好快照要么不留要么等在扩容前统一清理。我后来为了写这篇总结又专门在一个带快照的测试虚拟机上试了一次确认弹窗提示信息在不同版本VMware里都差不多。如果你用的是VMware Workstation Pro 17记得在删除快照后看一眼虚拟机的vmdk文件列表确认不存在-snapshot之类的增量文件后再扩容。5.2 磁盘空间显示未生效的排查思路有朋友问VMware里扩展了ubuntu系统里lsblk也能看到总大小变了但df -h看到的跟原来一样这是怎么回事这种情况多半发生在只扩容了分区表没创建新分区或者分区表更新完但文件系统没resize的情况。排查思路很简单lsblk # 磁盘大小和分区大小是否一致 df -h # 文件系统实际可用空间 sudo partprobe # 重新读取分区表如果lsblk中sda总大小已经变大但分区大小没变说明新增空间还在末尾空闲着需要growpart或者fdisk新建分区来占用它。如果分区大小已经变大但df -h没变说明文件系统还是老样子对ext4需要执行resize2fs。还有一类情况比较隐蔽你的根分区用了LVM而逻辑卷大小没跟着变。这时候用lvs先看一下逻辑卷大小再用lvextend扩容逻辑卷最后resize2fs。很多人挂在“分区分了但忘了扩逻辑卷”这一环lvs一眼就能看出来。我把这个排查思路整理成了速查表方便按图索骥现象可能原因解决方式lsblk总大小变小未变VMware层没扩展成功关机后重新执行扩展总大小变大但分区大小没变分区表没更新或没建新分区partprobe后growpart/fdisk分区大小变大但df不变文件系统没resizeresize2fsext4LVM下分区变大但df不变逻辑卷没扩展lvextend resize2fs挂载后重启不生效fstab没写或写错检查fstab UUID后mount -a5.3 不同场景的方案选择建议说到底磁盘扩容并没有一个“唯一正确答案”完全取决于你的使用场景数据盘挂载到独立目录适合新增分区格式化fstab的方案好处是系统盘和数据盘分离重装系统时数据盘不受影响。合并进根分区适合根分区紧张但又不想动分区结构的场景整个操作可以在线完成不用重启很爽。运行数据库服务建议用LVM方案或者直接在虚拟磁盘层面多划一个卷组后期弹性更大不用来回动分区表。测试环境的日常备份如果是用来验证软件或练手建议直接在扩容完成后做一次干净快照后续坏了随时回滚。我个人在实际操作中的体会是如果条件允许优先用LVM来做数据盘规划这样后续扩容简直就是改个参数的事。这次是因为虚拟机当初没有规划LVM数据盘只能用传统分区方式补课好在也顺利解决了。最后再分享一个细节扩容完成后记得重新生成一下虚拟机的备份或快照把这台已经稳定的环境固下来以后再有新需求就不用从头再来。还有个小技巧扩展完根分区后可以顺手清理一下apt缓存和journal日志通常能腾出好几个G有时候都不用扩容了。