分区工具实战(上):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 的虚拟磁盘。
- 进入交互模式
fdisk /dev/sdb
- 查看当前状态
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 了。
- 创建主分区
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。
- 确认结果
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
分区类型 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。不过说实话,常用的就上面那几个,记不住也没关系,现场查就行。
保存与验证
所有操作确认无误后,输入 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 操作的核心流程和分区结构关系:
这张图把整个操作流程串起来了。你可以看到,核心就是三个动作:创建分区、修改 ID、查看确认。最后别忘了保存和验证。