找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2298

积分

0

好友

321

主题
发表于 昨天 03:05 | 查看: 8| 回复: 0

今天分享一个磁盘扩容中遇到的典型陷阱:理论上 ext4 文件系统支持在线扩容,但在一个特殊场景下,却不得不卸载分区后才能完成操作。

事情源于一位用户,他的 CentOS 7.9 系统运行在天翼云主机上。/data 分区使用率高达99%,已经严重影响了业务。由于前任运维已经离职,问题迟迟未解决。用户曾尝试参考我之前的方案但未成功,于是再次联系到我。

查看磁盘空间使用情况的df命令输出

在开始操作前,我首先建议用户在云平台为服务器创建快照以备份数据,这是进行任何磁盘操作前至关重要的安全步骤。

1 查看基本情况

我使用 lsblk 命令查看了磁盘情况,确认云平台已将 /dev/vdb 磁盘扩容至 1.5T,但新增的空间尚未被系统分区识别。

接着,我使用 fdisk 命令查看磁盘的分区结构:

fdisk /dev/vdb

使用fdisk查看磁盘分区信息

命令输出暴露了 3 个严重的异常点

  • 磁盘的标签类型显示为 dos(即传统的 MBR 分区表)。
  • 但分区 /dev/vdb1 的系统类型却是 ee,这代表它是一个 GPT 保护分区(常用于在 MBR 磁盘上存放 GPT 数据)。
  • 分区的起始扇区是 1,这非常不规范,通常应该从 2048 开始。

这明显是一个 “历史遗留的混合 GPT 磁盘”。前任运维同事的初始分区操作极不规范,为后续的扩容埋下了隐患。这类磁盘在扩容时极易出现问题。

2 尝试解决问题

我首先尝试使用云环境中常用的 growpart 工具进行在线扩容,但如预期般失败了。

growpart命令因GPT分区表而失败

随后,我转向功能更强大的 parted 工具。首先查看磁盘的详细情况:

parted /dev/vdb print

使用parted工具查看磁盘并修复GPT表

这里出现了两个交互式提示:

  1. 第一个错误提示表明:云平台扩容磁盘后,GPT 分区表的备份信息仍停留在旧的磁盘末尾,导致 GPT 结构不完整。我选择了 Fix 让其修复。
  2. 第二个警告提示询问:是否让 GPT 分区表正式识别并使用新扩容出来的磁盘空间?我同样选择了 Fix

完成修复后,再次使用 parted 查看,磁盘信息已经显示正常。

修复后parted显示的正常磁盘信息

接下来,我尝试使用 parted 进行在线扩容分区:

parted /dev/vdb resizepart 1 100%

parted在线扩容因分区挂载而失败
问题再次出现,提示分区 /dev/vdb1 正在被使用,要求先卸载(unmount)才能修改。这回到了我们开头提到的矛盾点。

3 最终解决方案

踩完前面的所有“坑”之后,最终的解决方案变得清晰。由于在线扩容分区表被阻止,必须卸载分区后操作:

# 卸载挂载点
umount /data

# 使用parted将分区1扩展到磁盘的100%
parted /dev/vdb resizepart 1 100%

# 在线扩展ext4文件系统以使用新的分区空间
resize2fs /dev/vdb1

# 验证扩容结果
df -h

执行扩容命令并验证结果

从输出可以看到,/data 分区已成功从约 985G 扩容至 1.5T。

细心的读者可能会问:我们执行了 umount,但并没有执行 mount 命令重新挂载,为什么 df -h 能显示挂载信息?这是因为该系统使用了 systemd 管理挂载点。当我们卸载时,对应的 mount unit 被停用;在文件系统操作完成后,systemd 自动重新激活了该 unit,实现了自动挂载。

systemctl list-units --type=mount |grep data

查询systemd管理的挂载单元状态

4 真正的原因

问题的根源并非 ext4 文件系统不支持在线扩容,而是出在分区表与内核交互的层面。

一句话总结:

内核无法在“分区正在使用”的情况下,重新加载一个被修改(修复)过的 GPT 分区表。

这块磁盘同时命中了多个“高风险条件”,构成了一个复杂的系统运维场景:

风险点 说明
GPT 备份表异常 扩容后备份GPT信息未更新,需要修复。
GPT 扩展空间 修复过程修改了分区表的核心元数据。
分区正在挂载 内核出于安全考虑,拒绝为重写过的分区表重读分区信息。
非标准起始扇区 可能是陈旧系统镜像或不当初始化留下的历史问题。

因此,对于这种特定状态的磁盘,理论支持在线扩容,但实际操作中内核行为不允许

这次经历再次证明,磁盘最初的格式化与分区方式,将深远影响未来数年的运维体验。一个规范、清晰的初始设置,能避免后续大量的棘手问题。希望这个案例能为大家在Linux系统运维中处理类似磁盘问题提供参考。更多技术讨论与资源分享,欢迎访问云栈社区




上一篇:GitHub供应链安全风险分析:以Stripe Veneur外部域名失控为例
下一篇:Python状态机实现详解:Transitions库入门与订单状态管理实战
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-1-14 15:59 , Processed in 0.213938 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表