CentOS 8 LVM 在线扩容根分区:从 home 安全割让空间(XFS 文件系统)

CentOS 8 LVM 在线扩容根分区:从 home 安全割让空间(XFS 文件系统) CentOS 8 LVM 在线扩容根分区从 /home 割让空间XFS 文件系统一级目录二级目录三级目录背景环境信息注意事项操作前必读正文一、缩小 /home 逻辑卷释放空间到卷组1. 查看当前状态2. 检查占用 /home 的进程3. 终止占用进程4. 卸载 /home5. 检查文件系统可选6. 缩小逻辑卷7. 重新格式化 /home不可逆8. 挂载 /home二、扩容根分区9. 将所有空闲空间分配给根逻辑卷10. 在线扩容 XFS 文件系统11. 验证结果请添加图片描述 ![请添加图片描述](https://i-blog.csdnimg.cn/direct/f273b688e56a4f01b5d8113a20f8197d.png) ![请添加图片描述](https://i-blog.csdnimg.cn/direct/4fe4dd28a988404eabd479616a3a228d.png) ![请添加图片描述](https://i-blog.csdnimg.cn/direct/8a58bc9ac53e448d9eb5b31e12d9ebdb.png)三、MongoDB 异常退出故障分析原因分析修复方法预防措施End)一级目录二级目录三级目录背景CentOS 8 服务器在安装时采用了默认分区方案导致根分区/仅分配 70G而/home独占了 390G 且实际使用不到 5G。随着 Docker、数据库等服务持续运行根分区空间逐渐耗尽需要在不重启、不停 Docker、不改变路径、不添加硬盘的前提下扩容。问题在于/home使用 XFS 文件系统——XFS 不支持在线缩小没有xfs_shrink命令只能通过卸载 → 缩小 LV → 重新格式化 → 挂载的方式释放空间再将空闲空间追加到根分区。环境信息项目值操作系统CentOS 8分区方案LVM卷组名称cl_miwifi-ra80-srv根逻辑卷cl_miwifi-ra80-srv-root70GXFShome 逻辑卷cl_miwifi-ra80-srv-home390G已用 4.8GXFS卷组空闲0注意事项操作前必读/home 数据会被彻底清空。XFS 不支持在线缩小流程是lvreduce→mkfs.xfs→mount中间mkfs会抹掉/home上的所有数据。操作前必须备份/home。检查 Docker volume 和数据库数据目录。如果任何容器的 volume 或 bind mount 指向/home下的路径mkfs之后这些数据将不可恢复。用docker inspect逐一确认必要时迁移到/var或根分区其他位置。xfs_growfs /可能间接导致运行中的服务异常。虽然xfs_growfs号称在线操作但在更新文件系统元数据时会产生短暂的 I/O 抖动。本次操作中 MongoDB数据目录在/var/lib/mongo与/home无关因 I/O 阻塞导致 WiredTiger 引擎异常退出exit code 14详见下文故障分析。生产环境禁止使用确认文件系统类型。df -T检查ext4 的缩小流程不同resize2fs可在线缩小本文步骤仅适用于 XFS。正文一、缩小 /home 逻辑卷释放空间到卷组1. 查看当前状态df-h/ /home vgs确认根分区已满、home 几乎空闲、卷组无剩余空间。2. 检查占用 /home 的进程fuser-vm/homelsof/home输出示例普通用户paul的桌面进程不影响业务USER PID ACCESS COMMAND /home: root kernel mount /home paul 2889 ..c.. dbus-daemon paul 2989 ..c.. gvfsd ...省略3. 终止占用进程pkill-upaul# 替换为实际用户名fuser-vm/home# 确认仅剩 root 的 kernel mount4. 卸载 /homeumount/home若报target is busy使用 lazy 卸载umount-l/home补充若 lazy 卸载仍失败用fuser -vm /home找出残留 PIDkill -9 PID后重试umount。5. 检查文件系统可选xfs_repair /dev/mapper/cl_miwifi--ra80--srv-home6. 缩小逻辑卷将/home从 390G 缩小到 50G实际仅用 4.8G50G 绰绰有余lvreduce-L50G /dev/mapper/cl_miwifi--ra80--srv-home-f输出WARNING: Reducing active logical volume to 50.00 GiB. THIS MAY DESTROY YOUR DATA (filesystem etc.) Size changed from 389.66 GiB to 50.00 GiB.技巧若要精确控制/home最终大小如 85G先缩到较小值如 50G再用lvextend -L 85G /dev/mapper/.../home xfs_growfs /dev/mapper/.../home扩回。注意lvreduce只能缩小无法从 50G “缩小” 到 85G。7. 重新格式化 /home不可逆mkfs.xfs /dev/mapper/cl_miwifi--ra80--srv-home-f此步不可跳过。XFS 不支持缩小文件系统缩 LV 后 XFS 元数据仍认为磁盘大小为 390G直接挂载会导致文件系统错误。8. 挂载 /homemount/home此时卷组已释放约 340G 空闲空间可通过vgs确认。二、扩容根分区9. 将所有空闲空间分配给根逻辑卷lvextend-l100%FREE /dev/mapper/cl_miwifi--ra80--srv-root-l 100%FREE将卷组中所有剩余空间追加给根 LV。10. 在线扩容 XFS 文件系统xfs_growfs /此命令无需卸载根分区实时生效。11. 验证结果df-h/ /home vgs结果Filesystem Size Used Avail Use% Mounted on /dev/mapper/cl_miwifi--ra80--srv-root 410G 70G 340G 17% / /dev/mapper/cl_miwifi--ra80--srv-home 50G 4.8G 45G 10% /home根分区从 70G 扩容至约 410G净增约 340G。/home保留 50G卷组剩余空间归零。三、MongoDB 异常退出故障分析扩容完成后Docker 和 MySQL 均正常运行但 MongoDB 服务状态为failed。systemctl status mongod.service● mongod.service - MongoDB Database Server Active: failed (Result: exit-code) Main PID: 1968 (codeexited, status14)原因分析MongoDB 为原生 systemd 服务数据目录/var/lib/mongo位于根分区与/home操作无直接关联。问题出在步骤 10 的xfs_growfs /xfs_growfs虽支持在线扩容但在更新 XFS 超级块和 AGAllocation Group元数据结构时会产生短暂的 I/O 阻塞通常几十到几百毫秒。MongoDB 的 WiredTiger 存储引擎对 I/O 延迟极其敏感——其 checkpoint 和 journal 写入依赖文件系统在毫秒级内完成 I/O 操作。一旦xfs_growfs造成的 I/O 抖动超出 WiredTiger 的容忍阈值引擎即判定为存储层致命错误并主动退出exit code 14表示非正常关闭。MongoDB 退出后systemd 默认Restarton-failure会尝试重启但 exit code 14 要求 MongoDB 先通过 journal 恢复数据。若恢复过程中再次失败systemd 在数次重试后放弃服务最终进入failed状态。修复方法手动启动即可MongoDB 自动从 WiredTiger journal 恢复systemctl start mongod.service恢复成功后服务正常运行数据完整。exit code 14 不代表数据损坏仅表示上次关闭不干净、需要恢复。预防措施操作方法在xfs_growfs /之前先systemctl stop mongod完成后再systemctl start mongod。同样适用于其他 I/O 敏感服务Elasticsearch、PostgreSQL、Redis 等。短暂的主动停服远比事后被动抢救可控。如不能停服至少在低峰期执行确保数据库没有大事务或密集写入。End本次操作在不重启服务器、不停 Docker、不改变数据路径、不添加物理磁盘的前提下将根分区从 70G 扩容至 410G。核心流程为fuserpkill清理/home占用进程umount /home→lvreduce→mkfs.xfs→mount /homelvextend -l 100%FREExfs_growfs /在线扩容根分区但是MongoDB 还是因xfs_growfs的 I/O 抖动异常退出本方案适用于 CentOS 7/8、RHEL 等使用 LVM XFS 的 Linux 发行版正式项目不要用