灯下哥谭 灯下哥谭
首页
关于
  • Hermes Agent 平台
  • Claude Code
  • OpenClaw
  • GPU 推理节点运维
  • DeepSeek Harness
  • MySQL 运维知识地图
  • Elasticsearch 运维知识地图
  • Redis 运维知识地图
  • TiDB 体系
  • DBA 常用 SQL 与命令
  • Nginx 运维知识地图
  • Prometheus 监控
  • Docker
  • Systemd
  • Iptables
  • Firewalld
  • Sshd
  • MySQL8 运维 SOP 手册
  • MySQL 实战 45 讲(读书笔记)
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

灯下哥谭

灯还亮着
首页
关于
  • Hermes Agent 平台
  • Claude Code
  • OpenClaw
  • GPU 推理节点运维
  • DeepSeek Harness
  • MySQL 运维知识地图
  • Elasticsearch 运维知识地图
  • Redis 运维知识地图
  • TiDB 体系
  • DBA 常用 SQL 与命令
  • Nginx 运维知识地图
  • Prometheus 监控
  • Docker
  • Systemd
  • Iptables
  • Firewalld
  • Sshd
  • MySQL8 运维 SOP 手册
  • MySQL 实战 45 讲(读书笔记)
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 工作笔记

    • 实用linux命令-nc
    • 实用linux命令-lsof
    • 实用linux命令-ss
    • Bash 备忘清单
    • Ansible 备忘清单
    • Linux 文件权限的三个反直觉陷阱
    • GPT分区使用 `parted` 扩展分区的操作流程
      • 为什么 fdisk 会失败:GPT 分区的结构差异
      • 使用 parted 扩展分区与文件系统
        • 准备:确认当前分区状态
        • 步骤一:卸载目标分区
        • 步骤二:使用 parted 扩展分区边界
        • 步骤三:扩展 XFS 文件系统
        • 步骤四:验证扩容结果
      • 在线扩容 vs 卸载扩容的边界条件
      • 操作回滚:xfs_growfs 报错怎么办
        • 场景一:resizepart 后发现起始扇区错误
        • 场景二:xfs_growfs 报 "data size unchanged"
        • 场景三:扩容后 mount 报 "wrong fs type"
      • 可复用要点
    • 实用linux命令-sed
    • VSCode快捷键备忘录
    • 实用linux命令-curl
  • 容器与编排

  • Nginx

  • 监控

  • 网络安全

  • 其他

  • Linux笔记
  • 工作笔记
灯下哥谭
2024-08-28
目录

GPT分区使用 parted 扩展分区的操作流程原创

扩容分区时遇到 fdisk 报 "WARNING: GPT (GUID Partition Table)" 并不罕见。在 GPT 分区表上,传统的删除再重建分区方案风险更高——因为重建时若起止扇区计算偏差,会直接破坏文件系统元数据。parted 的 resizepart 命令可以原地调整分区边界,配合 xfs_growfs 在线扩展文件系统,是处理 GPT 大磁盘扩容的更稳妥路径。

版本说明

本文基于 CentOS 7/8、Ubuntu 20.04/22.04 通用流程整理。涉及工具版本:parted ≥ 3.2,xfsprogs ≥ 4.5。未加特殊说明的命令在 ext4 文件系统上同样适用,但扩容命令需相应调整。

# 为什么 fdisk 会失败:GPT 分区的结构差异

MBR(主引导记录)分区表使用 32 位 LBA 寻址,最大支持 2TB 磁盘和 4 个主分区。GPT(GUID Partition Table)使用 64 位 LBA,支持 8ZB 磁盘和 128 个分区,并在磁盘首尾各保存一份分区表副本以增强容错。

fdisk 在早期版本中对 GPT 的支持有限。当执行 fdisk /dev/sdb 时,若检测到 GPT 会提示:

WARNING: GPT (GUID Partition Table) detected on '/dev/sdb'!
The util fdisk doesn't support GPT. Use GNU Parted.
1
2

即使较新版本的 fdisk 支持 GPT,其交互逻辑仍基于 "删除分区→重建分区" 的范式。这种范式在 MBR 时代成立的前提是:重建后的分区起始扇区与原分区完全一致。但 GPT 分区表包含分区 GUID、名称、属性标志等元数据,手动重建时极易因以下细节出错:

  • 未对齐到 optimal IO size(通常为 1MiB),导致性能下降
  • 误输入起始扇区号,覆盖文件系统超级块
  • 丢失分区 UUID,导致 /etc/fstab 的 UUID 绑定挂载失效

parted 的 resizepart 命令在调整分区边界时保留原有分区的 GUID 和属性,仅修改结束扇区号,从根本上避免了重建带来的元数据丢失风险。

# 使用 parted 扩展分区与文件系统

# 准备:确认当前分区状态

扩容前必须记录分区起始扇区,这是确保 resizepart 不破坏数据的唯一依据。

sudo parted /dev/sdb print
1

预期输出:

Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sdb: 644GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name  Flags
 2      2099kB  322GB   322GB   xfs
1
2
3
4
5
6
7
8

关键字段解释:

  • Start: 2099kB —— 分区起始位置,resizepart 必须保持此值不变
  • File system: xfs —— 决定后续使用 xfs_growfs 而非 resize2fs
  • Partition Table: gpt —— 确认分区表类型,排除 MBR 场景

同时记录文件系统挂载点和已用空间:

df -h /data1
1

预期输出(示例):

Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb2       300G   50G  250G  17% /data1
1
2

# 步骤一:卸载目标分区

parted 的 resizepart 命令要求分区处于卸载状态,以防止调整过程中内核缓存与磁盘状态不一致。

sudo umount /data1
1

验证卸载:

mount | grep /data1
1

预期无输出。

# 步骤二:使用 parted 扩展分区边界

进入 parted 交互环境:

sudo parted /dev/sdb
1

首先再次确认分区起始扇区:

(print)
1

记录 Number 2 分区的 Start 值(如 2099kB),然后执行 resize:

(resizepart)
Partition number? 2
End?  [322GB]? 100%
1
2
3

输入 100% 表示将分区扩展到磁盘末尾。parted 会自动对齐到最优扇区边界。

验证调整结果:

(print)
1

预期输出中,Number 2 的 End 应更新为磁盘总容量(如 644GB),而 Start 保持不变。

退出 parted:

(quit)
1

# 步骤三:扩展 XFS 文件系统

分区边界扩展后,文件系统尚未感知新增空间,需要在线扩展。

XFS 文件系统:

sudo xfs_growfs /data1
1

预期输出:

meta-data=/dev/sdb2              isize=512    agcount=4, agsize=19660800 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=78643200, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=38375, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 78643200 to 157286400
1
2
3
4
5
6
7
8
9
10

最后一行 data blocks changed 确认文件系统已扩展。

若是 ext4 文件系统:

sudo resize2fs /dev/sdb2
1

# 步骤四:验证扩容结果

重新挂载并确认容量:

sudo mount /data1
df -h /data1
1
2

预期输出(示例):

Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb2       600G   50G  550G   9% /data1
1
2

对比扩容前的 300G,确认扩容生效。

# 在线扩容 vs 卸载扩容的边界条件

上述流程中,parted resizepart 要求卸载分区,而 xfs_growfs 支持在线执行。这两者差异根源于内核的实现机制。

操作 卸载要求 原因
parted resizepart 必须卸载 修改分区表会触发内核重新读取磁盘元数据,若分区正在使用,内核缓存中的分区边界与磁盘不一致,可能导致 IO 错误
xfs_growfs 在线执行 XFS 的日志结构允许在挂载状态下扩展元数据区域,数据块分配表的增长对正在进行的 IO 透明

ext4 的差异:resize2fs 同样支持在线扩展(内核 ≥ 2.6),但前提是分区边界已经扩展。若分区未占满磁盘,需先 umount + parted resizepart,再 mount + resize2fs。

不能在线缩容:无论是 XFS 的 xfs_growfs 还是 ext4 的 resize2fs,均只支持扩展不支持收缩。XFS 因日志结构设计,永久不支持在线收缩;ext4 需卸载后使用 resize2fs -M 收缩。

# 操作回滚:xfs_growfs 报错怎么办

若扩容过程中出现异常,需根据故障阶段采取不同恢复策略。

# 场景一:resizepart 后发现起始扇区错误

症状:执行 (print) 后发现 Start 列与扩容前记录的值不一致。

原因:误操作重建了分区而非 resize,导致分区起始偏移。

恢复:立即退出 parted(不执行任何写入),使用备份的分区表恢复:

sudo sgdisk -l /path/to/backup.gpt /dev/sdb
1

若无备份,尝试通过文件系统超级块反推分区起始:

sudo xfs_repair -n /dev/sdb2
1

-n 表示检查模式(no modify)。若能识别文件系统,说明数据仍在,可手动重建分区表,严格保证 Start 扇区与 xfs_repair 报告的 AG 起始对齐。

# 场景二:xfs_growfs 报 "data size unchanged"

症状:分区已扩展(parted print 显示 End 增加),但 xfs_growfs 提示未变化。

原因:设备节点未更新,内核仍缓存旧的分区边界。

解药:通知内核重新读取分区表:

sudo partprobe /dev/sdb
1

或针对特定分区:

sudo partx -u /dev/sdb
1

验证内核识别的新边界:

cat /sys/block/sdb/sdb2/size
1

该数值(以扇区为单位)应大于扩容前值。确认后再次执行 xfs_growfs。

# 场景三:扩容后 mount 报 "wrong fs type"

症状:mount /data1 失败,提示文件系统类型错误。

原因:resizepart 时输入了错误的分区号,覆盖了相邻分区或未对齐扇区,导致文件系统元数据损坏。

恢复步骤:

  1. 不要尝试写入挂载,避免进一步破坏
  2. 使用 xfs_repair 检查损坏程度:
sudo xfs_repair -n /dev/sdb2
1
  1. 若损坏轻微,执行修复(确保有备份):
sudo xfs_repair /dev/sdb2
1
  1. 若 xfs_repair 无法修复,使用备份恢复分区表到扩容前状态,重新执行正确的 resizepart 流程。

# 可复用要点

  1. GPT 分区扩容首选 parted:resizepart 原地调整边界,避免 fdisk 删除重建带来的 GUID 丢失和扇区对齐风险。

  2. 扩容前必须记录分区起始扇区:parted print 的 Start 列是唯一安全依据,resizepart 必须保证该值不变。

  3. 分区表修改与文件系统扩展分离:parted 只改边界,xfs_growfs/resize2fs 负责扩展文件系统,两者不可颠倒顺序。

  4. XFS 只扩不缩:规划容量时预留 XFS 无法收缩的约束,关键业务磁盘建议初始容量保守,后续按需扩容。

  5. 内核缓存同步是常见故障点:resizepart 后若 xfs_growfs 不生效,优先执行 partprobe 或 partx -u 刷新分区表缓存。


🤖 Agent 可直接解析的元数据块(点击展开)
{
  "_meta": {
    "doc_version": "2024-08-28",
    "article_id": "linux-parted-expand",
    "profile_context": "any",
    "estimated_setup_time": "15min"
  },
  "quick_start": {
    "step_1": "sudo parted /dev/sdb print",
    "step_2": "sudo umount /data1",
    "step_3": "sudo parted /dev/sdb resizepart 2 100%",
    "step_4": "sudo xfs_growfs /data1",
    "step_5": "df -h /data1"
  },
  "safety_rules": [
    "resizepart 前必须记录并确认 Start 扇区不变",
    "resizepart 要求分区卸载,xfs_growfs 要求分区挂载",
    "XFS 不支持收缩,扩容前评估不可逆",
    "操作前确保 /data1 数据已备份"
  ],
  "verification": {
    "check_partition": "sudo parted /dev/sdb print | grep Number",
    "check_filesystem": "df -h /data1",
    "check_kernel_cache": "cat /sys/block/sdb/sdb2/size"
  },
  "troubleshooting": {
    "xfs_growfs_no_change": "sudo partprobe /dev/sdb && sudo xfs_growfs /data1",
    "wrong_fs_type": "sudo xfs_repair -n /dev/sdb2"
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#容量规划
上次更新: 9/11/2026

← Linux 文件权限的三个反直觉陷阱 实用linux命令-sed→

最近更新
01
DeepSeek Harness 实战 06|学习笔记:插件、工具、技能不在同一个维度上 原创
09-11
02
DeepSeek Harness 实战 05|让两个编码 Agent 共用一份长期记忆 原创
09-09
03
DeepSeek Harness 实战 04|学习笔记:从「已知限制」里读出三处设计张力 原创
09-08
更多文章>
Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式