ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

CentOS Stream 9 根分区满了?LVM 在线扩容实操指南

2026/10/2 5:16:13 拓冰建站 浏览量
CentOS Stream 9 根分区满了?LVM 在线扩容实操指南 最近有个朋友找我诉苦说他的服务器根分区满了业务日志写不进去监控一直在报警。他用的正是 CentOS Stream 9当时装系统的时候随手选了默认分区方案也没想到后面会这么被动。我在电话里让他先确认一下分区是不是 LVM他查完告诉我是我心里就有底了——LVM 在线扩容根分区这条路我这些年走过很多遍只要按步骤来完全不需要重启机器也不影响正在跑的服务。这篇教程就是把我完整的操作过程、每一步背后的原因、以及我踩过的各种坑都整理出来给同样被磁盘空间困扰的朋友一个可以直接照做的参考。本文会从 LVM 的核心概念讲起带你把环境状态摸清楚然后一步步完成新增磁盘、创建分区、扩展卷组、扩大逻辑卷、在线扩容文件系统的全部流程。不管你是刚接触 Linux 的小白还是有一定基础的运维只要照着操作基本都能搞定。整个过程不用重启不用停机这也是 LVM 这套机制最值钱的地方。1. 项目背景与核心需求拆解1.1 这是一个什么样的需求先还原一下实际场景你有一台 CentOS Stream 9 的服务器可能是物理机也可能是虚拟机或者云主机。跑了一段时间之后根分区/的空间不够了具体表现就是df -h出来使用率 90% 以上甚至 100%。日志写不进去、临时文件建不出来、服务起不来严重的连系统都登不进去。这个时候常规思路是什么加一块新硬盘把系统盘的数据想办法迁过去或者干脆重装系统。但重装系统的代价太大业务中断、环境重搭、数据迁移少说也要折腾半天。而且很多时候你只是容量不够了并不是系统坏了没必要伤筋动骨。正确的做法是利用 LVM 的弹性伸缩能力把新加的物理磁盘吞进现有的卷组里把多余的空间分给根分区所在逻辑卷然后在线扩大文件系统。整个过程服务不用停数据不用动命令执行完磁盘容量就上去了这就是所谓在线扩容。1.2 为什么选择 LVM 方案很多人在装系统时面对分区方案会纠结标准分区、LVM、还是 btrfs。我个人的建议是如果你不是对分区方式有特殊要求服务端系统优先选 LVM原因很现实。标准分区是死的。你在装系统的时候把磁盘划成/、/home、/var每个分区大小固定后期想调整只能动相邻分区操作繁琐且风险高。而 LVM 在物理磁盘和文件系统之间加了一层逻辑抽象相当于一个存储池。你往池子里加一块新盘池子就变大再把池子里的空间划给某个逻辑卷文件系统跟着扩大。整个过程像给鱼缸换大缸一样鱼还是那些鱼水变多了。LVM 的优势可以总结成几条容量可动态调整在线扩展逻辑卷和文件系统不需要停机。支持跨物理磁盘聚合多块小盘可以合并成一个大的卷组。支持快照功能做数据备份或者测试环境回滚很方便。磁盘利用率更灵活不会出现某个分区满了、另一个分区大量空闲的尴尬。当然 LVM 也有它的短板。一个很关键的点是LVM 本身不提供数据保护磁盘物理损坏照样丢数据它解决的是容量管理问题而不是数据安全问题。另外XFS 文件系统只能扩大不能缩小如果你的需求是缩容LVM 这套方案就得另想办法了。这也是我在后面讲文件系统时会特别强调的原因。1.3 在线扩容的适用场景与风险边界在线扩容适合什么场景粗略列一下根分区或者/var、/home等挂载点空间不足需要立即扩大容量。服务器不能停机业务持续对外提供服务。新增了物理磁盘希望并入现有存储体系而不是单独挂载。虚拟机或者云主机需要扩大数据盘或者系统盘容量。那什么时候不建议这么干如果你的磁盘已经彻底满了连登录都成问题那在线扩容的前提就不存在了——你得先通过救援模式或者 Live CD 进去腾出一点空间或者直接从底层给系统盘扩容这超出了本文讨论的范围。另外如果是数据盘要做缩容XFS 不支持ext4 也极其麻烦这种需求建议在业务层面处理而不是在存储层面硬刚。还有一点必须放在前面说清楚任何涉及磁盘和分区的操作都存在风险哪怕命令已经写得很温柔。动手之前重要数据务必备份。这不是废话是我见过太多人把扩容当成无损操作结果因为误操作把分区表搞乱数据没救回来。安全永远排在第一位。2. 动手前的准备LVM 的核心概念与系统勘查2.1 先搞懂 PV、VG、LV 和 PE 这几个概念LVM 的底层逻辑其实不复杂就四个概念我用打比方的方式解释一遍你理解之后再看命令会顺很多。物理卷PVPhysical Volume可以理解成一块块原材料。一块新硬盘、或者硬盘上的一个分区通过pvcreate初始化之后就成了 PVLVM 才有资格把它纳入管理。卷组VGVolume Group是材料仓库。一个或多个 PV 组合在一起形成一个 VGVG 的容量就是里面所有 PV 容量之和。你后面扩展空间第一步就是往这个仓库里扔新材料。逻辑卷LVLogical Volume是成品水箱。从 VG 这个仓库里划出一部分空间创建 LVLV 才能被格式化成文件系统并挂载使用。根分区/通常就对应一个 LV。物理扩展块PEPhysical Extent是 LVM 的最小存储单位可以理解成仓库里的标准箱。默认 PE 大小是 4 MiBVG 里的空间按 PE 来划分和分配。你执行lvextend -l 100%FREE时那个-l指的就是按 PE 数量来分配空间。这四者的关系用命令行来看更直观。一个典型的 CentOS Stream 9 默认安装结构是这样的$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 100G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 99G 0 part └─cs-root 253:0 0 99G 0 lvm /这里的sda2是物理分区被初始化成了 PVcs是卷组名cs-root是逻辑卷挂载在根目录。CentOS Stream 9 默认卷组名叫cs这和 CentOS 7/8 时代默认叫centos不一样很多教程里写的是旧名字直接照抄会报错。2.2 登录系统先做这几件事正式开始操作之前先花两分钟把环境摸清楚。这一步不是走过场它能让你避免很多低级错误比如把卷组名写错、把已有数据的磁盘当成新盘初始化。第一件事看磁盘和分区整体布局lsblk fdisk -llsblk能一眼看出磁盘、分区、LVM 的层级关系fdisk -l则能看到块设备的大小和分区表类型。重点确认几件事现在系统里有哪些盘哪块盘是系统盘新加的盘有没有被识别出来第二件事看 LVM 当前状态pvs vgs lvs这三条命令分别列出物理卷、卷组、逻辑卷的信息。你要记下几个关键值卷组的名字比如cs、根分区逻辑卷的完整路径比如/dev/cs/root、卷组当前剩余空间VFree列。如果你已经挂载了一块新盘但还没纳入 LVMpvs里是看不到它的。第三件事确认根分区的文件系统类型df -Th /输出结果里Type这一列会显示文件系统类型CentOS Stream 9 默认是xfs。这个信息很重要因为 xfs 和 ext4 扩容文件系统用的命令完全不同搞错了会直接报错。2.3 确认文件系统类型XFS 和 ext4 的操作差异CentOS Stream 9 安装器默认采用 XFS 作为根文件系统。XFS 是个高性能日志文件系统支持大文件和大容量存储但它有一个非常关键的约束只能扩大不能缩小。这一点在很多场景下反而是好事——你不用担心扩容操作本身只管往上加空间就行。文件系统扩容命令针对不同文件系统有严格区分XFS 用xfs_growfs挂载点和设备路径都行。ext4 用resize2fs后面跟逻辑卷设备路径。其他文件系统各有各的工具不过 CentOS Stream 9 默认场景基本用不到。需要注意lvextend扩的是逻辑卷的容量边界它只是让 LV 这个水箱变大了里面的水文件系统并不会自动跟着涨。你必须再执行一次文件系统扩容命令让文件系统感知到新的空间。很多人执行完lvextend就以为完事了结果df -h一看容量没变还以为是命令没生效。不是没生效是还差最后一步。另外还有一个细节对于 XFS你可以在挂载状态下直接xfs_growfsLinux 原生支持在线扩充 XFS这也是为什么整条链路可以做到完全不停机的原因。ext4 的resize2fs同样支持在线扩容但操作风险比 XFS 稍高务必一步步来。3. 超详细实操新磁盘在线扩容根分区3.1 给机器添加新磁盘并让系统识别在线扩容的前提是先有一块闲置的物理磁盘。这块磁盘在不同环境下获取方式不一样物理机直接插一块新硬盘或者用阵列卡划一个新 RAID。VMware/KVM 虚拟机在虚拟化管理界面给虚拟机加一块新虚拟磁盘总线类型建议和系统盘保持一致。云主机在云控制台的磁盘管理页面购买并挂载一块新的云盘。磁盘添加完成后Linux 不一定立刻识别到。在 VMware 等虚拟化环境里如果新加的磁盘没有自动出现在lsblk输出中可以考虑触发一次 SCSI 总线重新扫描echo - - - /sys/class/scsi_host/host0/scan这里的host0可能有多个用ls /sys/class/scsi_host/看一下实际有哪些 host逐个执行也行。物理机和云环境一般不用这一步新的块设备插上就会被内核识别。执行完再跑一下lsblk如果看到一块新的、没有分区、没有被挂载的磁盘比如/dev/sdb就可以继续往下走了。注意新加的磁盘千万不要格式化也不需要提前建文件系统LVM 会自己管理这些。你要是手贱先格了后续pvcreate也能覆盖但多此一举。3.2 用 fdisk 创建 LVM 分区拿到新盘之后第一步是给这块盘建分区。虽然理论上可以直接把整块磁盘做成 PV但为了规范和管理方便一般还是建议先建一个单独的分区分区类型设置为 Linux LVM。以/dev/sdb为例执行fdisk /dev/sdb进入交互界面后依次输入n # 新建分区 p # 主分区 1 # 分区编号 回车 # 起始扇区默认 回车 # 结束扇区默认即用完整磁盘 t # 修改分区类型 8e # Linux LVM 类型代码 w # 写入分区表并退出这里有个注意点现代 fdisk 里输入t之后会提示输入类型代码8e是传统的 Linux LVM 编号。有些新版本 fdisk 直接输入lvm也能识别不过8e最保险所有发行版通用。分区创建好之后内核不一定能立刻识别出新分区尤其是磁盘还在被占用的情况下。执行一次partprobe /dev/sdb或者用partx -a /dev/sdb让内核重新读取分区表。执行完再用lsblk /dev/sdb确认是否出现了sdb1分区。还有一种情况如果你拿到的是一块之前用过的旧盘fdisk会提示磁盘上已经有分区表。操作前务必确认这块盘上没有你需要的数据。确认过再决定是直接覆盖还是先清理。我一般会再跑一遍wipefs -a /dev/sdb彻底清掉旧的分区表和文件系统签名避免后面出现莫名其妙的挂载问题。3.3 创建物理卷并扩展卷组分区创建好之后把它初始化成 LVM 物理卷pvcreate /dev/sdb1没有任何报错的话执行pvs应该能看到新 PV 出现了。如果这里报Device /dev/sdb1 excluded by a filter多半是磁盘上有旧的文件系统签名或者分区表残留用wipefs -a /dev/sdb清一遍再试。接下来把这个 PV 加入已有的卷组。卷组名前面查过是csvgextend cs /dev/sdb1执行成功后再看vgs注意VFree这一列新增的容量应该已经计入卷组的可用空间了。有些朋友到这一步会疑惑为什么逻辑卷还没变大因为空间只是进了仓库还没分给水箱下一步才是重点。3.4 扩展逻辑卷现在要把卷组里的空闲空间分配给根分区对应的逻辑卷。逻辑卷路径用lvs查到的名字组合比如cs/root完整设备路径是/dev/cs/root。两种分配方式按需求选把卷组里所有剩余空间都给根分区lvextend -l 100%FREE /dev/cs/root只增加指定大小比如 20Glvextend -L 20G /dev/cs/root这两种写法的区别在于-l是按 PE 数量或百分比分配-L是按容量大小分配。日常操作里-l 100%FREE最省心尤其适合新盘全部并入的场景。但如果你想留一部分空间给别的逻辑卷就用-L 20G这种写法。关于 PE 大小前面提过默认 4 MiB。lvextend -l 100%FREE的本质是把卷组里所有空闲 PE 全部拿走所以理论上不存在分不干净的问题。执行完lvs再看根逻辑卷的LSize应该变大了。此时注意逻辑卷扩大了但文件系统还是原来的大小。3.5 在线扩容文件系统最关键的一步来了。根据前面查到的文件系统类型执行对应的扩容命令。如果是 XFSxfs_growfs /如果是 ext4resize2fs /dev/cs/root为什么两者不一样xfs_growfs接受的是挂载点也可以接设备路径而resize2fs必须接设备路径。XFS 的在线扩容在挂载状态下就能完成内核会读取逻辑卷的新大小并相应扩展文件系统。执行完xfs_growfs之后输出信息里会看到data blocks changed from ... to ...说明文件系统已经感知到了新空间。此时再看一眼实际效果df -h /你会发现根分区的容量已经变大而且整个过程里没有重启没有卸载分区业务理论上全程无感知。3.6 验证扩容结果扩容完成之后我习惯做一轮完整验证确认一切正常lsblk df -h pvs vgs lvs重点检查几点lsblk里根逻辑卷的大小和实际磁盘容量对应得上。df -h里/的使用率明显下降。vgs里VFree如果是 0说明新空间全部分配完了。测试一下往根分区里写点临时文件确认读写正常touch /test_write rm /test_write。如果一切正常这次在线扩容就算圆满完成了。整个过程大约五分钟不用重启不用停服务数据分毫未动。4. 常见问题与排错实录4.1 动手前必须做的安全检查每次做这类操作之前我都习惯先走一遍安全检查清单写下来供大家参考重要数据是否有备份至少备份关键配置和数据库数据。新磁盘是否确认无误确认没有误认成系统盘没有覆盖已有数据。卷组名、逻辑卷路径是否抄写正确命令里写错一个字母后果可大可小。是否记录了操作前的df -h、pvs、vgs、lvs输出万一出了问题至少能对比前后差异。这些检查看起来繁琐但真到了出问题的时候你会感激自己当初多花了几分钟。尤其在生产环境任何一步失误都可能把一个小扩容变成一次事故复盘。4.2 高频翻车现场汇总实际操作中下面几个问题出现频率最高我挨个说清楚症状和解决办法。症状一pvcreate提示Device /dev/sdb1 excluded by a filter。原因磁盘上残留了旧的文件系统签名或分区表信息LVM 出于安全考虑拒绝使用。解决办法是用wipefs -a /dev/sdb清掉所有签名再重新分区、重新pvcreate。症状二vgextend时报Volume group centos not found。原因CentOS Stream 9 默认卷组名不是centos而是cs你照着老教程抄了命令。解决办法很简单先执行vgs看真实卷组名再替换命令里的名字。症状三执行完lvextend后df -h容量没变。原因只扩了逻辑卷忘了扩文件系统。这是新手最常见的误区解决方案就是补上第 3.5 小节的xfs_growfs或者resize2fs。症状四xfs_growfs /报XFS_IOC_FSGROWFSDATA错误。原因大概率是你把命令用在了非 XFS 文件系统上或者逻辑卷大小没变化。先确认文件系统类型确实是 XFS再确认lvextend真的执行成功了。症状五新磁盘在lsblk里看不到。原因虚拟化环境磁盘热插拔后没有触发重扫描或者云主机需要手动刷新。按 3.1 小节的 SCSI 重扫命令处理。4.3 云环境与虚拟化场景下的额外注意点云主机和虚拟化环境里做 LVM 扩容有几个和物理机不一样的坑。先说云主机的系统盘。很多云厂商创建 CentOS Stream 9 实例时默认系统盘就是整盘 LVM 结构这意味着你可以在云控制台直接扩容系统盘然后进系统执行pvresize、lvextend、xfs_growfs三步。注意云控制台扩容系统盘之后系统里的物理卷大小并不会自动变化必须执行pvresize /dev/sda2然后重复第 3.4 和第 3.5 小节的操作。这条流程和新增数据盘扩容不太一样但原理完全相同。国内不少云平台都提供了 CentOS Stream 9 镜像安装好之后默认就是 XFS LVM 的组合这套流程通用。再说数据盘。如果你给云主机挂了一块新数据盘并打算并入根分区的卷组需要注意数据盘的卸载问题。尤其是一些云电脑、云桌面场景里用户为了给系统盘扩容把数据盘加入了 LVM后来要重装系统时系统安装程序很可能识别不了sdb1这种带 LVM 分区的数据盘导致数据盘在安装界面里消失。这个问题在装系统前一定要处理从 LVM 中剥离数据盘把数据盘恢复成普通数据盘状态。具体操作是卸载挂载点、lvremove删除相关逻辑卷、vgreduce从卷组里移除对应 PV、pvremove取消 PV 标记。顺序不能乱少了任何一步都可能残留 LVM 元数据。做完之后重装系统时数据盘就能被正常识别了。4.4 重装系统前的 LVM解绑问题结合上面说的云电脑场景我单独把重装系统前 LVM 解绑这个问题拎出来讲清楚因为它坑过不少人。典型的错误操作是数据盘已经加入了卷组甚至和系统盘共用了同一个卷组。这时候直接重装系统安装器重新初始化系统盘的分区表时可能会连带影响卷组里的数据盘或者数据盘因为残留 LVM 元数据导致无法在安装界面中挂载。正确流程应该是这样的umount /挂载点 lvremove /dev/vgname/lvname vgreduce vgname /dev/sdb1 pvremove /dev/sdb1每执行一步都用pvs、vgs、lvs查看确认确保卷组里已经没有数据盘对应的 PV 了再放心重装。如果你只是想让数据盘脱离 LVM 管理、保留上面的文件那么还应该在解除 LVM 后重新格式化或重建文件系统这又是一个话题。总而言之记住一个原则先解绑再重装。同样的流程在国产的 Kylin Linux银河麒麟系统上也能用——它同样基于 RPM 体系默认或可选支持 LVM扩容逻辑卷、扩展 XFS 的命令和 CentOS 几乎一模一样。如果你同时维护这两个系统操作手册完全可以共用一份。5. 一些亲测有效的经验与建议操作层面的东西讲完了最后说几个我这些年积累下来的实话。第一个建议是装系统的时候别嫌麻烦给 LVM 留足空间。CentOS Stream 9 安装器的默认分区方案其实已经合理但我一般会在/上多分一些同时保留卷组里一部分未分配空间。这样就算分区规划失误后续也能在线补不至于一上来就陷入磁盘满的窘境。第二个建议是日志目录和数据目录尽量落在独立逻辑卷上。我在生产环境里习惯把/var/log、/home、业务数据目录分别建 LV一是避免某个目录的写入风暴把根分区堵满二是扩展哪个就扩展哪个互不干扰。这个习惯帮我躲过很多次磁盘报警。第三个经验是关于 XFS 的再次强调XFS 只能扩不能缩。如果你打算用 LVM 做精细的容量规划要充分考虑这一点。缩容需求应该提前想清楚别等到空间分配不合理了才想着怎么缩。第四个真心建议每半年抽空做一次磁盘使用率排查把df -h、vgs、lvs的输出来一次快照。磁盘满这种事十次里有九次不是突发的都是在日志里默默积累起来的。早发现早扩容比什么都强。这套在线扩容 LVM 根分区的方法我验证过很多次从 CentOS 7 一直用到 Stream 9也帮朋友处理过 Kylin Linux 的同类问题。照着流程走普通场景下十分钟内就能完成而且全程不影响业务。如果你之前一直在为磁盘空间头疼希望这篇实操记录能帮你把这颗钉子拔掉。