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 可以 在线调整(前提是文件系统支持)。
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
顺序和扩大正好相反:先缩文件系统,再缩分区。而且缩小前必须做文件系统检查,否则数据会损坏。
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 的操作脉络:
3.6 避坑指南与最佳实践
最后,分享几个我踩过的坑:
- 不要在挂载的分区上调整大小——虽然 parted 允许,但风险极高。我建议先 umount,调整完再挂载。
- 调整分区大小后,一定要检查文件系统——用
e2fsck -f扫一遍,确认没问题再使用。 - GPT 分区表有备份——它在磁盘末尾也存了一份。如果调整分区时破坏了末尾的备份,可以用
gdisk的恢复功能修复。 - 对齐检查不是可选项——SSD 和 4K 硬盘必须对齐。我见过有人没对齐,结果数据库写入延迟高了 3 倍。
一句话总结: parted 是分区调整的首选工具。记住三个关键点——1MiB 对齐、先缩文件系统再缩分区、操作前备份。做到这三点,分区操作基本不会翻车。