Linux 硬盘分区详解:掌握 fdisk 命令

在 Linux 系统中,硬盘分区是管理存储设备的基础操作之一。合理的分区方案不仅能提高磁盘空间利用率,还能实现数据隔离(如系统文件与用户数据分离)、多系统引导(如双系统)、优化性能(如 swap 分区)等功能。fdisk 是 Linux 下最经典的磁盘分区工具,支持 MBR(Master Boot Record)和 GPT(GUID Partition Table)两种分区表格式,适用于各类存储设备(机械硬盘、SSD、U盘等)。

本文将详细介绍 fdisk 命令的使用方法,从磁盘设备识别、分区表类型选择,到创建/删除/修改分区的完整流程,结合实际案例和最佳实践,帮助读者快速掌握 Linux 硬盘分区技能。

目录#

  1. 前置准备与风险提示
  2. Linux 磁盘设备命名规则
  3. fdisk 命令基础
  4. 使用 fdisk 进行分区操作(详细步骤)
    • 4.1 查看磁盘信息
    • 4.2 进入 fdisk 交互模式
    • 4.3 创建新分区(主分区/扩展分区/逻辑分区)
    • 4.4 修改分区类型(如 swap、LVM)
    • 4.5 删除分区
    • 4.6 保存并应用分区表
  5. 常见分区场景示例
    • 5.1 新建磁盘全部分区为单个 ext4 分区
    • 5.2 创建 swap 分区
    • 5.3 MBR 分区表下创建扩展分区及逻辑分区
  6. 最佳实践与注意事项
  7. 故障排查
  8. 参考资料

1. 前置准备与风险提示#

在进行分区操作前,请务必完成以下准备工作,并注意潜在风险:

准备工作:#

  • 备份数据:分区操作可能导致数据丢失,建议提前备份目标磁盘上的所有重要数据。
  • 获取 root 权限:分区操作需要管理员权限,通过 sudo -isu 切换至 root 用户。
  • 确认磁盘设备:通过 lsblkfdisk -l 确认目标磁盘路径(如 /dev/sdb),避免误操作系统盘(通常为 /dev/sda
  • 卸载目标磁盘:若磁盘已挂载,需先卸载(如 umount /dev/sdb1),否则分区表无法修改。

风险提示:#

  • 错误操作可能导致数据永久丢失,务必确认目标磁盘路径
  • MBR 分区表仅支持最大 2TB 磁盘,且最多 4 个主分区;GPT 无此限制,推荐现代系统使用 GPT。
  • 分区表修改后需重启系统或刷新内核分区表(partprobe /dev/sdX)才能生效。

2. Linux 磁盘设备命名规则#

Linux 中磁盘和分区通过设备文件表示,路径位于 /dev/ 目录下,命名规则如下:

设备类型命名格式示例说明
SATA/SCSI 硬盘/dev/sda, /dev/sdbsd 开头,字母 abc... 区分不同磁盘(如 sda 是第一块盘)。
NVMe 硬盘/dev/nvme0n1NVMe 设备以 nvme 开头,0 表示控制器编号,n1 表示命名空间(通常为 1)。
分区/dev/sda1, /dev/nvme0n1p2分区编号从 1 开始,MBR 分区最多 4 个主分区(编号 1-4),逻辑分区从 5 开始;GPT 分区编号无限制。

例如:/dev/sdb3 表示第二块 SATA 硬盘的第 3 个分区;/dev/nvme0n1p1 表示第一块 NVMe 硬盘的第 1 个分区。

3. fdisk 命令基础#

fdisk 是一款交互式分区工具,支持 MBR 和 GPT 分区表,基本语法如下:

fdisk [选项] 设备路径

常用选项:

  • -l:列出所有磁盘及分区信息(需 root 权限)。
  • -u:以扇区(sector)为单位显示分区大小(默认以柱面 cylinder 为单位)。
  • -t:指定分区类型(较少用,通常在交互模式中设置)。

进入交互模式后,可通过以下核心命令操作分区(输入 m 可查看完整帮助):

命令功能描述
p打印当前磁盘的分区表信息。
n创建新分区(主分区/扩展分区/逻辑分区)。
d删除指定分区。
t修改分区类型(如 Linux、swap、LVM 等)。
a设置分区为可引导(仅 MBR 分区表有效)。
w保存分区表并退出(执行此命令后分区才生效)。
q放弃修改并退出(不保存)。
g创建 GPT 分区表(覆盖原有分区表,数据将丢失)。
o创建 MBR 分区表(覆盖原有分区表,数据将丢失)。

4. 使用 fdisk 进行分区操作(详细步骤)#

以下以一块新磁盘 /dev/sdb 为例,演示完整分区流程。

4.1 查看磁盘信息#

首先通过 fdisk -l 确认磁盘信息:

fdisk -l /dev/sdb  # 查看指定磁盘信息

输出示例(GPT 磁盘):

Disk /dev/sdb: 100 GiB, 107374182400 bytes, 209715200 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: gpt  # 当前分区表类型为 GPT
Disk identifier: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX

关键信息:磁盘大小(100 GiB)、扇区数(209715200)、分区表类型(GPT/MBR)。

4.2 进入 fdisk 交互模式#

输入以下命令进入 /dev/sdb 的分区交互界面:

fdisk /dev/sdb

进入后,终端提示 Command (m for help):,此时可输入命令进行操作。

4.3 创建新分区#

步骤 1:选择分区表类型(首次分区时)#

若磁盘未分区(或需重新分区),需先选择分区表类型:

  • 输入 g 创建 GPT 分区表(推荐,支持 >2TB 磁盘和无限分区)。
  • 输入 o 创建 MBR 分区表(仅支持 ≤2TB 磁盘,最多 4 主分区)。

步骤 2:创建分区#

输入 n 创建新分区,按提示完成以下配置:

  1. 选择分区类型(仅 MBR 分区表需要):

    • p:主分区(最多 4 个)。
    • e:扩展分区(只能创建 1 个,用于容纳逻辑分区)。
  2. 分区编号:默认按顺序分配(如 1、2、3...),直接回车使用默认值。

  3. 起始扇区:分区的起始位置,默认从空闲空间的第一个扇区开始,直接回车即可。

  4. 结束扇区:分区的结束位置,可通过以下方式指定:

    • 按扇区数:如 +2G(分配 2GB 空间)、+500M(500MB)、+100%(使用全部剩余空间)。

示例(创建一个 20GB 的主分区):

Command (m for help): n
Partition number (1-128, default 1):  # 直接回车,默认分区号 1
First sector (2048-209715166, default 2048):  # 直接回车,从默认起始扇区开始
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-209715166, default 209715166): +20G  # 分配 20GB

Created a new partition 1 of type 'Linux filesystem' and of size 20 GiB.

4.4 修改分区类型#

默认分区类型为 Linux filesystem(类型代码 8300,GPT)或 Linux(类型代码 83,MBR)。若需创建 swap、LVM 等特殊分区,需通过 t 命令修改类型。

步骤:#

  1. 输入 t,选择要修改的分区(如分区 1)。
  2. 输入分区类型代码(可输入 L 查看所有类型)。

常见分区类型代码(GPT/MBR):

用途GPT 类型代码MBR 类型代码
Linux ext4830083
Linux swap820082
LVM 物理卷8e008e
EFI 系统分区ef00ef

示例(将分区 1 修改为 swap 类型):

Command (m for help): t
Selected partition 1
Partition type (type L to list all types): 8200  # GPT 类型代码
Changed type of partition 'Linux filesystem' to 'Linux swap'.

4.5 删除分区#

若需删除分区,输入 d 并选择分区编号:

Command (m for help): d
Partition number (1-1, default 1): 1  # 选择要删除的分区编号
Partition 1 has been deleted.

警告:删除分区会直接清除分区表信息,数据无法恢复,操作前务必确认!

4.6 保存并应用分区表#

完成分区配置后,输入 w 保存并退出:

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

此时,内核可能未立即识别新分区表,需执行以下命令刷新:

partprobe /dev/sdb  # 刷新分区表(无需重启)

若刷新失败,可重启系统或使用 partx -u /dev/sdb 强制更新。

5. 常见分区场景示例#

5.1 新建磁盘全部分区为单个 ext4 分区#

目标:将 /dev/sdb 全部分配为一个 ext4 分区。

步骤:

  1. 查看磁盘:fdisk -l /dev/sdb
  2. 进入 fdisk:fdisk /dev/sdb
  3. 创建 GPT 分区表:输入 g
  4. 创建分区:输入 n,默认分区号 1,起始扇区默认,结束扇区输入 +100%(使用全部空间)。
  5. 保存退出:输入 w
  6. 刷新分区表:partprobe /dev/sdb
  7. 格式化分区:mkfs.ext4 /dev/sdb1(ext4 文件系统)。
  8. 挂载分区:mount /dev/sdb1 /mnt/data(临时挂载),或写入 /etc/fstab 实现开机自动挂载。

5.2 创建 swap 分区#

目标:在 /dev/sdb 上创建一个 8GB 的 swap 分区。

步骤:

  1. 进入 fdisk:fdisk /dev/sdb
  2. 创建分区:输入 n,分区号 2,大小 +8G
  3. 修改类型:输入 t,选择分区 2,输入类型代码 8200(GPT)或 82(MBR)。
  4. 保存退出:w,刷新分区表:partprobe /dev/sdb
  5. 格式化 swap:mkswap /dev/sdb2
  6. 启用 swap:swapon /dev/sdb2,并写入 /etc/fstab(添加 UUID=xxx none swap sw 0 0)。

5.3 MBR 分区表下创建扩展分区及逻辑分区#

MBR 分区表最多支持 4 个主分区,若需更多分区,需创建 1 个扩展分区,再在其中划分逻辑分区(编号从 5 开始)。

示例(在 /dev/sdb 创建 1 主分区 + 1 扩展分区 + 2 逻辑分区):

  1. 进入 fdisk:fdisk /dev/sdb
  2. 创建 MBR 分区表:输入 o
  3. 创建主分区 1(20GB):np → 分区号 1 → 大小 +20G
  4. 创建扩展分区(剩余空间):ne → 分区号 2 → 结束扇区默认(使用剩余空间)。
  5. 在扩展分区内创建逻辑分区 5(10GB):n → 直接回车(默认逻辑分区)→ 大小 +10G
  6. 创建逻辑分区 6(剩余空间):n → 直接回车 → 结束扇区默认。
  7. 保存退出:w,刷新分区表。

6. 最佳实践与注意事项#

  1. 优先选择 GPT 分区表

    • 支持 >2TB 磁盘,无分区数量限制(最多 128 个 GPT 分区),更适合现代存储设备。
    • MBR 仅用于兼容性场景(如旧 BIOS 主板)。
  2. 合理规划分区大小

    • 系统分区(/)建议 ≥20GB(SSD 推荐 ≥30GB)。
    • swap 分区:物理内存 ≤8GB 时,建议设置为内存大小的 1.5 倍;内存 >8GB 时,可设为 8-16GB(或按需调整)。
    • 数据分区(如 /home)建议独立划分,便于系统重装时保留数据。
  3. 避免分区操作已挂载的磁盘

    • 分区表修改需卸载磁盘,否则会提示 Device or resource busy
  4. 验证分区表

    • 保存后通过 fdisk -l /dev/sdX 确认分区是否正确。
    • 通过 lsblk 查看分区大小和类型是否符合预期。
  5. 标签化分区

    • 使用 e2label(ext 系列)或 xfs_admin -L(XFS)为分区添加标签,便于挂载(如 LABEL=data /mnt/data ext4 defaults 0 0)。

7. 故障排查#

问题 1:fdisk: cannot open /dev/sdb: Device or resource busy#

原因:磁盘已挂载。
解决:卸载所有分区:umount /dev/sdb*,或通过 fuser -m /dev/sdb 查找占用进程并关闭。

问题 2:分区创建后无法格式化(如 mkfs.ext4: could not open /dev/sdb1: No such file or directory#

原因:内核未识别新分区表。
解决:执行 partprobe /dev/sdbpartx -u /dev/sdb,若无效则重启系统。

问题 3:MBR 分区表无法创建第 5 个分区#

原因:MBR 最多 4 个主分区,需创建扩展分区后再划分逻辑分区。
解决:删除一个主分区,创建扩展分区,再在扩展分区内创建逻辑分区(编号从 5 开始)。

8. 参考资料#

通过本文,你已掌握 fdisk 命令的核心用法及分区最佳实践。分区操作需谨慎,建议在测试环境中反复练习后再操作生产环境磁盘。如有疑问,可随时查阅 man fdisk 或社区文档获取更多细节。