【Linux命令大全】008.磁盘维护之sfdisk命令(实操篇)
✨ 本文为Linux系统磁盘维护命令的全面汇总与深度优化,结合图标、结构化排版与实用技巧,专为高级用户和系统管理员打造。
(关注不迷路哈!!!)
文章目录
- 【Linux命令大全】008.磁盘维护之sfdisk命令(实操篇)
-
- 一、功能与作用
- 二、基本用法
-
- 1. 显示磁盘分区信息
- 2. 备份分区表
- 3. 恢复分区表
- 4. 显示分区大小
- 5. 更改分区类型
- 6. 创建新的分区表
- 三、高级用法
-
- 1. 从脚本创建分区
- 2. 使用JSON格式定义分区
- 3. 复制分区表到另一个磁盘
- 4. 创建GPT分区表
- 5. 在自动化脚本中使用sfdisk
- 6. 使用sfdisk进行高级分区操作
- 四、实用技巧与常见问题
-
- 实用技巧
- 常见问题
- 五、总结
一、功能与作用
sfdisk命令是Linux系统中一个强大的磁盘分区工具,主要用于创建、修改和显示分区表。与传统的交互式分区工具(如fdisk)不同,sfdisk是一个非交互式命令行工具,特别适合在脚本中使用或进行自动化分区操作。它支持多种分区表格式,包括传统的MBR(Master Boot Record)和较新的GPT(GUID Partition Table)。
sfdisk命令在系统安装、磁盘管理和自动化部署中具有以下重要作用:
- 创建和管理磁盘分区表
- 备份和恢复分区表
- 在脚本中进行自动化分区操作
- 复制分区表从一个磁盘到另一个磁盘
- 支持多种分区表格式,包括MBR和GPT
参数详解
| -d | 显示分区表详情 |
| -l | 列出所有磁盘的分区信息 |
| -s | 显示分区大小 |
| -c | 更改分区类型 |
| -f | 强制操作 |
| -n | 不执行操作,只显示结果 |
| -u | 设置单位 |
二、基本用法
1. 显示磁盘分区信息
使用sfdisk命令查看指定磁盘的分区表信息:
# 显示/dev/sdb的分区表信息
sudo sfdisk -l /dev/sdb
# 输出示例:
# Disk /dev/sdb: 465.8 GiB, 500107862016 bytes, 976773168 sectors
# Units: sectors of 1 * 512 = 512 bytes
# Sector size (logical/physical): 512 bytes / 4096 bytes
# I/O size (minimum/optimal): 4096 bytes / 4096 bytes
# Disklabel type: dos
# Disk identifier: 0x12345678
#
# Device Boot Start End Sectors Size Id Type
# /dev/sdb1 2048 41943039 41940992 20G 83 Linux
# /dev/sdb2 41943040 83886079 41943040 20G 83 Linux
# /dev/sdb3 83886080 125829119 41943040 20G 83 Linux
2. 备份分区表
使用sfdisk命令备份磁盘的分区表到文件:
# 备份/dev/sdb的分区表到文件
sudo sfdisk -d /dev/sdb > /backup/sdb_partition_table.bak
# 查看备份文件内容
cat /backup/sdb_partition_table.bak
# 输出示例:
# # partition table of /dev/sdb
# unit: sectors
#
# /dev/sdb1 : start= 2048, size= 41940992, type=83
# /dev/sdb2 : start= 41943040, size= 41943040, type=83
# /dev/sdb3 : start= 83886080, size= 41943040, type=83
3. 恢复分区表
使用之前备份的分区表文件恢复磁盘分区表:
# 从备份文件恢复/dev/sdb的分区表
sudo sfdisk /dev/sdb < /backup/sdb_partition_table.bak
# 输出示例:
# Checking that no-one is using this disk right now … OK
#
# Disk /dev/sdb: 465.8 GiB, 500107862016 bytes, 976773168 sectors
# Units: sectors of 1 * 512 = 512 bytes
# Sector size (logical/physical): 512 bytes / 4096 bytes
# I/O size (minimum/optimal): 4096 bytes / 4096 bytes
# Disklabel type: dos
# Disk identifier: 0x12345678
#
# Old situation:
#
# Device Boot Start End Sectors Size Id Type
# /dev/sdb1 2048 41943039 41940992 20G 83 Linux
# /dev/sdb2 41943040 83886079 41943040 20G 83 Linux
# /dev/sdb3 83886080 125829119 41943040 20G 83 Linux
#
# New situation:
#
# Device Boot Start End Sectors Size Id Type
# /dev/sdb1 2048 41943039 41940992 20G 83 Linux
# /dev/sdb2 41943040 83886079 41943040 20G 83 Linux
# /dev/sdb3 83886080 125829119 41943040 20G 83 Linux
#
# The partition table has been altered.
# Calling ioctl() to re-read partition table.
# Syncing disks.
4. 显示分区大小
使用sfdisk命令显示特定分区的大小:
# 显示分区大小(以块为单位)
sudo sfdisk -s /dev/sdb1
# 输出示例:
# 41940992
# 显示所有分区的大小
sudo sfdisk -s
5. 更改分区类型
使用sfdisk命令更改现有分区的类型:
# 将/dev/sdb3的分区类型更改为Linux交换分区(类型82)
sudo sfdisk -c /dev/sdb 3 82
# 验证更改是否生效
sudo sfdisk -l /dev/sdb
6. 创建新的分区表
使用sfdisk命令创建新的分区表:
# 创建一个新的空分区表(警告:这会删除所有现有分区!)
sudo sfdisk –wipe=always /dev/sdb
三、高级用法
1. 从脚本创建分区
sfdisk最强大的功能之一是可以从脚本或文本文件中创建分区。以下是一个简单的例子:
# 创建一个定义分区的文本文件
cat > /tmp/partitions.txt << EOF
# partition table of /dev/sdb
unit: sectors
/dev/sdb1 : start= 2048, size= 41940992, type=83
/dev/sdb2 : start= 41943040, size= 83886080, type=83
/dev/sdb3 : start=125829120, size= 41943040, type=82
EOF
# 应用分区表
sudo sfdisk /dev/sdb < /tmp/partitions.txt
这个例子创建了三个分区:一个20GB的Linux分区,一个40GB的Linux分区,和一个20GB的交换分区。
2. 使用JSON格式定义分区
在较新版本的sfdisk中,支持使用JSON格式定义分区:
# 创建一个JSON格式的分区定义文件
cat > /tmp/partitions.json << EOF
{
"partitiontable": {
"label": "dos",
"id": "0x12345678",
"device": "/dev/sdb",
"unit": "sectors",
"partitions": [
{
"start": 2048,
"size": 41940992,
"type": "83",
"bootable": true
},
{
"start": 41943040,
"size": 83886080,
"type": "83"
},
{
"start": 125829120,
"size": 41943040,
"type": "82"
}
]
}
}
EOF
# 应用JSON格式的分区表
sudo sfdisk –json /dev/sdb < /tmp/partitions.json
3. 复制分区表到另一个磁盘
可以使用sfdisk命令将一个磁盘的分区表复制到另一个磁盘:
# 将/dev/sdb的分区表复制到/dev/sdc(警告:这会覆盖/dev/sdc上的所有数据!)
sudo sfdisk -d /dev/sdb | sudo sfdisk /dev/sdc
# 验证复制是否成功
sudo sfdisk -l /dev/sdc
4. 创建GPT分区表
sfdisk命令也支持创建和管理GPT分区表:
# 创建GPT分区表
sudo sfdisk –label=gpt /dev/sdb
# 创建一个GPT分区定义文件
cat > /tmp/gpt_partitions.txt << EOF
# partition table of /dev/sdb
unit: sectors
/dev/sdb1 : start= 2048, size= 41940992, type=8300
/dev/sdb2 : start= 41943040, size= 83886080, type=8300
/dev/sdb3 : start=125829120, size= 41943040, type=8200
EOF
# 应用GPT分区表
sudo sfdisk /dev/sdb < /tmp/gpt_partitions.txt
# 验证GPT分区表
sudo sfdisk -l /dev/sdb
对于GPT分区表,分区类型代码略有不同:Linux分区使用8300,交换分区使用8200。
5. 在自动化脚本中使用sfdisk
以下是一个更完整的示例,展示如何在自动化部署脚本中使用sfdisk:
#!/bin/bash
# 自动分区脚本
DISK_DEVICE="/dev/sdb"
ROOT_PARTITION_SIZE="20G"
HOME_PARTITION_SIZE="40G"
SWAP_PARTITION_SIZE="8G"
LOG_FILE="/var/log/autopartition.log"
# 记录日志函数
log() {
echo "[$(date)] $1" >> $LOG_FILE
}
# 检查是否以root权限运行
if [ "$(id -u)" != "0" ]; then
echo "错误:请以root权限运行此脚本!"
exit 1
fi
log "开始自动分区操作:$DISK_DEVICE"
# 检查磁盘是否存在
if [ ! -b "$DISK_DEVICE" ]; then
log "错误:磁盘设备 $DISK_DEVICE 不存在!"
exit 1
fi
# 卸载磁盘上的所有挂载点
log "正在卸载磁盘上的所有挂载点…"
for mount_point in $(mount | grep "$DISK_DEVICE" | awk '{print $3}'); do
umount "$mount_point"
log "已卸载:$mount_point"
done
# 备份当前分区表(如果有)
BACKUP_FILE="/backup/${DISK_DEVICE##*/}_partition_table_$(date +%Y%m%d%H%M%S).bak"
log "正在备份当前分区表到 $BACKUP_FILE…"
mkdir -p /backup
sfdisk -d "$DISK_DEVICE" > "$BACKUP_FILE"
# 创建分区定义文件
PARTITION_FILE="/tmp/${DISK_DEVICE##*/}_partitions.txt"
log "正在创建分区定义文件:$PARTITION_FILE"
# 转换分区大小为扇区数
SECTOR_SIZE=512 # 假设扇区大小为512字节
# 计算各分区的扇区数
ROOT_SECTORS=$(( $(numfmt —from=iec "$ROOT_PARTITION_SIZE") / $SECTOR_SIZE ))
HOME_SECTORS=$(( $(numfmt —from=iec "$HOME_PARTITION_SIZE") / $SECTOR_SIZE ))
SWAP_SECTORS=$(( $(numfmt —from=iec "$SWAP_PARTITION_SIZE") / $SECTOR_SIZE ))
# 计算分区起始位置
ROOT_START=2048 # 默认从2048扇区开始
HOME_START=$((ROOT_START + ROOT_SECTORS))
SWAP_START=$((HOME_START + HOME_SECTORS))
# 创建分区定义
cat > "$PARTITION_FILE" << EOF
# partition table of $DISK_DEVICE
unit: sectors
${DISK_DEVICE}1 : start= $ROOT_START, size= $ROOT_SECTORS, type=83, bootable
${DISK_DEVICE}2 : start= $HOME_START, size= $HOME_SECTORS, type=83
${DISK_DEVICE}3 : start= $SWAP_START, size= $SWAP_SECTORS, type=82
EOF
# 显示分区计划
echo "\\n=== 分区计划 ==="
cat "$PARTITION_FILE"
echo "\\n注意:此操作将覆盖 $DISK_DEVICE 上的所有数据!"
read -p "确认继续吗?(y/N) " CONFIRM
if [[ ! $CONFIRM =~ ^[Yy]$ ]]; then
log "用户取消了分区操作。"
rm -f "$PARTITION_FILE"
exit 0
fi
# 应用分区表
log "正在应用分区表…"
sfdisk –force "$DISK_DEVICE" < "$PARTITION_FILE"
if [ $? -eq 0 ]; then
log "成功:分区表应用完成!"
# 重新读取分区表
partprobe "$DISK_DEVICE"
# 格式化分区
log "正在格式化分区…"
# 格式化根分区
mkfs.ext4 -L root "${DISK_DEVICE}1"
# 格式化家目录分区
mkfs.ext4 -L home "${DISK_DEVICE}2"
# 格式化交换分区
mkswap -L swap "${DISK_DEVICE}3"
# 显示结果
log "分区操作完成,新的分区表:"
sfdisk -l "$DISK_DEVICE" >> $LOG_FILE
else
log "错误:分区表应用失败!"
exit 1
fi
# 清理临时文件
rm -f "$PARTITION_FILE"
log "自动分区脚本执行完成!"
# 显示结果摘要
echo "\\n=== 分区结果摘要 ==="
sudo sfdisk -l "$DISK_DEVICE"
echo "详细日志请查看:$LOG_FILE"
echo "分区表备份文件:$BACKUP_FILE"
6. 使用sfdisk进行高级分区操作
以下是一些sfdisk的高级分区操作示例:
# 显示分区表的详细信息(包括扩展分区和逻辑分区)
sudo sfdisk -d /dev/sdb
# 创建一个带扩展分区的分区表
cat > /tmp/extended_partitions.txt << EOF
# partition table of /dev/sdb
unit: sectors
/dev/sdb1 : start= 2048, size= 41940992, type=83, bootable
/dev/sdb2 : start= 41943040, size=209715200, type=5
/dev/sdb5 : start= 41945088, size= 41940992, type=83
/dev/sdb6 : start= 83886080, size= 41943040, type=83
/dev/sdb7 : start=125829120, size= 41943040, type=82
EOF
sudo sfdisk /dev/sdb < /tmp/extended_partitions.txt
在这个例子中,我们创建了一个主分区(/dev/sdb1)、一个扩展分区(/dev/sdb2),以及在扩展分区中创建了三个逻辑分区(/dev/sdb5、/dev/sdb6和/dev/sdb7)。
四、实用技巧与常见问题
实用技巧
对于现代硬盘(特别是SSD和高级格式化硬盘),正确的扇区对齐可以提高性能和延长使用寿命:
# 确保分区从2048扇区开始(这是大多数现代分区工具的默认设置)
# 2048扇区 = 1MB,这是大多数现代存储设备的最佳对齐单位
在修改分区表后,使用partprobe命令让内核重新读取分区表,避免需要重启系统:
# 修改分区表后重新读取
sudo sfdisk /dev/sdb < partitions.txt
sudo partprobe /dev/sdb
在脚本中,可以使用numfmt命令在不同的存储单位之间进行转换:
# 将GB转换为扇区数(假设扇区大小为512字节)
SECTORS=$(numfmt –from=iec "20G" –to-unit=512)
echo "20GB = $SECTORS 扇区"
使用sfdisk命令查看所有支持的分区类型代码:
# 查看所有支持的分区类型
sudo sfdisk –list-types
在创建新分区表之前,可以使用–wipe选项安全擦除旧的分区表:
# 在创建新分区表前擦除旧的分区表
sudo sfdisk –wipe=always /dev/sdb
常见问题
问题描述:执行sfdisk命令时出现"Device or resource busy"或"Partition table busy"错误。
解决方法:
- 确保磁盘没有被挂载:sudo umount /dev/sdb*
- 确保没有进程正在使用该磁盘:lsof | grep /dev/sdb
- 使用–force参数强制应用分区表
问题描述:磁盘分区表损坏,导致无法识别分区。
解决方法:
- 从备份恢复分区表:sudo sfdisk /dev/sdb < partition_table.bak
- 使用testdisk等工具尝试恢复损坏的分区表
- 如果没有备份且数据不重要,可以重新创建分区表
问题描述:创建的分区大小与指定的大小不符。
解决方法:
- 确保正确计算扇区数(注意扇区大小可能是512字节或4096字节)
- 使用-u参数明确指定单位:sudo sfdisk -u M /dev/sdb(以MB为单位)
问题描述:在GPT分区表上操作时遇到问题。
解决方法:
- 确保使用–label=gpt参数创建GPT分区表
- 注意GPT分区表使用的类型代码与MBR不同(例如,Linux分区是8300而不是83)
- 对于复杂的GPT分区操作,考虑使用gdisk命令
问题描述:无法创建超过4个主分区。
解决方法:
- 这是MBR分区表的限制,最多只能有4个主分区
- 创建3个主分区和1个扩展分区,然后在扩展分区中创建多个逻辑分区
- 或者使用GPT分区表,它没有这个限制
五、总结
sfdisk命令是Linux系统中一个功能强大的磁盘分区工具,特别适合在脚本和自动化场景中使用。通过本文的详细介绍和实例,相信您已经掌握了sfdisk命令的基本用法和高级技巧,包括如何查看分区信息、如何备份和恢复分区表、如何从脚本创建分区、如何复制分区表等。
在实际工作中,sfdisk常用于系统安装、批量部署和磁盘管理等场景。使用时,请注意以下几点:始终以root权限运行命令,操作前备份重要数据,确保磁盘未被挂载,了解MBR和GPT分区表的区别和限制,以及正确计算分区大小和位置。
记住,分区操作具有一定的风险性,可能导致数据丢失。在进行任何分区操作之前,请务必备份所有重要数据,并确保您了解自己正在执行的操作!
网硕互联帮助中心

评论前必须登录!
注册