linux sfdisk命令

命令简介

sfdisk 是一个强大的磁盘分区表操作工具,可用于创建、修改、备份和恢复分区表。它是 fdisk 的脚本友好版本,支持从脚本或标准输入读取命令,适合自动化操作。

警告:sfdisk 操作会直接影响磁盘分区表,误操作可能导致数据丢失!操作前请务必备份重要数据

基本语法

# 基本格式
sfdisk [选项] 设备 [命令]

# 常用格式
sfdisk [选项] 设备 < 分区脚本文件
sfdisk [选项] 设备 << EOF
分区定义
EOF

常用选项

选项 描述
-l, --list 列出磁盘分区表(不进行修改)
-d, --dump 以可重用格式输出分区表(用于备份)
-s, --show-size 显示分区大小(以块为单位)
-g, --show-geometry 显示磁盘几何信息
-u, --unit 显示单位:S(扇区)、B(字节)、C(柱面)、M(MB)
-f, --force 强制执行操作,不进行确认
-N 分区号 仅对指定分区号进行操作
-n, --no-act 测试运行,不实际写入磁盘
-O 文件 写入前备份原始分区表到指定文件
-I 文件 从备份文件恢复分区表
-V, --verify 检查分区表是否正确

分区脚本语法

sfdisk 可以使用脚本定义分区,每行定义一个分区,格式如下:

# 格式:[起始扇区] [大小] [类型] [引导标志] [开始,结束] [属性]
# 示例:
/dev/sda1 : start=2048, size=1048576, type=83, bootable
/dev/sda2 : start=1050624, size=2097152, type=82
/dev/sda3 : start=3147776, size=, type=83

# 或简化格式(起始,大小,类型,引导标志):
/dev/sda1 : 2048,1048576,83,*
/dev/sda2 : 1050624,2097152,82
/dev/sda3 : 3147776,,83

分区类型代码:

  • 83 - Linux 文件系统(ext2/3/4, xfs, btrfs等)
  • 82 - Linux swap 分区
  • 8e - Linux LVM 分区
  • fd - Linux RAID 自动检测
  • ef - EFI 系统分区(UEFI)
  • 0b - FAT32(Windows 95)
  • 07 - HPFS/NTFS/exFAT(Windows)
  • 05 - 扩展分区

实际示例

示例1:查看分区表信息

查看磁盘分区表和详细信息:

# 查看所有磁盘分区
sudo sfdisk -l

# 查看指定磁盘分区
sudo sfdisk -l /dev/sda

# 以扇区为单位显示
sudo sfdisk -l -u S /dev/sda

# 显示磁盘几何信息
sudo sfdisk -g /dev/sda

# 显示分区大小(以块为单位)
sudo sfdisk -s /dev/sda
sudo sfdisk -s /dev/sda1  # 显示特定分区大小

示例2:备份和恢复分区表

备份分区表到文件,必要时恢复:

# 备份分区表到文件
sudo sfdisk -d /dev/sda > sda_partition_backup.txt

# 备份时同时备份到文件
sudo sfdisk -O /backup/sda_partition.bak /dev/sda

# 从文件恢复分区表
sudo sfdisk /dev/sda < sda_partition_backup.txt

# 从备份文件恢复
sudo sfdisk -I /backup/sda_partition.bak /dev/sda

# 测试恢复(不实际写入)
sudo sfdisk -n /dev/sda < sda_partition_backup.txt

示例3:创建新分区表

使用脚本创建新的分区表:

# 方法1:使用Here Document创建分区
sudo sfdisk /dev/sdb << EOF
label: gpt
device: /dev/sdb
unit: sectors

/dev/sdb1 : start=2048, size=1048576, type=EF00
/dev/sdb2 : start=1050624, size=2097152, type=8300
/dev/sdb3 : start=3147776, size=, type=8300
EOF

# 方法2:从脚本文件创建
# 创建分区脚本文件 partition_script.txt
cat > partition_script.txt << 'EOF'
# partition table of /dev/sdc
label: dos
label-id: 0x12345678
device: /dev/sdc
unit: sectors

/dev/sdc1 : start=2048, size=2097152, type=83, bootable
/dev/sdc2 : start=2099200, size=4194304, type=82
/dev/sdc3 : start=6293504, size=, type=83
EOF

# 应用分区脚本
sudo sfdisk /dev/sdc < partition_script.txt

示例4:交互式操作和修改分区

交互式操作和修改现有分区:

# 删除所有分区
sudo sfdisk --delete /dev/sda

# 删除特定分区
sudo sfdisk --delete /dev/sda 2  # 删除第二个分区

# 更改分区类型
sudo sfdisk --part-type /dev/sda 1 83  # 将第一个分区改为Linux类型

# 切换引导标志
sudo sfdisk -A /dev/sda 1  # 切换第一个分区的引导标志

# 调整分区大小(危险操作!)
# 先备份,然后重新创建分区表
sudo sfdisk -d /dev/sda > backup.txt
# 编辑backup.txt文件中的分区大小
# 然后恢复
sudo sfdisk /dev/sda < backup.txt

示例5:高级用法 - 自动分区

使用sfdisk进行自动化分区操作:

#!/bin/bash
# 自动分区脚本示例
DISK="/dev/sdd"
BACKUP_FILE="/root/partition_backup.txt"

# 备份现有分区表
echo "备份分区表..."
sfdisk -d $DISK > $BACKUP_FILE 2>/dev/null || true

# 创建新的GPT分区表
echo "创建新的GPT分区表..."
echo "label: gpt" | sfdisk $DISK

# 创建分区
echo "创建分区..."
cat << EOF | sfdisk $DISK
size=1G, type=EF00, name="EFI System"
size=2G, type=8200, name="Linux swap"
size=10G, type=8300, name="Linux root"
size=+, type=8300, name="Linux home"
EOF

# 格式化分区
echo "格式化分区..."
mkfs.fat -F32 ${DISK}1
mkswap ${DISK}2
mkfs.ext4 ${DISK}3
mkfs.ext4 ${DISK}4

echo "分区完成!"

使用注意事项

重要警告
  • 数据丢失风险:sfdisk 会直接修改磁盘分区表,错误操作可能导致所有数据丢失
  • 备份分区表:操作前务必使用 sfdisk -d /dev/sdX > backup.txt 备份当前分区表
  • 确认设备:使用 lsblkfdisk -l 确认磁盘设备名,避免操作错误磁盘
  • 卸载分区:操作前确保相关分区已卸载
  • 测试运行:使用 -n 参数先测试,确认无误再实际执行
  • GPT vs MBR:注意区分GPT和MBR分区表,使用 label: gptlabel: dos 指定

sfdisk 与 fdisk 比较

特性 sfdisk fdisk
交互性 非交互式,适合脚本 交互式,适合手动操作
自动化 支持从文件/标准输入读取命令 需要手动输入命令
备份恢复 强大的备份恢复功能(-O/-I) 需要手动记录分区信息
易用性 需要学习脚本语法 菜单驱动,易于使用
灵活性 高度灵活,支持复杂操作 基本分区操作
学习曲线 较陡峭 较平缓

常见问题

如果分区表损坏但有备份:

# 从备份文件恢复
sudo sfdisk -I backup_file.bak /dev/sda

# 或从文本备份恢复
sudo sfdisk /dev/sda < partition_backup.txt

如果没有备份,可以尝试使用 testdiskgpart 等工具扫描磁盘并尝试恢复。

在分区脚本开头指定 label: gpt

cat > gpt_partition.txt << 'EOF'
label: gpt
device: /dev/sdb
unit: sectors

/dev/sdb1 : start=2048, size=1048576, type=C12A7328-F81F-11D2-BA4B-00A0C93EC93B
/dev/sdb2 : start=1050624, size=2097152, type=0657FD6D-A4AB-43C4-84E5-0933C84B4F4F
/dev/sdb3 : start=3147776, size=, type=0FC63DAF-8483-4772-8E79-3D69D8477DE4
EOF

sudo sfdisk /dev/sdb < gpt_partition.txt

如果操作前备份了分区表,可以直接恢复:

sudo sfdisk -I backup.bak /dev/sda

如果没有备份,但操作后尚未写入新数据,可以尝试:

  1. 立即断电(防止数据覆盖)
  2. 使用Live CD/USB启动
  3. 使用 testdisk 扫描磁盘尝试恢复
  4. 联系专业数据恢复服务