最近有几个朋友几乎是同一时间跑来问我同一个问题在VMware里把Rocky Linux虚拟机的硬盘从20GB调到50GB为什么进系统后df -h还是显示原来的容量其实这不怪VMware也不怪Rocky Linux而是因为“虚拟磁盘变大”只是第一步后面还有分区表、物理卷、逻辑卷、文件系统四层需要逐级“跟进”。这篇文章就是完整讲怎么在VMware里给运行中的Rocky Linux扩容磁盘覆盖VMware Workstation和vSphere两种常见环境适合运维、开发者和自己折腾虚拟机的朋友。你不需要对LVM有多深的理解只要会 sudo 并且能按命令顺序执行就行。强烈建议先看第1章确认清楚自己机器的磁盘布局再动手不然很容易扩错分区。1. 先搞清楚磁盘布局LVM、分区表与文件系统1.1 为什么要先看布局拿实体房子打比方虚拟磁盘是一块“地皮”分区是地皮上用隔断分出来的“房间”LVM则是一套可以随时拆改的“智能隔墙系统”文件系统是房间里已经摆好的“家具和收纳柜”。你在VMware里把地皮从20平米扩到50平米不代表房间隔断自己会外移更不代表收纳柜会自己变大。要从20GB真正用上50GB必须把地皮边界、房间隔断、智能隔墙系统、收纳柜四层全部更新一遍。跳过任何一层都会出问题。最常见的情况是VMware里磁盘显示50GB但lsblk里分区仍是20GB这就是分区表没更新。或者分区表已经变大但pvs里物理卷还是20GBLVM根本没感知。又或者PV、VG都正常了但逻辑卷没扩展df -h照样不变。所以第一步不是急着敲命令而是先看清楚当前是什么布局。1.2 用五个命令快速确认当前状态在终端里依次执行下面几条把输出先贴到一个临时文件里方便后面对照。lsblk df -hT sudo pvs sudo vgs sudo lvs sudo fdisk -l /dev/sda我见过很多教程只说lsblk这对LVM场景不够。lsblk能看出磁盘和分区结构但看不出文件系统类型、逻辑卷路径、物理卷归属而这些在后面都要用到。参考一个典型的Rocky Linux默认安装输出NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 20G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 19G 0 part ├─rl-root 253:0 0 17G 0 lvm / └─rl-swap 253:1 0 2G 0 lvm [SWAP]df -hT告诉你根文件系统是 xfs 还是 ext4这个信息决定了最后一步要跑xfs_growfs还是resize2fs千万别搞混。pvs、vgs、lvs则分别显示物理卷、卷组、逻辑卷的当前容量和剩余空间。fdisk -l用来确认分区表类型是 GPT 还是 MBR看“Disklabel type”字段因为后面分区扩容工具的选择会受它影响。1.3 两种常见布局怎么分辨绝大多数 Rocky Linux 用安装器默认选项装出来的布局是这样的/boot单独一个 xfs 分区比如sda1占1GB剩下的磁盘空间全部给一个 LVM 物理卷比如sda2在卷组rl下面再划分出root和swap两个逻辑卷。这种布局最省心也是本文主流程。还有一种情况是你或同事在安装时手工分区根目录直接落在普通分区上比如/dev/sda3文件系统是 xfs 或者 ext4没有LVM。这种布局扩容思路不一样不需要碰 lvm 相关命令直接在分区和文件系统两层操作即可。我遇到过有人在自定义安装时把/分到 xfs 独立分区然后照着LVM教程敲lvextend手忙脚乱半天发现没有PV。所以先别急着动手对照lsblk和df -hT判断自己是哪种。如果看到sda2下面还有rl-root、rl-swap这种带 lvm 字样层级就按第3、4章走。如果看到/直接挂在sda3上就跳过分区之后的LVM两步直接执行分区扩容和文件系统扩容。这篇文章后面以最常见的 LVM 布局为主线。2. VMware层面扩容Workstation和vSphere分别怎么操作2.1 VMware Workstation关机后“Expand”VMware Workstation 是很多人本机调试的首选操作很简单但有三个细节容易踩坑。首先必须把虚拟机关机。Workstation 里的“Expand扩展”按钮在开机状态通常是灰色的因为你不能在磁盘运行时修改它的容量上限。这是Workstation和 vSphere 的一个明显区别vSphere 部分配置支持在线热扩容Workstation 一般不行。关机后选中虚拟机点击“Edit virtual machine settings - Hard Disk”然后点右边磁盘工具区或者按钮区域里的“Expand”按钮输入新的最大磁盘大小比如从20改为50确认即可。这一步只是在虚拟磁盘文件vmdk的元数据层面把“最大容量”改大不会删除你原来的数据也不会立即给虚拟机内部写入任何东西。第二个细节磁盘文件格式会影响扩容速度。如果虚拟机磁盘被拆分成了多个2GB小文件split into 2GB files扩容时可能需要更长时间因为要更新多个文件的大小信息。如果是一个单文件vmdk速度会快很多。不过这个差异只是时间问题不影响最终结果。第三个细节如果 Workstation 提示无法扩容十有八九是虚拟机存在快照特别是多个快照导致磁盘文件链变化。遇到这种情况建议先删除不用的旧快照或者把快照合并后再试。Workstation 的快照功能虽然方便但长时间保留会造成磁盘文件膨胀也会干扰扩容操作。我自己的习惯是扩容这种改动磁盘结构的操作前只保留一个“当前状态”的快照操作完成后确认无误再删除快照。2.2 vSphere / ESXi在线扩容和离线扩容如果在 vCenter 或 ESXi 上管理虚拟机操作入口在“Edit Settings”里找到对应的“Hard Disk”把容量字段改成更大的值然后点确定。vSphere 6.5 之后对部分虚拟SCSI磁盘支持在线扩容也就是说虚拟机可以不用关机直接在运行状态下把磁盘容量调大系统内部重扫之后就能看到新容量。但我要提醒一句能在线扩不代表你应该无脑在线扩。生产环境里磁盘扩容往往伴随着LVM和文件系统操作如果中间某个环节出问题需要回滚关机状态操作更容易配合快照恢复。我的建议是如果业务允许短暂停机优先关机和做快照后再扩容如果业务完全不能停再走在线扩容并在扩容后尽快在系统内做完所有后续操作缩短“磁盘已变大但文件系统还没变”的中间状态。无论在线还是离线扩容前都要确认数据存储的剩余空间足够。比如当前vmdk已经用了80GB你想扩到100GB那么数据存储上至少还要有20GB以上的空闲空间。Thin 磁盘虽然实际占用小但扩容可能触发存储分配空间不足会直接失败。2.3 动手前先做快照这句话我说在前面凡是要动磁盘结构和分区表务必先打快照或做完整备份。分区扩容不是普通的软件配置修改一旦分区表写坏最坏情况是整块盘的数据都读不出来。虽然 growpart 这类工具已经很成熟但谁也不能保证意外不会发生比如突然断电、命令写错盘符、把分区号搞错。VMware Workstation 可以直接给虚拟机打快照vSphere 也可以在虚拟机上右键生成快照。但要注意“独立磁盘”Independent模式的虚拟磁盘不支持快照。如果你发现虚拟机是独立磁盘要么改成普通模式要么用其他备份手段比如把整个虚拟机备份到其他存储。打完快照之后还有一个很多人忽视的问题快照不是拿来长期顶用的。快照文件越积越大会影响VMware性能而且旧快照的存在可能影响后续磁盘扩展。正确的节奏是打快照 - 完成磁盘扩容 - 启动系统验证数据正常 - 确认无误后尽早删除快照。我遇到过有人在vSphere上扩容完虚拟机后忘了删快照结果跑了三个月快照文件比系统盘本身还大数据存储差点爆掉。3. 让虚拟机“看见”新空间刷新磁盘与扩大分区表3.1 确认系统盘是否识别新大小VMware层面扩容完成后先正常启动系统如果是关机扩容用lsblk看磁盘整体大小。lsblk正常情况下sda这一行的大小应该已经变成新的容量比如 50G。如果显示的还是老容量说明系统没重新扫描SCSI设备。一般关机后启动会自动识别但如果是 vSphere 在线扩容则可能需要手动刷新。手动刷新有两个常用办法。一个是走SCSI rescan路径echo 1 /sys/class/scsi_device/0:0:0:0/device/rescan更简单粗暴的版本for f in /sys/class/scsi_device/*/device/rescan; do echo 1 $f; done还有个办法是重启虚拟机。说实话如果条件允许重启是最干净的刷新方式。别担心重启会丢数据你的数据都已经落盘最多是应用需要重新拉起。我在给一台长期运行的Rocky虚拟机做在线扩容时遇到过lsblk死活不更新换了好几组SCSI路径都无效最后重启一次就全好了。确认sda已经显示新容量后再看sda2这个分区它大概率还是原来的大小。因为磁盘容量变大只是把磁盘末尾的空闲区域暴露出来分区本身不会自动长大。接下来的任务是修改分区表让分区“吃满”磁盘尾部的新空间。3.2 growpart推荐的分区扩容方式修改分区表一部分老资料会教你用fdisk删除分区再重建这样能把分区结束扇区改到磁盘末尾但对新手太危险删除分区的一瞬间如果手抖输错编号或者中途断电数据直接没了。我不推荐用这种“先删后建”的方法来扩展有数据的系统分区。推荐用growpart它的作用就是把某个分区的结束位置往后扩展到磁盘末尾只改分区表里的“结束扇区”字段不碰起始位置和数据区安全性高得多。Rocky Linux 默认源里一般都有这个工具如果没有先安装sudo dnf install -y cloud-utils-growpart用法是sudo growpart /dev/sda 2注意前面是设备后面是分区号中间有空格。如果系统盘是/dev/nvme0n1分区是nvme0n1p2命令就写成sudo growpart /dev/nvme0n1 2执行成功后会有类似输出CHANGED: partition2 start2048 old: end41943039 end104857599看到 CHANGED 基本就成功了。之后再用lsblk看sda2应该已经是49G左右。如果growpart提示分区表类型不支持或者报错那可能分区表是GPT且存在一些边界情况这时候用parted会更稳。有一点值得解释growpart并不是直接把分区扩展到“磁盘总大小”而是扩展到“该分区后面剩余全部空间”。所以如果你的磁盘尾部还有别的分区它不会跨过去。在我们这个场景里sda2后面没有其他分区结果就是把磁盘剩余空间全部纳入。3.3 parted resizepart 作为备选有些读者可能更习惯parted它是分区工具里的“正规军”功能比growpart更全。扩展分区可以用sudo parted /dev/sda resizepart 2 100%意思是把第2个分区扩展到磁盘末尾100%。如果系统提示“确实要执行吗”或者问是否修复GPT备份表确认即可。不过parted的交互式提示在不同版本里差异比较大有的直接警告你分区正在使用有的会让你输入yes新手容易卡住。所以我的倾向是能用growpart就别绕弯子parted更多是兜底选项。只有当growpart工具装不上、或者你明确知道分区表类型而growpart又报错时再改用parted resizepart。另外用parted前建议先看一下当前磁盘的分区布局sudo parted /dev/sda print free这个命令会把分区和空闲空间都打出来你能直观看到磁盘末尾多出的空间在哪避免改错分区号。4. 扩展 LVM 与文件系统真正把空间用起来4.1 pvresize让LVM感知物理卷变大分区表扩展完成只是地基打好了LVM还一无所知。此时用pvs看一下物理卷大小你会发现/dev/sda2对应的PV还是原来的19G。要让LVM识别到分区变大执行sudo pvresize /dev/sda2执行完再用pvs查看sudo pvs输出里的PSize应该已经变成49G左右。如果pvresize执行后pvs没变化大概率是分区扩展那一步没成功回头检查lsblk里sda2大小是否真的变大了。为什么需要pvresize因为LVM维护的元数据里有一个“物理卷当前容量”字段它默认记录的是分区表变更前的大小。虽然分区表已经指向更大的空间但LVM只认自己元数据里的数值。pvresize做的就是读取分区的新大小同步更新物理卷的容量记录。这一步非常关键很多人分区表扩了但跳过了pvresize结果后面lvextend一直报“没有空闲空间”。4.2 lvextend把空闲空间划给目标逻辑卷物理卷变大后卷组的可用空间也会跟着变大。用vgs能看到VFree字段多出了大约30G的剩余空间。但卷组的剩余空间不会自动分配到某个逻辑卷上你需要显式指定要把空间给谁。查看逻辑卷路径sudo lvs默认情况下Rocky Linux 的root逻辑卷路径可能是/dev/mapper/rl-root但请不要完全照抄以lvs实际输出为准。把VG所有剩余空间都给rootsudo lvextend -l 100%FREE /dev/mapper/rl-root如果你只想增加固定的30G不想把VG里所有空闲都塞进去用sudo lvextend -L 30G /dev/mapper/rl-root-l后面的单位是“逻辑扩展块数量”%FREE表示按空闲空间的百分比计算100%FREE就是全部空闲空间。-L后面的单位是容量大小比如30G。两个参数很容易记混-l小写用在百分比场景-L大写用在具体容量场景。如果你不想动原有的VG空闲空间只想精确增加等于“VMware扩容带来的增量”那么用-L 30G这种明确增量更安全。执行后建议再用lvs确认逻辑卷大小已经变化。如果空间给的是root你可能会看到root从17G变成47G。注意swap逻辑卷不会自动变大想要swap变大得单独处理但通常生产环境没必要为了swap去做全盘扩容。4.3 xfs_growfs 还是 resize2fs按文件系统类型操作逻辑卷变大文件系统还是原样。最后一步是扩展文件系统这一步必须严格按照文件系统类型选择命令否则报错是小事把文件系统搞坏就麻烦了。用df -hT看根文件系统类型。Rocky Linux 默认根是xfs这种情况执行sudo xfs_growfs /注意xfs_growfs 默认会把挂载点所在文件系统扩展到逻辑卷支持的最大容量不需要指定大小。xfs 支持在线扩展所以无需卸载根分区。看到 “data blocks changed from … to …” 之类输出就说明成功了。如果你的根文件系统是ext4比如自己安装时手动选过那就用sudo resize2fs /dev/mapper/rl-rootresize2fs 同样支持挂载状态下在线扩展。如果提示“操作需要离线”再考虑卸载但在我经验里只要操作正确ext4在线扩展没问题。最后用df -h验证df -hT此时根目录应该已经显示新容量。到这一步VMware扩容、分区扩展、物理卷扩展、逻辑卷扩展、文件系统扩展五个环节就全部完成了。5. 实操复盘20GB 扩到 50GB 的完整过程5.1 扩容前的状态与备份为了让你对整个过程心里有底我用一台测试虚拟机复盘一遍。系统是 Rocky Linux 9默认LVM布局根文件系统是 xfs虚拟磁盘20GB。扩容前的关键状态如下lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 20G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 19G 0 part ├─rl-root 253:0 0 17G 0 lvm / └─rl-swap 253:1 0 2G 0 lvm [SWAP]df -hT / Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/rl-root xfs 17G 5.2G 12G 31% /我先给虚拟机打了一个VMware快照然后关机在Workstation里把磁盘从20GB扩展到50GB。如果你在vSphere环境可以尝试在线扩容但从稳妥角度我仍然建议先把快照做好。5.2 从VMware到文件系统的命令执行记录开机后lsblk能看到磁盘整体变成50GBsda 8:0 0 50G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 19G 0 part ├─rl-root 253:0 0 17G 0 lvm / └─rl-swap 253:1 0 2G 0 lvm [SWAP]注意sda是50G但sda2还是19G。接着扩分区sudo growpart /dev/sda 2输出CHANGED: partition2 start2048 old: end41943039 end104857599再看lsblk分区已经变成49G。接着让LVM感知sudo pvresize /dev/sda2 sudo pvspvs输出里PV Size从19G变成49G。然后扩展逻辑卷sudo lvextend -l 100%FREE /dev/mapper/rl-root sudo lvslvs里root从17G变成47Gswap保持2G不变。最后扩展文件系统sudo xfs_growfs /到这里整套命令就算走完了。整个过程最核心的顺序我再说一遍growpart扩分区 - pvresize扩物理卷 - lvextend扩逻辑卷 - xfs_growfs扩文件系统。这个顺序颠倒任何一个环节都可能报错比如在pvresize之前就执行lvextendLVM根本看不到新增空间。5.3 验证结果与删除快照完成后的最终状态lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 50G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 49G 0 part ├─rl-root 253:0 0 47G 0 lvm / └─rl-swap 253:1 0 2G 0 lvm [SWAP]df -hT / Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/rl-root xfs 47G 5.2G 42G 12% /数据都在可用空间从12G变成42G。确认无误后删除扩容前打的VMware快照。删除快照时VMware会把快照数据合并回原磁盘这个过程可能需要一点时间和虚拟磁盘大小、快照数据量有关耐心等待完成即可。6. 常见问题、排查技巧与我的经验6.1 快速排查对照表我把实际操作中容易遇到的问题整理成一张表适合出问题时逐行对着查现象可能原因解决办法lsblk里sda仍是旧容量未重新扫描SCSI设备或虚拟机未重启执行 rescan 命令或重启虚拟机growpart报错无法扩展分区表类型特殊或分区号写错用parted /dev/sda print free确认分区号改用parted resizepartpvresize后pvs没变化分区没实际变大或PV设备路径不对回头检查lsblk确认分区大小和PV路径lvextend提示没有空闲空间卷组VFree为0物理卷未resize先执行pvresize再用vgs看剩余空间lvextend成功后df没变化文件系统未扩展xfs 执行xfs_growfs /ext4 执行resize2fs /dev/mapper/...xfs_growfs报错“not a mount point”参数写错或想把挂载点误当设备xfs_growfs 后直接跟挂载点比如xfs_growfs /resize2fs报错“doesnt look like an ext文件系统是xfs却用了resize2fs改用 xfs_growfsVMware里Expand按钮灰色虚拟机未关机或磁盘是独立模式关机后再操作检查磁盘是否设置为独立扩容后空间给了root但想给/home逻辑卷路径写错或分配策略不对用lvs确认/dev/mapper/rl-home路径再lvextend目标改为它这张表不是让你死记硬背而是提醒你每个命令执行完都回头看一眼上一条命令有没有真的生效。扩容链路里每一层都卡住过新人而排查方法几乎是套路化的。6.2 多次扩容后总结的几条经验我在生产环境处理过很多次Linux磁盘扩容有几点体会比较深。第一永远先确认文件系统类型再决定最后一个命令是xfs_growfs还是resize2fs。xfs 设计上只能扩不能缩ext4 虽然能缩但操作复杂也不建议在生产环境乱搞。所以扩容前想清楚目标容量别扩多了又要缩回来xfs 缩不回来。第二如果要把空间分给/home而不是/不要把lvextend后面那个路径写错。很多时候大家照着教程写死/dev/mapper/rl-root但实际机器上/home是独立逻辑卷空间全部被塞给/了。正确做法是先用lvs确认逻辑卷路径再执行lvextend -L 30G /dev/mapper/rl-home最后xfs_growfs /home。第三在线扩容后如果 Linux 不认新空间先partprobe刷分区表再考虑 rescan 和重启。我没有一次是在完全不做刷新操作的情况下热扩容后lsblk立刻显示新容量的。Workstation 关机扩容则没有这个问题开机自然识别。第四快照处理要果断。扩容前打快照、扩容后删快照这个节奏虽然简单但很多人做不到因为“怕删了就回不去了”。我后来养成的习惯是确认数据正常后立即删旧快照删不掉再排查原因不要留着一个越来越大的快照在后台默默消耗存储。快照留太久最终占的磁盘空间会超过你的预期也会让后续扩容操作变得极其缓慢。最后再分享一个我自己的小习惯执行扩容操作时把每一步命令和输出都贴到本地日志里特别是growpart和xfs_growfs的输出。万一中途出问题这些日志可以帮你快速定位是哪一层没跟上。操作之前也可以顺手记录一下旧状态的lsblk、df -hT、lvs输出事后悔悔都来不及的时候你会发现这些记录比什么教程都管用。