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 写入
写完之后记得用 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
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 |
4.4 分区操作流程总览
下面这张图总结了从磁盘到可用分区的完整流程,以及对齐检查的位置:
4.5 避坑指南
最后分享几个我踩过的坑:
- 分区表没刷新就操作:我曾经用 fdisk 创建完分区,直接
mkfs格式化,结果提示设备不存在。因为内核还没读到新分区表。记得用partprobe或blockdev --rereadpt。 - GPT 备份分区表被破坏:GPT 在磁盘末尾有个备份,如果磁盘容量变了(比如换了块小盘),备份位置就错了。parted 会提示,但有些人直接忽略,结果分区表损坏。我建议每次换盘都重新创建分区表。
- 分区对齐只检查起始位置:其实结束位置也要对齐,不过大部分工具会自动处理。如果你手动指定结束扇区,记得算一下。
- 在已使用的磁盘上改分区表:这不用我说了吧?先备份数据。我曾经手滑把
w敲成了q,但更惨的是敲了w才发现选错了盘……
好了,这一章的内容就到这。分区创建看起来简单,但细节不少。你想想看,一个不对齐的分区,可能让你的 SSD 性能直接腰斩。所以每次分区完,多花 10 秒检查一下对齐,绝对值得。