4、分区表的创建与操作:fdisk、parted 与分区对齐

好,咱们进入实操环节。前面聊了那么多分区表的结构和原理,现在该动手了。这一章我会带你过一遍 Linux 下最常用的两个分区工具——fdisk 和 parted,顺便把「分区对齐」这个坑讲清楚。

我个人习惯是:MBR 用 fdisk,GPT 用 parted。但也不是绝对的,fdisk 新版也支持 GPT,只是有些细节不一样。咱们一个一个来。

4.1 使用 fdisk 创建 MBR 分区

fdisk 是老牌工具了。我最早接触 Linux 时用的就是它,那时候硬盘才几十 GB,分区也简单。现在虽然硬盘大了,但 fdisk 处理 MBR 依然顺手。

基本用法:

# 查看当前磁盘分区情况
sudo fdisk -l

# 进入交互模式,操作 /dev/sda
sudo fdisk /dev/sda

进入交互模式后,常用命令就这几个:

命令 作用
m 显示帮助菜单
p 打印当前分区表
n 新建分区
d 删除分区
t 修改分区类型 ID
w 写入分区表并退出
q 不保存直接退出

举个例子,创建一个 2GB 的主分区:

sudo fdisk /dev/sdb

# 输入 n 新建分区
# 选择 p 为主分区
# 分区号默认 1
# 起始扇区默认 2048(这就是对齐的起点)
# 结束扇区输入 +2G
# 输入 w 写入
小提示:fdisk 默认起始扇区是 2048,这正好是 1MB 对齐(512B × 2048 = 1MB)。现代硬盘和 SSD 都推荐这个值。

写完之后记得用 partprobe 或重启让内核重新读取分区表:

sudo partprobe /dev/sdb

4.2 使用 parted 创建 GPT 分区

对于 GPT 分区表,我强烈建议用 parted。为什么?因为 fdisk 对 GPT 的支持是后来加的,有些老版本用起来会出问题。我曾经在某个嵌入式项目里用 fdisk 操作 GPT,结果分区表校验和算错了,整块盘认不出来……从那以后,GPT 我只用 parted。

parted 有两种模式:命令行模式和交互模式。我习惯用命令行模式,脚本化方便。

先看怎么把磁盘改成 GPT:

# 将 /dev/sdc 设为 GPT 分区表(注意:这会清空所有数据)
sudo parted /dev/sdc mklabel gpt

然后创建分区:

# 创建一个从 1MB 开始,大小为 4GB 的主分区
sudo parted /dev/sdc mkpart primary 1MiB 4GiB

# 创建第二个分区,使用剩余全部空间
sudo parted /dev/sdc mkpart primary 4GiB 100%

这里有个细节:parted 默认单位是 MiB,不是 MB。1MiB = 1048576 字节,而 1MB = 1000000 字节。用 MiB 能保证分区对齐到物理扇区边界。

查看分区信息:

sudo parted /dev/sdc print

输出大概长这样:

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

Number  Start   End     Size    File system  Name     Flags
 1      1049kB  4295MB  4294MB               primary
 2      4295MB  21.5GB  17.2GB               primary
注意:parted 的 mkpart 不会自动创建文件系统。分区创建完后,你还得用 mkfs.ext4 或 mkfs.xfs 等工具格式化。

4.3 分区对齐的概念

分区对齐,说白了就是让分区的起始位置正好落在物理扇区的边界上。为什么这事重要?

传统硬盘的扇区大小是 512 字节,但现代硬盘(尤其是 4K 高级格式化硬盘)的物理扇区是 4096 字节。如果分区起始位置不对齐,一个逻辑扇区可能跨越两个物理扇区,读写时就要多读一次,性能直接打折扣。

我在一个存储服务器项目里遇到过:两块一模一样的硬盘,一块对齐了,一块没对齐,4K 随机写入性能差了将近 30%。嗯,从那以后我每次分区都会检查对齐。

怎么检查对齐?用 fdisk 看:

sudo fdisk -l /dev/sdb

# 输出中会显示每个分区的起始扇区
# 如果起始扇区能被 8 整除(512B × 8 = 4096B),就是 4K 对齐
# 如果起始扇区是 2048,那肯定对齐了

用 parted 检查更直观:

sudo parted /dev/sdb align-check optimal 1
# 如果返回 "1 aligned",说明分区 1 对齐了

对齐的推荐值:

硬盘类型 推荐对齐单位 起始扇区
512B 扇区传统硬盘 63 扇区(旧)或 2048 扇区 63 或 2048
4K 高级格式化硬盘 1MB(2048 扇区) 2048
SSD / NVMe 1MB 或更高(如 2MB) 2048 或 4096
核心原则:起始扇区 × 扇区大小 = 物理块大小的整数倍。对于 4K 硬盘,起始扇区必须是 8 的倍数(512B × 8 = 4096B)。用 2048 扇区(1MB)是最安全的做法,兼容所有现代硬盘。

4.4 分区操作流程总览

下面这张图总结了从磁盘到可用分区的完整流程,以及对齐检查的位置:

分区创建与对齐检查流程 选择磁盘设备 选择分区表类型 MBR (fdisk) GPT (parted) 创建分区 检查对齐 fdisk -l 查看扇区 parted align-check 写入分区表 格式化 & 挂载 对齐检查要点 起始扇区 ÷ 8 = 整数 → 4K 对齐 起始扇区 = 2048 → 1MB 对齐

4.5 避坑指南

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

  • 分区表没刷新就操作:我曾经用 fdisk 创建完分区,直接 mkfs 格式化,结果提示设备不存在。因为内核还没读到新分区表。记得用 partprobe 或 blockdev --rereadpt。
  • GPT 备份分区表被破坏:GPT 在磁盘末尾有个备份,如果磁盘容量变了(比如换了块小盘),备份位置就错了。parted 会提示,但有些人直接忽略,结果分区表损坏。我建议每次换盘都重新创建分区表。
  • 分区对齐只检查起始位置:其实结束位置也要对齐,不过大部分工具会自动处理。如果你手动指定结束扇区,记得算一下。
  • 在已使用的磁盘上改分区表:这不用我说了吧?先备份数据。我曾经手滑把 w 敲成了 q,但更惨的是敲了 w 才发现选错了盘……

好了,这一章的内容就到这。分区创建看起来简单,但细节不少。你想想看,一个不对齐的分区,可能让你的 SSD 性能直接腰斩。所以每次分区完,多花 10 秒检查一下对齐,绝对值得。