3. 分区工具实战(下):parted命令详解、GPT分区创建、调整分区大小、对齐优化

上一节我们把 fdisk 和 gdisk 讲透了。今天聊 parted,这个工具我用了快十年。说实话,刚接触时觉得它命令太啰嗦,后来才发现——它才是真正能搞定 GPT 和分区调整的利器。

为什么这么说?fdisk 调整分区大小?不行。gdisk 虽然能处理 GPT,但交互式操作在脚本里很别扭。parted 不一样,它一条命令就能完成创建、调整、对齐,而且同时支持 MBR 和 GPT。我个人习惯,但凡涉及分区大小变更或对齐优化,首选 parted。

3.1 parted 基础操作模式

parted 有两种用法:交互式和非交互式。我建议新手先用交互式熟悉命令,生产环境用非交互式写脚本。

3.1.1 交互式模式

# 进入交互模式
parted /dev/sdb

# 查看当前分区表
(parted) print

# 查看所有可用命令
(parted) help

进入后你会发现,它的提示符是 (parted)。输入 print 就能看到分区表信息,包括分区号、起始位置、结束位置、大小、文件系统类型和标志位。嗯,这里要注意——它显示的是 起始和结束的扇区号,而不是像 fdisk 那样只显示柱面。

3.1.2 非交互式模式(脚本友好)

# 一条命令完成:创建 GPT 分区表 + 创建分区
parted /dev/sdb mklabel gpt mkpart primary ext4 0% 100%

这种写法在自动化部署脚本里非常常见。我曾经帮一家云厂商写初始化脚本,几百台机器批量分区,用的就是这种一行命令搞定。

3.2 GPT 分区创建实战

我们直接上手。假设有一块新硬盘 /dev/sdc,需要创建 GPT 分区表,然后分三个区:一个 500MB 的 EFI 系统分区,一个 8GB 的交换分区,剩下的给数据分区。

3.2.1 创建 GPT 分区表

parted /dev/sdc mklabel gpt

这一步会把磁盘上所有数据清掉。我之前有个同事,在已使用的磁盘上执行了这条命令,结果数据全丢了。所以——执行前一定确认磁盘是空的。

3.2.2 创建 EFI 系统分区

parted /dev/sdc mkpart primary fat32 1MiB 501MiB
parted /dev/sdc set 1 esp on

EFI 分区有几个要点:

  • 文件系统用 FAT32,不能用 ext4
  • 起始位置从 1MiB 开始,留出 MBR 保护区
  • 大小建议 100MB~500MB,这里给了 500MB
  • 必须设置 esp 标志(EFI System Partition)

3.2.3 创建交换分区和数据分区

# 创建 8GB 交换分区
parted /dev/sdc mkpart primary linux-swap 501MiB 8.5GiB

# 剩余空间全给数据分区
parted /dev/sdc mkpart primary ext4 8.5GiB 100%

注意这里的分区大小单位:MiB 和 GiB 是二进制单位,MB 和 GB 是十进制单位。parted 默认用二进制,我个人习惯统一用 MiB/GiB,避免换算误差。

3.2.4 验证分区结果

parted /dev/sdc print

输出应该类似这样:

编号 起始 结束 大小 文件系统 名称 标志
1 1049kB 525MB 524MB fat32 primary esp
2 525MB 9127MB 8602MB linux-swap(v1) primary
3 9127MB 107GB 98.2GB ext4 primary

3.3 调整分区大小

这是 parted 的杀手锏。fdisk 做不到,gdisk 很麻烦,但 parted 可以 在线调整(前提是文件系统支持)。

⚠️ 重要警告: 调整分区大小有数据丢失风险。操作前务必备份!我曾经在生产环境上调整一个 2TB 的分区,中间断电了……嗯,从那以后我再也不敢不备份就操作了。

3.3.1 扩大分区

假设我们要把数据分区 /dev/sdc3 扩大到 120GB:

# 先调整分区大小
parted /dev/sdc resizepart 3 120GiB

# 然后调整文件系统大小(ext4 需要单独执行)
resize2fs /dev/sdc3

注意顺序:先调分区,再调文件系统。反过来会出问题。

3.3.2 缩小分区

缩小分区风险更高,步骤也更严格:

# 1. 先检查文件系统
e2fsck -f /dev/sdc3

# 2. 缩小文件系统到目标大小(比如 80GB)
resize2fs /dev/sdc3 80G

# 3. 再缩小分区
parted /dev/sdc resizepart 3 80GiB

顺序和扩大正好相反:先缩文件系统,再缩分区。而且缩小前必须做文件系统检查,否则数据会损坏。

💡 经验之谈: 缩小分区时,文件系统大小要略小于分区大小。比如分区缩到 80GiB,文件系统缩到 79.9GiB,留点余量。我见过有人设成一样,结果分区表写不进去。

3.4 分区对齐优化

分区对齐,说白了就是让分区的起始位置落在物理扇区的边界上。现代硬盘都是 4K 扇区(512e 或 4Kn),如果分区没对齐,读写性能会下降 30%~50%。

3.4.1 为什么需要对齐?

你想想看,一个 4K 物理扇区,操作系统却按 512 字节逻辑扇区去读写。如果分区起始位置不是 4K 的整数倍,一次 4K 写入就会变成两次物理 I/O。这就是所谓的 读-改-写 问题。

3.4.2 如何检查对齐?

# 查看分区起始扇区
parted /dev/sdc unit s print

看起始扇区号是否能被 8 整除(8 个逻辑扇区 = 1 个 4K 物理扇区)。如果能,说明对齐了。

更简单的方法:

# 直接检查对齐状态
parted /dev/sdc align-check optimal 1

返回 1 aligned 表示对齐,0 not aligned 表示没对齐。

3.4.3 如何创建对齐的分区?

parted 默认从 0 扇区开始,这会导致不对齐。正确的做法:

# 方法一:指定起始位置为 1MiB(推荐)
parted /dev/sdc mkpart primary ext4 1MiB 100%

# 方法二:使用百分比,parted 会自动对齐
parted /dev/sdc mkpart primary ext4 0% 100%

我个人强烈建议用 1MiB 对齐。为什么是 1MiB?因为 1MiB = 1024 * 1024 字节 = 256 个 4K 扇区,能被所有常见物理扇区大小整除。这是业界的标准做法。

3.4.4 对齐优化对比

对齐方式 起始位置 兼容性 性能 推荐场景
未对齐 63 扇区(传统 MBR) 差 低(降 30%~50%) 不推荐
4K 对齐 8 扇区倍数 一般 中 老旧系统兼容
1MiB 对齐 2048 扇区 最好 最高 所有现代系统

3.5 核心知识体系

下面这张图总结了本章的核心逻辑,我把它画成了流程图,方便你理解 parted 的操作脉络:

parted 分区操作核心流程 parted 分区操作核心流程 选择磁盘 /dev/sdX mklabel gpt / msdos mkpart 创建分区 resizepart 调整大小 align-check 对齐检查 指定起始/结束位置 建议 1MiB 对齐 先缩文件系统 / 后缩分区 或先扩分区 / 后扩文件系统 检查起始扇区 % 8 == 0 或使用 align-check optimal print 验证分区表 核心原则:1MiB 对齐 + 先缩文件系统再缩分区 + 操作前务必备份

3.6 避坑指南与最佳实践

最后,分享几个我踩过的坑:

  • 不要在挂载的分区上调整大小——虽然 parted 允许,但风险极高。我建议先 umount,调整完再挂载。
  • 调整分区大小后,一定要检查文件系统——用 e2fsck -f 扫一遍,确认没问题再使用。
  • GPT 分区表有备份——它在磁盘末尾也存了一份。如果调整分区时破坏了末尾的备份,可以用 gdisk 的恢复功能修复。
  • 对齐检查不是可选项——SSD 和 4K 硬盘必须对齐。我见过有人没对齐,结果数据库写入延迟高了 3 倍。

一句话总结: parted 是分区调整的首选工具。记住三个关键点——1MiB 对齐、先缩文件系统再缩分区、操作前备份。做到这三点,分区操作基本不会翻车。