sfdisk 是一个强大的磁盘分区表操作工具,可用于创建、修改、备份和恢复分区表。它是 fdisk 的脚本友好版本,支持从脚本或标准输入读取命令,适合自动化操作。
# 基本格式
sfdisk [选项] 设备 [命令]
# 常用格式
sfdisk [选项] 设备 < 分区脚本文件
sfdisk [选项] 设备 << EOF
分区定义
EOF
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 - 扩展分区查看磁盘分区表和详细信息:
# 查看所有磁盘分区
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 # 显示特定分区大小
备份分区表到文件,必要时恢复:
# 备份分区表到文件
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
使用脚本创建新的分区表:
# 方法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
交互式操作和修改现有分区:
# 删除所有分区
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
使用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 -d /dev/sdX > backup.txt 备份当前分区表lsblk 或 fdisk -l 确认磁盘设备名,避免操作错误磁盘-n 参数先测试,确认无误再实际执行label: gpt 或 label: dos 指定| 特性 | sfdisk | fdisk |
|---|---|---|
| 交互性 | 非交互式,适合脚本 | 交互式,适合手动操作 |
| 自动化 | 支持从文件/标准输入读取命令 | 需要手动输入命令 |
| 备份恢复 | 强大的备份恢复功能(-O/-I) | 需要手动记录分区信息 |
| 易用性 | 需要学习脚本语法 | 菜单驱动,易于使用 |
| 灵活性 | 高度灵活,支持复杂操作 | 基本分区操作 |
| 学习曲线 | 较陡峭 | 较平缓 |
如果分区表损坏但有备份:
# 从备份文件恢复
sudo sfdisk -I backup_file.bak /dev/sda
# 或从文本备份恢复
sudo sfdisk /dev/sda < partition_backup.txt
如果没有备份,可以尝试使用 testdisk 或 gpart 等工具扫描磁盘并尝试恢复。
在分区脚本开头指定 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
如果没有备份,但操作后尚未写入新数据,可以尝试:
testdisk 扫描磁盘尝试恢复