Linux 磁盘分区管理:fdisk 和 parted 命令详解

目录

一、磁盘分区基础概念

1.1 分区表类型对比

分区表类型 最大支持 分区数量 适用场景
MBR 2TB磁盘 4个主分区或3主+1扩展 传统BIOS系统
GPT 8ZB磁盘 128个分区(理论无限) UEFI系统,大容量磁盘

1.2 分区类型说明

  • 主分区:可直接使用的分区(最多4个)
  • 扩展分区:特殊分区,用于容纳逻辑分区
  • 逻辑分区:在扩展分区内创建的分区

二、fdisk 命令详解

2.1 fdisk 命令 - 传统分区工具

功能说明

MBR分区表管理工具,适合传统小容量磁盘

基本语法

fdisk [选项] 设备名
fdisk -l [设备名]    # 列出分区表

常用选项

选项 说明 示例
-l 列出分区表信息 fdisk -l
-s 显示分区大小(块数) fdisk -s /dev/sda1

fdisk 交互命令详解

命令 说明 功能
m 显示帮助菜单 查看所有可用命令
p 打印分区表 显示当前分区信息
n 创建新分区 添加主分区/逻辑分区
d 删除分区 删除指定分区
t 更改分区类型 设置分区系统ID
w 保存并退出 将更改写入磁盘
q 退出不保存 放弃所有更改

实战示例:创建MBR分区

示例1:查看磁盘信息

# 查看所有磁盘分区信息
fdisk -l

# 查看特定磁盘信息
fdisk -l /dev/sda

# 查看分区大小(以块为单位)
fdisk -s /dev/sda1

示例2:创建新分区表

# 对/dev/sdb进行分区操作
fdisk /dev/sdb

# fdisk交互操作序列:
Command (m for help): p    # 先查看当前分区表
Command (m for help): d    # 如果有旧分区,先删除(多次执行删除所有)
Command (m for help): n    # 创建新分区
Select (default p): p      # 选择主分区
Partition number (1-4, default 1): 1    # 分区号
First sector (2048-20971519, default 2048): Enter # 起始扇区(默认)
Last sector, +sectors or +size{K,M,G,T,P} (2048-20971519, default 20971519): +5G  # 大小5G

Command (m for help): n    # 创建第二个分区
Select (default p): p      # 主分区
Partition number (2-4, default 2): 2
First sector (10487808-20971519, default 10487808): Enter
Last sector: +10G          # 大小10G

Command (m for help): p    # 查看分区结果
Command (m for help): w    # 保存并退出

示例3:创建扩展分区和逻辑分区

fdisk /dev/sdb

Command (m for help): n
Select (default p): e      # 创建扩展分区
Partition number (1-4, default 3): 3
First sector: Enter
Last sector: Enter          # 使用剩余所有空间

Command (m for help): n    # 在扩展分区内创建逻辑分区
Select (default l): l      # 逻辑分区
First sector: Enter
Last sector: +5G

Command (m for help): n    # 创建第二个逻辑分区
Select (default l): l
First sector: Enter  
Last sector: +5G

Command (m for help): p    # 查看分区布局
Command (m for help): w    # 保存

示例4:更改分区类型

fdisk /dev/sdb

Command (m for help): t    # 更改分区类型
Partition number (1-5): 1  # 选择分区1
Hex code (type L to list all codes): L  # 查看所有类型代码
Hex code (type L to list all codes): 82  # Linux swap类型
# 常见类型:83(Linux)、82(swap)、8e(LVM)、7(HPFS/NTFS)

Command (m for help): w

fdisk 分区类型代码参考

代码 类型说明
83 Linux 原生分区
82 Linux 交换分区
8e Linux LVM 分区
07 NTFS/HPFS 分区
05 扩展分区
0b FAT32 分区

三、parted 命令详解

3.1 parted 命令 - 现代分区工具

功能说明

GPT分区表管理工具,支持大容量磁盘,功能更强大

基本语法

parted [选项] 设备名 [命令]
parted -l    # 列出所有设备分区信息

常用选项

选项 说明 示例
-l 列出所有分区信息 parted -l
-s 脚本模式(不交互) parted -s /dev/sdb mklabel gpt
-a 对齐方式 parted -a optimal /dev/sdb

parted 交互命令详解

命令 语法 说明
mklabel mklabel 标签类型 创建分区表(gpt/msdos)
mkpart mkpart 类型 文件系统 起始 结束 创建分区
rm rm 分区号 删除分区
print print 显示分区信息
resizepart resizepart 分区号 结束位置 调整分区大小
set set 分区号 标志 状态 设置分区标志

实战示例:创建GPT分区

示例1:查看磁盘信息(parted方式)

# 查看所有磁盘分区信息
parted -l

# 交互式查看特定磁盘
parted /dev/sda
(parted) print
(parted) quit

示例2:创建GPT分区表

# 非交互式创建GPT分区表
parted -s /dev/sdb mklabel gpt

# 交互式操作
parted /dev/sdb
(parted) mklabel gpt
(parted) print        # 确认分区表类型

示例3:创建GPT分区

parted /dev/sdb

# 创建第一个分区(1GB,FAT32引导分区)
(parted) mkpart primary fat32 1MiB 1025MiB
(parted) set 1 boot on    # 设置引导标志

# 创建第二个分区(20GB,Linux系统分区)
(parted) mkpart primary ext4 1025MiB 21505MiB

# 创建第三个分区(使用剩余空间,交换分区)
(parted) mkpart primary linux-swap 21505MiB 100%

(parted) print        # 查看分区结果
(parted) quit

示例4:使用百分比和单位创建分区

parted /dev/sdb

# 使用百分比创建分区
(parted) mkpart primary ext4 0% 50%    # 前半部分
(parted) mkpart primary ext4 50% 100% # 后半部分

# 使用不同单位
(parted) mkpart primary ext4 1MB 1000MB    # MB单位
(parted) mkpart primary ext4 1000MB 10GB   # GB单位

(parted) print        # 查看单位显示

示例5:调整分区大小

parted /dev/sdb

# 先删除分区(注意:会丢失数据!)
(parted) rm 2

# 重新创建更大分区
(parted) mkpart primary ext4 1025MiB 30GB

# 或者调整现有分区大小(需要文件系统支持)
(parted) resizepart 2 30GB

(parted) print

parted 单位说明

单位 说明 示例
MiB 兆字节(1024×1024字节) 1024MiB
GiB 千兆字节 10GiB
MB 兆字节(1000×1000字节) 1000MB
GB 千兆字节 10GB
% 磁盘百分比 0% 50%

四、fdisk vs parted 功能对比

4.1 特性对比表

特性 fdisk parted
分区表支持 主要MBR,有限GPT 完整MBR/GPT支持
磁盘容量 最大2TB 理论无限(8ZB)
分区数量 主分区4个+逻辑分区 GPT支持128个分区
交互模式 传统命令行交互 更现代的命令语法
脚本支持 有限 优秀的脚本支持
调整分区 不支持在线调整 支持部分调整
单位支持 扇区为主 支持多种单位

4.2 选择建议

  • 小容量磁盘(<2TB):fdisk 足够使用
  • 大容量磁盘(>2TB):必须使用 parted/GPT
  • UEFI系统:必须使用 parted/GPT
  • 自动化脚本:parted 更合适
  • 传统BIOS:fdisk/MBR 兼容性好

五、分区后操作流程

5.1 刷新内核分区表

# 方法1:重启系统(最彻底)
reboot

# 方法2:使用partprobe(推荐)
partprobe /dev/sdb

# 方法3:强制内核重读分区表
partx -a /dev/sdb
kpartx -af /dev/sdb

# 检查是否识别成功
lsblk /dev/sdb
fdisk -l /dev/sdb

5.2 创建文件系统

# 创建ext4文件系统
mkfs.ext4 /dev/sdb1
mkfs -t ext4 /dev/sdb1

# 创建XFS文件系统
mkfs.xfs /dev/sdb2

# 创建交换分区
mkswap /dev/sdb3
swapon /dev/sdb3

# 创建FAT32文件系统
mkfs.fat -F32 /dev/sdb4
mkfs.vfat /dev/sdb4

# 查看文件系统信息
blkid /dev/sdb1
file -s /dev/sdb1

5.3 挂载使用新分区

# 创建挂载点
mkdir /mnt/newdisk

# 临时挂载
mount /dev/sdb1 /mnt/newdisk

# 配置开机自动挂载
echo "/dev/sdb1 /mnt/newdisk ext4 defaults 0 0" >> /etc/fstab

# 或者使用UUID(推荐)
UUID=$(blkid -s UUID -o value /dev/sdb1)
echo "UUID=$UUID /mnt/newdisk ext4 defaults 0 0" >> /etc/fstab

# 测试fstab配置
mount -a
df -h /mnt/newdisk

六、综合实战示例

6.1 完整磁盘初始化流程

场景:新硬盘/dev/sdb初始化

#!/bin/bash
# disk_init.sh

DISK="/dev/sdb"
MOUNT_POINT="/data"

echo "=== 开始初始化磁盘 $DISK ==="

# 1. 检查磁盘是否存在
if [ ! -e $DISK ]; then
    echo "错误:磁盘 $DISK 不存在"
    exit 1
fi

# 2. 创建GPT分区表
echo "创建GPT分区表..."
parted -s $DISK mklabel gpt

# 3. 创建分区(使用全部空间)
echo "创建分区..."
parted -s $DISK mkpart primary ext4 1MiB 100%

# 4. 刷新分区表
echo "刷新分区表..."
partprobe $DISK
sleep 2

# 5. 创建文件系统
echo "创建ext4文件系统..."
mkfs.ext4 ${DISK}1

# 6. 创建挂载点
echo "创建挂载点..."
mkdir -p $MOUNT_POINT

# 7. 配置自动挂载
echo "配置自动挂载..."
UUID=$(blkid -s UUID -o value ${DISK}1)
echo "UUID=$UUID $MOUNT_POINT ext4 defaults 0 0" >> /etc/fstab

# 8. 挂载分区
echo "挂载分区..."
mount -a

# 9. 验证结果
echo "验证安装..."
df -h $MOUNT_POINT
lsblk $DISK

echo "=== 磁盘初始化完成 ==="

6.2 多分区配置示例

场景:数据磁盘配置多个分区

#!/bin/bash
# multi_partition_setup.sh

DISK="/dev/sdc"
BASE_MOUNT="/storage"

echo "配置多分区磁盘 $DISK"

# 创建GPT分区表
parted -s $DISK mklabel gpt

# 创建多个分区
parted -s $DISK mkpart primary ext4 1MiB 10GiB    # 分区1:10GB
parted -s $DISK mkpart primary ext4 10GiB 30GiB   # 分区2:20GB  
parted -s $DISK mkpart primary ext4 30GiB 60GiB   # 分区3:30GB
parted -s $DISK mkpart primary ext4 60GiB 100%    # 分区4:剩余空间

# 刷新分区表
partprobe $DISK
sleep 3

# 创建文件系统和挂载点
for i in {1..4}; do
    # 创建文件系统
    mkfs.ext4 ${DISK}$i

    # 创建挂载点
    MOUNT_DIR="$BASE_MOUNT/part$i"
    mkdir -p $MOUNT_DIR

    # 获取UUID并配置fstab
    UUID=$(blkid -s UUID -o value ${DISK}$i)
    echo "UUID=$UUID $MOUNT_DIR ext4 defaults 0 0" >> /etc/fstab

    echo "分区 ${DISK}$i 配置完成 → $MOUNT_DIR"
done

# 挂载所有分区
mount -a

# 验证结果
echo "=== 分区配置结果 ==="
df -h | grep $BASE_MOUNT
lsblk $DISK

七、课堂练习题目

练习1:fdisk 基础操作(20分钟)

任务:使用fdisk创建MBR分区表

# 要求:
# 1. 在虚拟磁盘上创建MBR分区表
# 2. 创建2个主分区(各5GB)
# 3. 创建扩展分区包含2个逻辑分区(各2GB)
# 4. 设置不同的分区类型

参考步骤

# 创建虚拟磁盘
dd if=/dev/zero of=/tmp/disk.img bs=1M count=20
sudo losetup /dev/loop10 /tmp/disk.img

# fdisk操作
sudo fdisk /dev/loop10
# 按照前面示例创建分区
# 最后验证:sudo fdisk -l /dev/loop10

练习2:parted GPT分区(25分钟)

任务:使用parted创建GPT分区表

# 要求:
# 1. 创建GPT分区表
# 2. 创建4个分区,使用不同文件系统
# 3. 设置分区标志(boot, esp等)
# 4. 使用百分比和具体单位混合配置

参考步骤

# 创建大虚拟磁盘
dd if=/dev/zero of=/tmp/gpt_disk.img bs=1M count=50
sudo losetup /dev/loop11 /tmp/gpt_disk.img

# parted操作
sudo parted /dev/loop11
# 按照GPT示例创建分区

练习3:故障排查实战(15分钟)

任务:解决常见分区问题

# 场景:
# 1. 分区表损坏恢复
# 2. 分区未识别问题
# 3. 文件系统创建失败
# 4. 挂载错误处理

解决方案

# 1. 分区表恢复尝试
sudo fsck /dev/sdb1
sudo testdisk /dev/sdb    # 需要安装testdisk

# 2. 强制重读分区表
sudo partprobe /dev/sdb
sudo hdparm -z /dev/sdb

# 3. 文件系统修复
sudo fsck.ext4 -f /dev/sdb1
sudo xfs_repair /dev/sdb2

# 4. 挂载问题排查
sudo dmesg | grep sdb     # 查看内核日志
sudo blkid /dev/sdb1      # 检查文件系统类型
sudo mount -t ext4 /dev/sdb1 /mnt/test  # 指定文件系统类型

练习4:自动化分区脚本(30分钟)

任务:编写自动分区配置脚本

# 要求:
# 1. 检测新磁盘自动分区
# 2. 支持MBR和GPT自动选择
# 3. 根据磁盘大小智能分区
# 4. 自动配置挂载和fstab

参考答案框架

#!/bin/bash
AUTO_PARTITION_SCRIPT.sh
# 检测磁盘大小
# 选择分区表类型(<2TB用MBR,>2TB用GPT)
# 智能分区布局
# 错误处理和日志记录

八、高级技巧和注意事项

8.1 分区对齐优化

# 优化分区对齐(提高性能)
parted -a optimal /dev/sdb mkpart primary ext4 1MiB 100%

# 检查对齐状态
parted /dev/sdb align-check optimal 1

8.2 安全删除分区表

# 彻底清除分区表(谨慎使用!)
sudo dd if=/dev/zero of=/dev/sdb bs=512 count=1

# 清除GPT分区表签名
sudo sgdisk -Z /dev/sdb

8.3 备份和恢复分区表

# 备份MBR分区表
sudo dd if=/dev/sda of=/backup/sda_mbr.bak bs=512 count=1

# 备份GPT分区表
sudo sgdisk -b /backup/sda_gpt.bak /dev/sda

# 恢复分区表
sudo dd if=/backup/sda_mbr.bak of=/dev/sda bs=512 count=1

8.4 危险操作警告

# ⚠️ 绝对不要对系统盘进行错误操作!
# 确认设备名再执行!
lsblk  # 先确认设备
fdisk -l  # 再次确认

# 测试环境使用虚拟磁盘练习
dd if=/dev/zero of=/tmp/practice_disk.img bs=1M count=100

通过本教程的学习,你应该能够熟练使用fdisk和parted进行磁盘分区管理,并根据不同场景选择合适的工具和方法。

作者:严锋  创建时间:2025-11-01 11:23
最后编辑:严锋  更新时间:2025-11-04 14:01