news 2026/2/13 15:04:30

【Linux命令大全】008.磁盘维护之sfdisk命令(实操篇)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Linux命令大全】008.磁盘维护之sfdisk命令(实操篇)

【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的分区表信息sudosfdisk -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的分区表到文件sudosfdisk -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的分区表sudosfdisk /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命令显示特定分区的大小:

# 显示分区大小(以块为单位)sudosfdisk -s /dev/sdb1# 输出示例:# 41940992# 显示所有分区的大小sudosfdisk -s

5. 更改分区类型

使用sfdisk命令更改现有分区的类型:

# 将/dev/sdb3的分区类型更改为Linux交换分区(类型82)sudosfdisk -c /dev/sdb382# 验证更改是否生效sudosfdisk -l /dev/sdb

6. 创建新的分区表

使用sfdisk命令创建新的分区表:

# 创建一个新的空分区表(警告:这会删除所有现有分区!)sudosfdisk --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# 应用分区表sudosfdisk /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格式的分区表sudosfdisk --json /dev/sdb</tmp/partitions.json

3. 复制分区表到另一个磁盘

可以使用sfdisk命令将一个磁盘的分区表复制到另一个磁盘:

# 将/dev/sdb的分区表复制到/dev/sdc(警告:这会覆盖/dev/sdc上的所有数据!)sudosfdisk -d /dev/sdb|sudosfdisk /dev/sdc# 验证复制是否成功sudosfdisk -l /dev/sdc

4. 创建GPT分区表

sfdisk命令也支持创建和管理GPT分区表:

# 创建GPT分区表sudosfdisk --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分区表sudosfdisk /dev/sdb</tmp/gpt_partitions.txt# 验证GPT分区表sudosfdisk -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"];thenecho"错误:请以root权限运行此脚本!"exit1filog"开始自动分区操作:$DISK_DEVICE"# 检查磁盘是否存在if[!-b"$DISK_DEVICE"];thenlog"错误:磁盘设备$DISK_DEVICE不存在!"exit1fi# 卸载磁盘上的所有挂载点log"正在卸载磁盘上的所有挂载点..."formount_pointin$(mount|grep"$DISK_DEVICE"|awk'{print $3}');doumount"$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_DEVICEunit: 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) "CONFIRMif[[!$CONFIRM=~^[Yy]$]];thenlog"用户取消了分区操作。"rm-f"$PARTITION_FILE"exit0fi# 应用分区表log"正在应用分区表..."sfdisk --force"$DISK_DEVICE"<"$PARTITION_FILE"if[$?-eq0];thenlog"成功:分区表应用完成!"# 重新读取分区表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_FILEelselog"错误:分区表应用失败!"exit1fi# 清理临时文件rm-f"$PARTITION_FILE"log"自动分区脚本执行完成!"# 显示结果摘要echo"\n=== 分区结果摘要 ==="sudosfdisk -l"$DISK_DEVICE"echo"详细日志请查看:$LOG_FILE"echo"分区表备份文件:$BACKUP_FILE"

6. 使用sfdisk进行高级分区操作

以下是一些sfdisk的高级分区操作示例:

# 显示分区表的详细信息(包括扩展分区和逻辑分区)sudosfdisk -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 EOFsudosfdisk /dev/sdb</tmp/extended_partitions.txt

在这个例子中,我们创建了一个主分区(/dev/sdb1)、一个扩展分区(/dev/sdb2),以及在扩展分区中创建了三个逻辑分区(/dev/sdb5、/dev/sdb6和/dev/sdb7)。

四、实用技巧与常见问题

实用技巧

  1. 使用扇区对齐提高性能

对于现代硬盘(特别是SSD和高级格式化硬盘),正确的扇区对齐可以提高性能和延长使用寿命:

# 确保分区从2048扇区开始(这是大多数现代分区工具的默认设置)# 2048扇区 = 1MB,这是大多数现代存储设备的最佳对齐单位
  1. 使用partprobe重新读取分区表

在修改分区表后,使用partprobe命令让内核重新读取分区表,避免需要重启系统:

# 修改分区表后重新读取sudosfdisk /dev/sdb<partitions.txtsudopartprobe /dev/sdb
  1. 使用numfmt转换大小单位

在脚本中,可以使用numfmt命令在不同的存储单位之间进行转换:

# 将GB转换为扇区数(假设扇区大小为512字节)SECTORS=$(numfmt --from=iec"20G"--to-unit=512)echo"20GB =$SECTORS扇区"
  1. 查看支持的分区类型

使用sfdisk命令查看所有支持的分区类型代码:

# 查看所有支持的分区类型sudosfdisk --list-types
  1. 使用–wipe选项安全擦除

在创建新分区表之前,可以使用--wipe选项安全擦除旧的分区表:

# 在创建新分区表前擦除旧的分区表sudosfdisk --wipe=always /dev/sdb

常见问题

  1. 无法应用分区表

问题描述:执行sfdisk命令时出现"Device or resource busy"或"Partition table busy"错误。

解决方法

  • 确保磁盘没有被挂载:sudo umount /dev/sdb*
  • 确保没有进程正在使用该磁盘:lsof | grep /dev/sdb
  • 使用--force参数强制应用分区表
  1. 分区表损坏

问题描述:磁盘分区表损坏,导致无法识别分区。

解决方法

  • 从备份恢复分区表:sudo sfdisk /dev/sdb < partition_table.bak
  • 使用testdisk等工具尝试恢复损坏的分区表
  • 如果没有备份且数据不重要,可以重新创建分区表
  1. 分区大小与预期不符

问题描述:创建的分区大小与指定的大小不符。

解决方法

  • 确保正确计算扇区数(注意扇区大小可能是512字节或4096字节)
  • 使用-u参数明确指定单位:sudo sfdisk -u M /dev/sdb(以MB为单位)
  1. GPT分区表问题

问题描述:在GPT分区表上操作时遇到问题。

解决方法

  • 确保使用--label=gpt参数创建GPT分区表
  • 注意GPT分区表使用的类型代码与MBR不同(例如,Linux分区是8300而不是83
  • 对于复杂的GPT分区操作,考虑使用gdisk命令
  1. 主分区数量限制

问题描述:无法创建超过4个主分区。

解决方法

  • 这是MBR分区表的限制,最多只能有4个主分区
  • 创建3个主分区和1个扩展分区,然后在扩展分区中创建多个逻辑分区
  • 或者使用GPT分区表,它没有这个限制

五、总结

sfdisk命令是Linux系统中一个功能强大的磁盘分区工具,特别适合在脚本和自动化场景中使用。通过本文的详细介绍和实例,相信您已经掌握了sfdisk命令的基本用法和高级技巧,包括如何查看分区信息、如何备份和恢复分区表、如何从脚本创建分区、如何复制分区表等。

在实际工作中,sfdisk常用于系统安装、批量部署和磁盘管理等场景。使用时,请注意以下几点:始终以root权限运行命令,操作前备份重要数据,确保磁盘未被挂载,了解MBR和GPT分区表的区别和限制,以及正确计算分区大小和位置。

记住,分区操作具有一定的风险性,可能导致数据丢失。在进行任何分区操作之前,请务必备份所有重要数据,并确保您了解自己正在执行的操作!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/12 3:31:13

深入理解大模型微调Checkpoint:从文件结构到生产部署

文章目录一 Checkpoint文件结构解析1.1 核心架构文件1.2 HuggingFace Trainer 原生状态1.3 分词器&#xff08;Tokenizer&#xff09;文件1.4 DeepSpeed ZeRO 优化器状态&#xff08;分布式训练特有&#xff09;1.5 Checkpoint 不能直接推理二 利用保存点进行推理的方法2.1 方案…

作者头像 李华
网站建设 2026/2/13 2:45:15

基于multisim的红外发射与报警接收电路设计

(1)设计一个红外发射器调制频率为30kHz。 (2)设计一个红外接收器&#xff0c;当无人遮挡红外光时&#xff0c;报警器不发报警信号。当有人遮挡光时&#xff0c;报警器发报警信号频率为800Hz。 (3)控制距离2m以上。 仿真图&#xff1a; 仿真演示与文件下载&#xff1a;基于mult…

作者头像 李华
网站建设 2026/2/13 2:45:27

Linux C/C++组件编译全解析:从源码到可执行文件的奥秘

引言&#xff1a;为什么需要了解文件后缀&#xff1f; 在Linux C/C开发中&#xff0c;不同文件后缀代表着不同的编译阶段和用途。作为开发者&#xff0c;理解这些后缀的含义不仅有助于构建系统&#xff0c;还能在调试和优化时提供重要线索。本文将基于QEMU项目中virtio-balloon…

作者头像 李华
网站建设 2026/2/12 10:49:59

CPU/内存/硬盘/网络信息提取——工业级一句话指令集

文章目录 🚀 CPU/内存/硬盘/网络信息提取——工业级一句话指令集 🔍 核心设计原则 🖥️CPU 信息(物理/逻辑/频率) 1. 物理CPU数 + 逻辑CPU数 + 每核线程数 2. 物理CPU型号 + 主频(实时 + 标称) 3. CPU架构 + 字长 + 字节序 4. CPU缓存层级(L1/L2/L3) 5. NUMA节点拓…

作者头像 李华
网站建设 2026/2/12 2:34:50

2026年,Agent与APP必有一战

旧钥匙打不开新大门&#xff0c;旧地图找不到新大陆。 刚过去的2025年&#xff0c;AI炙手可热&#xff0c;人工智能第一次走进人类日常生活——前所未有地通过手机AI甚至AI手机。 但颠覆与创新&#xff0c;也总是伴随“争议”。 从近年手机厂运用AI算法辅助&#xff0c;让更多人…

作者头像 李华
网站建设 2026/2/11 5:14:24

基于PLC的立体车库管理系统设计

基于PLC的立体车库管理系统设计与实现 第一章 绪论 随着城市汽车保有量激增&#xff0c;停车难已成为城市交通治理的核心痛点&#xff0c;立体车库凭借空间利用率高&#xff08;较传统平面车库提升3-5倍&#xff09;的优势成为主流解决方案&#xff0c;但传统立体车库多仅具备…

作者头像 李华