分区工具实战(上):fdisk 命令详解、创建主分区与扩展分区、分区类型 ID 修改

说到分区工具,fdisk 绝对是 Linux 世界里的老大哥。我刚开始做运维那会儿,图形化工具还没这么普及,几乎所有的分区操作都得靠它。虽然现在有 parted、gdisk 这些后起之秀,但 fdisk 依然是排查问题时的首选——因为它轻量、稳定,几乎每个发行版都预装了。

这一节,我们就来彻底搞懂 fdisk。我会带着你从命令基础开始,一步步创建主分区、扩展分区,再聊聊分区类型 ID 的修改。嗯,这些操作在实战中非常高频,尤其是当你需要手动调整磁盘布局时。

fdisk 命令基础

fdisk 的全称是 "fixed disk" 或 "format disk",它操作的是 MBR(主引导记录)分区表。说白了,它就是通过命令行来读写磁盘上的分区信息。

基本用法很简单:

fdisk /dev/sdb

这条命令会进入交互模式。我个人习惯先加个 -l 参数看一眼磁盘现状:

fdisk -l /dev/sdb

这会列出磁盘的所有分区信息,而不进入交互界面。你可以看到磁盘大小、扇区数、分区表类型等关键数据。

小提示: 操作前一定要确认磁盘设备名。我曾经见过有人把 /dev/sda(系统盘)当成 /dev/sdb(数据盘)来操作,结果系统直接崩了。建议先用 lsblk 或 fdisk -l 核对两遍。

交互模式下的常用命令

进入 fdisk 交互界面后,你会看到这样一个提示符:

Command (m for help):

输入 m 可以查看帮助。但常用的命令其实就这几个:

命令 作用 我的使用频率
p 打印当前分区表 极高,每步操作前必看
n 创建新分区 极高
d 删除分区 中等
t 修改分区类型 ID 高
w 保存并退出 极高
q 不保存退出 中等,用于练习或误操作时

这里有个关键点:在输入 w 之前,所有操作都只存在于内存中。也就是说,你随便折腾,只要不写盘,磁盘本身不会有任何变化。这个特性非常适合练习。

警告: 一旦输入 w,分区表就会被立即写入。这个过程不可逆!如果你不确定当前操作是否正确,先按 q 退出,想清楚了再进来。

创建主分区

主分区是 MBR 分区表的核心。一块磁盘最多只能有 4 个主分区(因为 MBR 的分区表项只有 64 字节,每个分区占 16 字节)。

我们拿一块新加的 /dev/sdb 来演示。假设它是一块 20GB 的虚拟磁盘。

  1. 进入交互模式
fdisk /dev/sdb
  1. 查看当前状态
Command (m for help): p
Disk /dev/sdb: 20 GiB, 21474836480 bytes, 41943040 sectors
Disk model: Virtual Disk
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x12345678

看到 Disklabel type: dos 了吗?这表示当前是 MBR 分区表。如果是 gpt,那就得用 gdisk 了。

  1. 创建主分区
Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-41943039, default 2048): 
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-41943039, default 41943039): +5G

这里有几个细节:

  • 起始扇区:默认从 2048 开始,这是现代磁盘的对齐要求,能提升性能。我建议直接回车用默认值。
  • 结束扇区:可以用 +5G 这样的格式来指定大小。fdisk 会自动计算对应的扇区号。
  • 分区编号:主分区编号只能是 1-4。
  1. 确认结果
Command (m for help): p
Device     Boot Start      End  Sectors Size Id Type
/dev/sdb1        2048 10487807 10485760   5G 83 Linux

看到 Id 83 了吗?这就是分区类型 ID,表示 Linux 文件系统。

创建扩展分区与逻辑分区

如果你需要超过 4 个分区,就得用扩展分区了。扩展分区本身不能直接存数据,它只是一个"容器",里面可以再划分逻辑分区。

我当年第一次接触这个概念时也觉得绕,后来想明白了一个比喻:主分区是独立的房间,扩展分区是一个大客厅,逻辑分区就是客厅里用隔断隔出来的小工位。

继续上面的例子,我们还有 15GB 剩余空间。先创建一个扩展分区:

Command (m for help): n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended (container for logical partitions)
Select (default p): e
Partition number (2-4, default 2): 2
First sector (10487808-41943039, default 10487808): 
Last sector, +/-sectors or +/-size{K,M,G,T,P} (10487808-41943039, default 41943039): 

这里我直接回车,把剩余所有空间都给了扩展分区。然后创建逻辑分区:

Command (m for help): n
Partition type:
   p   primary (1 primary, 1 extended, 2 free)
   l   logical (numbered from 5)
Select (default p): l
Adding logical partition 5
First sector (10489856-41943039, default 10489856): 
Last sector, +/-sectors or +/-size{K,M,G,T,P} (10489856-41943039, default 41943039): +5G

注意看,逻辑分区的编号从 5 开始。这是因为 MBR 分区表中,1-4 被预留给主分区和扩展分区,逻辑分区只能从 5 往后排。

你可以重复这个过程,在扩展分区内创建多个逻辑分区。比如再来一个:

Command (m for help): n
Select (default p): l
Adding logical partition 6
First sector (20973568-41943039, default 20973568): 
Last sector, +/-sectors or +/-size{K,M,G,T,P} (20973568-41943039, default 41943039): +5G

最终的分区表看起来是这样的:

Device     Boot   Start      End  Sectors  Size Id Type
/dev/sdb1         2048 10487807 10485760    5G 83 Linux
/dev/sdb2      10487808 41943039 31455232   15G  5 Extended
/dev/sdb5      10489856 20973567 10483712    5G 83 Linux
/dev/sdb6      20973568 31457279 10483712    5G 83 Linux
核心要点: 扩展分区占用了 1 个主分区名额(这里是 /dev/sdb2),但它不直接存储数据。真正的数据分区是 /dev/sdb5 和 /dev/sdb6 这样的逻辑分区。所以,你最多可以有 4 个主分区,或者 3 个主分区 + 1 个扩展分区(里面可以放无数个逻辑分区)。

分区类型 ID 修改

分区类型 ID 是 MBR 分区表里的一个字节(16 进制),它告诉操作系统这个分区是用来干嘛的。比如:

ID 含义 常见场景
83 Linux 文件系统 普通数据分区
82 Linux swap 交换分区
8e Linux LVM LVM 物理卷
fd Linux RAID 软 RAID 分区
07 NTFS Windows 系统盘
0c FAT32 (LBA) U 盘、EFI 系统分区

为什么要改这个 ID?举个例子:如果你想把一个普通分区用作 LVM 物理卷,光有文件系统是不够的,还得把分区类型改成 8e。否则 LVM 工具可能认不出来。

操作很简单:

Command (m for help): t
Partition number (1-6, default 6): 5
Hex code (type L to list all codes): 8e
Changed type of partition 'Linux' to 'Linux LVM'.

输入 L 可以列出所有支持的 ID。不过说实话,常用的就上面那几个,记不住也没关系,现场查就行。

注意: 修改分区类型 ID 并不会格式化分区,也不会破坏数据。它只是改了分区表里的一个标记。但如果你改错了(比如把 Linux 分区改成 NTFS),系统启动时可能会因为找不到正确的文件系统而报错。所以改之前一定要确认。

保存与验证

所有操作确认无误后,输入 w 保存:

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

然后让内核重新读取分区表:

partprobe /dev/sdb

或者重启系统(不过一般不用,partprobe 就够了)。最后用 lsblk 验证:

lsblk /dev/sdb
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb      8:16   0  20G  0 disk 
├─sdb1   8:17   0   5G  0 part 
├─sdb2   8:18   0   1K  0 part 
├─sdb5   8:21   0   5G  0 part 
└─sdb6   8:22   0   5G  0 part

看到分区都认出来了,说明操作成功。

本章知识体系

下面这张图帮你梳理了 fdisk 操作的核心流程和分区结构关系:

fdisk 分区操作核心流程 磁盘 /dev/sdb fdisk /dev/sdb 进入交互 选择操作:n / d / t / p / w / q 创建分区 (n) 修改类型 ID (t) 查看分区表 (p) 保存 (w) 或放弃 (q) partprobe + lsblk 验证 主分区 ≤ 4,扩展分区占 1 个名额 逻辑分区编号从 5 开始

这张图把整个操作流程串起来了。你可以看到,核心就是三个动作:创建分区、修改 ID、查看确认。最后别忘了保存和验证。