尧图精选

CentOS Stream 9 根分区在线扩容指南:LVM操作全流程

🕒 发布时间:2026/10/2 18:27:13 📁 来源:尧图网络
1. 开始之前先搞懂为什么要在线扩容根分区前几天我手上一台CentOS Stream 9的测试机又报警了df -h一看根分区用了97%日志一查全是容器镜像和依赖包撑爆的。这种事在真实服务器上太常见了尤其是那些一开始只给根分区分了50GB的机器跑上几个月业务再省着用也会见底。这时候你有两个选择一个是停机加盘重装系统数据迁移、服务下线想想都头皮发麻另一个就是今天这篇要讲的——用LVM在线扩容根分区。所谓在线就是指不需要重启系统不需要停机维护直接在跑着的机器上把根分区空间变大。这活儿在CentOS Stream 9上做起来其实不难但有几个关键点必须先搞清楚否则很容易把引导搞坏最后只能救援模式见。先说个基本概念。LVM的全称是Logical Volume Manager逻辑卷管理它把磁盘空间拆成三层来管物理卷PVPhysical Volume、卷组VGVolume Group、逻辑卷LVLogical Volume。你可以把PV理解成一块块原材料VG是一个大池子LV就是从池子里划出来分给系统用的逻辑分区。根分区挂载的就是LV所以扩容的本质就是给池子加原料PV扩容或新增PV、扩大池子VG扩容、再从池子里多划水出来给LVLV扩容最后让文件系统感知到这个变化文件系统扩容。这套机制最大的好处就是你不再被物理分区的大小绑死。以前传统的分区方式根分区就是一个固定大小的分区磁盘满了只能rebuild机器或者用GParted之类的工具离线调整非常痛苦。而LVM允许你把多余的空间灵活分配到任意LV上而且全程在线生产环境也能操作。这篇教程会把每一步都拆开讲包括查看现状、扩容物理磁盘、创建分区、扩容PV/VG/LV、最后扩容文件系统。我尽量按一个纯小白的操作顺序来写命令直接给全附带说明每一步在干什么、为什么这么干。你只要照着敲就能把根分区从濒临爆满变成从容够用。2. 开始前的准备工作看清家底再动手2.1 确认系统版本和磁盘布局在敲任何命令之前先确认你的系统环境。虽然标题写的是CentOS Stream 9但这套流程在RHEL 9、Rocky Linux 9、AlmaLinux 9上通用甚至Kylin Linux麒麟这类国产系统也是同一套LVM逻辑。登录服务器后先跑几个只读命令不产生任何修改cat /etc/redhat-release确认确切的系统版本正常情况下会输出CentOS Stream release 9。lsblk这个命令我每次都会先跑它能一眼看到磁盘、分区、LVM的层级关系。一个典型的LVM布局输出大概长这样NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS vda 252:0 0 200G 0 disk ├─vda1 252:1 0 1G 0 part /boot └─vda2 252:2 0 49G 0 part └─vg0-root 253:0 0 40G 0 lvm /注意看这里vda2的大小是49G它作为PV被放进了vg0这个卷组然后从卷组里划分出了vg0-root这个LV挂载在根目录/。这就是典型的单VG单LV布局云厂商的CentOS Stream 9镜像基本都是这个套路。再跑一下df -h看看真实的使用情况df -hvgextend vg0 /dev/vda3然后再次运行vgs验证vgsVG的大小会从49.00g变成199.00g。注意这里的大小前面有个符号这是VG缩略显示的特性表示数字在取整时比实际略小或略大别被吓到用pvs看物理卷的精确大小就行。提示如果你之前对VG设置过PE大小默认PE是4MiBVG扩容后的可用空间会自动按PE大小取整。默认配置下不用关心这个系统会处理好。4.3 扩容LV层并同步扩容文件系统到这一步我们的池子VG已经有空间了接下来就是把这个空间划给根分区这个水杯LV并让文件系统感知到。在CentOS Stream 9上最省事的做法是直接用带-r参数的lvextend它会自动识别文件系统类型并同步扩容lvextend -r -L 150G /dev/vg0/root这条命令的参数拆解-rresize文件系统加了这个参数就不用手动执行xfs_growfs或resize2fs了。-L 150G在现有LV大小基础上增加150G。注意这里是号意思是增加如果你写-L 150G不加意思是把LV调整到150G这是两个完全不同的语义千万不要搞混。我们本次场景是根分区初始40G磁盘总空间200G扣除1G的boot分区和潜在的VG元数据开销可用空间大约还有159G所以加150G是安全的。/dev/vg0/rootLV的路径。在CentOS Stream 9镜像里卷组名一般是vg0逻辑卷名是root所以完整路径是/dev/vg0/root。如果你不确认名字用lvs查看。执行过程会输出现有LV大小和新大小然后自动调用文件系统扩容工具。对于xfs文件系统输出里会出现xfs_growfs的字样这就是在扩容文件系统的日志记录层xfs不用先停止写入就能在线扩大。如果担心-r在某些边缘场景下识别有问题比如文件系统受了点小损伤你也可以手动分两步执行lvextend -L 150G /dev/vg0/root xfs_growfs /但是对于ext4文件系统收缩的教训下次再讲先只记住xfs只能扩不能缩ext4既能扩也能缩。这决定了你扩容命令后的文件系统工具选择。5. 收尾验证与常见坑结合真实经历排查5.1 扩容后必须有验证步骤很多新手扩完容量之后就直接跑了根本没验证文件系统到底有没有成功扩大。我建议把这几个命令固化成流程df -h pvs vgs lvs lsblk逐一去核对df -h看根分区的可用空间和总大小这是最直观的业务视角确认根分区从40G变成了190G。pvs看PV的大小确认新增的/dev/vda3已经作为PV存在且大小是150G。vgs看卷组大小确认VG可分配空间已经扩大到将近199G。lvs看LV大小确认vg0-root已经扩容到190G。lsblk看整体拓扑确认vda3和vg0-root的关系防止出现空间给了PV但没给LV的中间状态。这五连查最多花你两分钟但能把90%的低级错误提前拦住。5.2 重装或销毁实例前必须先处理LVM数据盘这是我最近被问到最多的一个坑也是热词搜索里频繁出现的话题如果一台机器加了LVM数据盘重装系统前没有先从VG里移除这块盘对应的PV会发生什么答案是重装后的系统很可能会识别到残留的VG和PV信息新系统的卷组命名冲突或者引导时尝试挂载一个已经不存在的LV导致起不来或者数据盘被视为脏盘。尤其在一些云厂商的镜像初始化流程里它会枚举所有磁盘上的分区信息然后把非根分区都格式化成新分区或者直接覆盖但LVM元数据有时候会残留在磁盘上等新系统起来再lvs时你会看到一堆来历不明的VG名称。正确的做法是在重装前先手动把数据盘从LVM中摘除vgreduce vg0 /dev/vdb1 pvremove /dev/vdb1如果数据盘是独立的VG而不是和系统盘共用VG更干脆vgchange -a n vgdata vgremove vgdata pvremove /dev/vdb1这样重装后的新系统就完全不知道这块盘曾经是LVM成员你能像普通数据盘一样重新规划它。顺带说一句如果你用的是云平台的系统盘快照功能情况又不一样。快照会连同LVM元数据一起保存恢复快照后LVM结构是完整的不需要额外操作。但如果是在线扩容后做了快照快照里包含了扩容后的状态恢复出来还是扩容后的状态这个一般不会出问题。5.3 线上扩容碰到的问题实录我在实际扩容过程中遇到过几个比较典型的报错分享出来供大家参考不怕踩坑就是把坑提前填了。第一个是partprobe报Device or resource busy。这通常是因为分区表正在被内核使用进程占用导致无法重读。在纯数据盘上你可以先umount再partprobe但如果这次扩容的目标磁盘就是系统盘/dev/vda上的分区没法卸载根分区和boot分区都挂在使用中此时有两个办法一是直接执行partprobe多次有些场景内核会在几秒内自动刷新二是用partx -u /dev/vda更新内核中的分区表。如果都不行就需要安排一次计划内的重启但这就违背了在线的初衷。好消息是绝大多数云服务器和虚拟机环境对vda这种SCSI虚拟磁盘支持热插拔分区表刷新我在KVM虚拟化和主流云主机上基本没遇到过必须重启的情况。第二个坑是vgscan首次扫不到新分区。如果你在创建分区后没有刷新分区表就急着执行pvcreate系统会提示Device /dev/vda3 not found或者No such file or directory。这时候不要慌回头执行partprobe /dev/vda再用lsblk确认vda3出现然后才对vda3做pvcreate。顺序错了是新手最常见的失误。第三个问题是xfs文件系统参数和块大小不匹配。当一个LV的底层PV块大小超过4K时xfs可能拒绝扩容或者挂载时报block size mismatch。这个在标准云镜像里基本不会出现因为云厂商默认PV的PE是4MiB而物理扇区是512B或者4Kxfs都能兼容。但如果你是自己用整块物理盘做的PV极端情况下会遇到解决方案是在mkfs.xfs阶段就指定合适的-s size参数。5.4 其他Linux发行版如何套用这套流程标题写的是CentOS Stream 9但这套LVM在线扩容流程本质上是发行版无关的。我在Kylin Linux麒麟和Rocky Linux上验证过命令几乎一字不差区别主要在包管理器安装LVM工具CentOS Stream 9预装如果没装用dnf install -y lvm2Kylin用yum install -y lvm2。引导分区不同有些国产发行版用的是ext4格式的/boot但这不影响根分区扩容。文件系统类型如果你用的是ext4那么最后一步就不是xfs_growfs而是resize2fs /dev/vg0/root。带-r参数的lvextend依然会自动识别并调用正确的工具。Ubuntu/Debian也支持这套流程只是它们的VG名通常叫ubuntu-vgLV名可能叫ubuntu-lv需要你在lvs里确认。所以说真正掌握了PV、VG、LV三层之间的关系之后任何发行版都只是命令名字的差异罢了。6. 实操回顾一次完整在线扩容的完整命令序列最后给大家整理一份完整的命令序列方便直接抄作业我这次是在一台全新的CentOS Stream 9实例上完整执行的# 1. 确认现状 cat /etc/redhat-release df -h lsblk pvs vgs lvs # 2. 确认分区表类型GPT显示gptMBR显示dos fdisk -l /dev/vda # 3. 开始对磁盘扩容在云控制台/虚拟化平台完成如从100G扩到200G # 系统重新识别磁盘大小 partprobe /dev/vda lsblk # 4. 创建新分区 fdisk /dev/vda # 交互操作n - p - 分区号回车默认3- 起始扇区回车默认- 结束扇区回车默认 # 然后t - 3 - 31GPT下的Linux LVM- w # 5. 刷新并确认 partprobe /dev/vda lsblk fdisk -l /dev/vda # 6. 将新分区初始化为PV并加入VG pvcreate /dev/vda3 vgextend vg0 /dev/vda3 pvs vgs # 7. 扩容LV并同步文件系统 lvextend -r -L 150G /dev/vg0/root # 8. 验证 df -h pvs vgs lvs lsblk按照这个顺序走下来一个40G根分区的系统在线扩容成190G根分区全程不需要重启业务服务不需要停止。我个人在实际操作中的几点体会是第一扩容前一定要把实际情况看清楚尤其是lsblk和df -h的配合使用能帮你准确判断磁盘空间去哪里了第二lvextend -r这招最省心但前提是文件系统健康平时多做些巡检总是好的第三重装机器前记得先处理LVM数据盘这个坑我见过太多人踩了。最后再分享一个小技巧如果你管理的机器不止一台可以把这个流程封装成一个脚本通过远程批量执行。只要确认好每台机器的VG名和LV名一致同一个镜像开的机器通常一致脚本基本能通吃。当然执行前记得先在一台测试机上跑一遍批量操作之前做好备份总不会错。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →