news 2026/5/7 3:01:39

fdisk 命令全攻略:从磁盘分区入门到 Shell 自动化实战,搞定 Linux 存储管理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
fdisk 命令全攻略:从磁盘分区入门到 Shell 自动化实战,搞定 Linux 存储管理

导读:在 Linux 系统中,磁盘分区是管理存储设备的基础操作,而fdisk作为一款经典的磁盘分区工具,几乎是每个 Linux 管理员的必备技能。它不仅能完成基础的分区创建、删除,还能应对分区表备份、类型修改等高级需求,甚至能通过 Shell 脚本实现自动化运维。接下来,我们从场景、语法、用法、实践到脚本,一步步解锁fdisk的全部能力。

一、fdisk 命令适用场景:什么时候该用它管理磁盘?

fdisk是一款面向磁盘分区表的交互性工具,主要用于MBR(主引导记录)磁盘(也支持部分 GPT 磁盘操作),日常工作中以下场景一定会用到它:

  1. 新硬盘初始化:服务器或电脑新增硬盘后,必须用fdisk创建分区(如划分系统分区、数据分区),否则无法格式化和使用;
  2. 现有分区调整:需要缩小 / 扩大分区(需配合文件系统工具)、删除无用分区,或修改分区类型(如将普通分区改为 swap 分区);
  3. 分区信息排查:当系统识别不到磁盘、不确定分区大小 / 类型时,用fdisk查看分区表,快速定位存储设备状态;
  4. 分区表故障修复:误删分区、分区表损坏时,通过fdisk结合备份文件恢复分区结构,避免数据丢失(需提前备份)。

二、fdisk 基本语法:3 分钟掌握核心格式与选项

fdisk的语法结构简洁,核心是 “选项 + 目标设备”,无需复杂参数即可上手,常用格式和选项如下:

1. 基本语法格式

fdisk[选项][目标磁盘设备文件]
  • 目标磁盘设备文件:Linux 中磁盘以/dev/sdX(SATA/SCSI 磁盘)、/dev/vdX(虚拟磁盘,如 KVM)、/dev/nvmeXnY(NVMe 磁盘)命名,比如/dev/sda(第一块 SATA 磁盘)、/dev/vdb(第二块虚拟磁盘);
  • 注意:操作时必须指定 “磁盘”(如/dev/sda),而非 “分区”(如/dev/sda1),否则会报错。

2. 高频实用选项

选项作用说明示例
-l列出指定磁盘的分区表信息(不加磁盘则列所有磁盘)fdisk -l /dev/sda(查看 sda 磁盘分区)
-u显示分区大小时,以 “扇区数” 替代 “柱面数”(更精准)fdisk -lu /dev/sdb(按扇区显示 sdb 分区)
-v查看 fdisk 版本信息fdisk -v
-w强制写入分区表(默认交互模式下保存时自动触发)一般无需手动用,交互时按w即可
-d清空指定磁盘的分区表(危险!需谨慎)fdisk -d /dev/sdc(清空 sdc 所有分区)

三、fdisk 基本使用方法:手把手教你分区操作

fdisk默认是交互模式,进入后通过快捷键执行操作,新手只需记住 5 个核心指令(p查看、n新建、d删除、w保存、q退出),以下以 “给新磁盘/dev/sdb创建 1 个 20GB 分区” 为例,演示完整流程:

1. 进入 fdisk 交互模式

fdisk/dev/sdb

执行后会进入交互界面,提示 “输入命令操作”,此时可输入快捷键执行功能。

2. 查看磁盘当前状态(关键!避免误操作)

输入p(print,打印分区表),查看磁盘大小、现有分区(新磁盘无分区,会显示 “没有分区”):

Command (m for help): p Disk /dev/sdb: 100 GiB, 107374182400 bytes, 209715200 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0xabcdef12 Device Boot Start End Sectors Size Id Type # 新磁盘此处无分区记录

3. 新建分区(核心操作)

输入n(new,新建分区),按提示选择分区类型、编号、大小:

  1. 选择分区类型:输入p(primary,主分区)或e(extended,扩展分区),新手选p即可;
  2. 分区编号:默认从 1 开始(如sdb1),直接按回车;
  3. 起始扇区:默认从磁盘第一个可用扇区开始,直接按回车;
  4. 结束扇区:指定分区大小,输入+20G(表示分区大小 20GB),按回车;

过程如下:

Command (m for help): n Partition type p primary (0 primary, 0 extended, 4 free) e extended (container for logical partitions) Select (default p): p Partition number (1-4, default 1): First sector (2048-209715199, default 2048): Last sector, +sectors or +size{K,M,G,T,P} (2048-209715199, default 209715199): +20G Created a new partition 1 of type 'Linux' and of size 20 GiB.

4. 保存分区表(必须!否则操作无效)

输入w(write,写入),系统会将分区表写入磁盘,并提示 “同步分区表”:

Command (m for help): w The partition table has been altered. Calling ioctl() to re-read partition table. Syncing disks.

5. 让系统识别新分区(关键步骤,否则看不到分区)

保存后需通知系统刷新分区表,无需重启,执行以下命令:

partprobe /dev/sdb

此时用ls /dev/sdb1即可看到新创建的分区。

6. 删除分区(谨慎操作!会清空数据)

若需删除分区,进入交互模式后:

  1. 输入p查看要删除的分区编号(如sdb1的编号是 1);
  2. 输入d,再输入分区编号(如 1);
  3. 输入w保存,完成删除。

四、fdisk 高级使用方法:搞定复杂存储需求

掌握基础操作后,fdisk还能应对更复杂的场景,比如修改分区类型、备份分区表、处理 GPT 磁盘等,这些功能在生产环境中非常实用。

1. 修改分区类型 ID(如改为 swap、LVM 分区)

Linux 通过 “分区类型 ID” 识别分区用途(如普通分区 ID 是 83,swap 是 82,LVM 是 8e),修改步骤如下:

  1. 进入fdisk /dev/sdb,输入p查看分区(如要修改sdb1);
  2. 输入t(type,修改类型);
  3. 输入分区编号(如 1);
  4. 输入目标类型 ID(如82表示 swap,8e表示 LVM);
  5. 输入p验证类型已修改,再输入w保存;

示例(将sdb1改为 swap 分区):

Command (m for help): t Selected partition 1 Hex code (type L to list all codes): 82 Changed type of partition 'Linux' to 'Linux swap / Solaris'. Command (m for help): p # 此时sdb1的Type会显示为“Linux swap / Solaris”

2. 备份与恢复分区表(防分区表损坏)

分区表损坏会导致磁盘无法识别,提前备份至关重要,借助fdiskdd命令实现:

  • 备份分区表:MBR 分区表前 512 字节包含分区信息,用dd备份到文件:

    # 备份/dev/sda的分区表到sda_mbr_backup.binddif=/dev/sdaof=/root/sda_mbr_backup.binbs=512count=1
  • 恢复分区表:若分区表损坏,用备份文件恢复(需确保磁盘大小一致):

    # 从备份文件恢复到/dev/sda(危险!需停止磁盘读写)ddif=/root/sda_mbr_backup.binof=/dev/sdabs=512count=1# 恢复后刷新分区表partprobe /dev/sda

3. 用 fdisk 操作 GPT 磁盘(基础支持)

fdisk对 GPT 磁盘的支持不如gdisk全面,但可完成基础操作,比如创建 GPT 分区表:

  1. 进入fdisk /dev/sdc,输入g(gpt,创建 GPT 分区表);
  2. 输入n创建分区(步骤同 MBR,GPT 支持更多分区);
  3. 输入w保存,此时磁盘标签类型会变为gpt

注意:GPT 磁盘建议用gdisk工具,fdisk仅用于临时应急操作。

五、fdisk 最佳实践:结合其他命令解决实际问题

fdisk单独使用时功能有限,结合blkidmounttestdisk等工具,能解决 90% 的 Linux 存储问题,以下是 3 个高频实战场景:

1. 新硬盘快速初始化并挂载(生产环境常用)

需求:给服务器新增/dev/sdb硬盘,创建 1 个分区,格式化为 ext4,挂载到/data,并设置开机自动挂载。

步骤:

# 1. 用fdisk创建分区(按上文步骤,此处用非交互命令快速执行)echo-e"n\np\n1\n\n+50G\nw"|fdisk/dev/sdb# 2. 刷新分区表partprobe /dev/sdb# 3. 格式化为ext4文件系统mkfs.ext4 /dev/sdb1# 4. 创建挂载目录mkdir-p /data# 5. 临时挂载mount/dev/sdb1 /data# 6. 获取分区UUID(用于fstab,避免设备名变化导致挂载失败)UUID=$(blkid /dev/sdb1|awk-F'"''{print$2}')# 7. 写入fstab,实现开机自动挂载echo"UUID=$UUID/data ext4 defaults 0 0">>/etc/fstab# 8. 验证挂载(查看是否成功)df-h /data

2. 批量检查多台服务器磁盘分区状态

需求:管理 10 台服务器,需快速确认所有服务器的/dev/sda磁盘分区是否正常(无损坏、分区大小符合预期)。

步骤:

  1. 准备服务器 IP 列表(server_list.txt):

    192.168.1.101 192.168.1.102 ...
  2. ssh结合fdisk批量执行检查:

    # 循环遍历服务器,执行fdisk查看分区,输出到日志foripin$(catserver_list.txt);doecho"=== 服务器$ip的 /dev/sda 分区信息 ===">>disk_check.logsshroot@$ip"fdisk -lu /dev/sda 2>&1">>disk_check.logecho-e"\n">>disk_check.logdone# 查看结果catdisk_check.log
  3. 后续:可在脚本中添加 “分区大小校验”(如判断sda1是否为 50GB),异常时发送邮件告警。

3. 修复误删的分区表(借助备份 + testdisk)

需求:误删/dev/sdb的分区表,导致分区无法识别,但提前用dd备份过分区表(sdb_mbr_backup.bin)。

步骤:

# 1. 先尝试用备份恢复(优先方案)ddif=/root/sdb_mbr_backup.binof=/dev/sdbbs=512count=1partprobe /dev/sdb# 2. 若备份丢失,用testdisk工具扫描恢复(需安装testdisk)yuminstall-y testdisk# CentOS/RHELtestdisk /dev/sdb# 按提示选择“Analyse”扫描分区,找到后恢复

六、fdisk 在 Shell 脚本中的实战示例:自动初始化新硬盘

日常运维中,新硬盘初始化操作重复且易出错,写一个 Shell 脚本实现 “一键初始化”,包含错误处理和日志记录,可直接在生产环境使用。

1. 脚本功能说明

  • 自动检测目标磁盘是否存在(避免操作错误磁盘);
  • 用 fdisk 创建 1 个分区(大小可自定义);
  • 格式化分区为 ext4,挂载到指定目录;
  • 写入 fstab 实现开机自动挂载;
  • 输出操作日志,异常时自动退出并提示原因。

2. 完整脚本代码(auto_init_disk.sh

#!/bin/bash# 自动初始化Linux新硬盘脚本,依赖fdisk、mkfs.ext4、blkid工具# 使用方法:./auto_init_disk.sh 目标磁盘 分区大小 挂载目录# 示例:./auto_init_disk.sh /dev/sdb 50G /data# 开启错误检测:遇到错误立即退出,未定义变量报错set-euo pipefail# 1. 检查参数是否完整if[$#-ne3];thenecho"用法错误!正确格式:$0目标磁盘 分区大小 挂载目录"echo"示例:$0/dev/sdb 50G /data"exit1fi# 定义变量DISK=$1# 目标磁盘(如/dev/sdb)PART_SIZE=$2# 分区大小(如20G、500M)MOUNT_DIR=$3# 挂载目录(如/data)PARTITION="${DISK}1"# 分区路径(如/dev/sdb1)LOG_FILE="/var/log/auto_init_disk.log"# 日志文件# 2. 检查目标磁盘是否存在if[!-b"$DISK"];thenecho"错误:磁盘$DISK不存在!"|tee-a$LOG_FILEexit1fi# 3. 检查分区是否已存在(避免重复创建)if[-b"$PARTITION"];thenecho"警告:分区$PARTITION已存在,跳过分区创建步骤"|tee-a$LOG_FILEelse# 4. 用fdisk非交互创建分区echo"=== 开始在$DISK上创建$PART_SIZE分区 ==="|tee-a$LOG_FILEecho-e"n\np\n1\n\n${PART_SIZE}\nw"|fdisk$DISK# 刷新分区表partprobe$DISKecho"分区$PARTITION创建完成"|tee-a$LOG_FILEfi# 5. 检查文件系统是否已存在(避免重复格式化)ifblkid$PARTITION|grep-q"TYPE=\"ext4\"";thenecho"警告:分区$PARTITION已为ext4格式,跳过格式化步骤"|tee-a$LOG_FILEelse# 6. 格式化分区为ext4(-F 强制格式化,-m 1 保留1%空间用于root)echo"=== 开始格式化$PARTITION为ext4 ==="|tee-a$LOG_FILEmkfs.ext4 -F -m1$PARTITIONecho"$PARTITION格式化完成"|tee-a$LOG_FILEfi# 7. 创建挂载目录(若不存在)if[!-d"$MOUNT_DIR"];thenecho"=== 创建挂载目录$MOUNT_DIR==="|tee-a$LOG_FILEmkdir-p$MOUNT_DIRfi# 8. 检查是否已挂载(避免重复挂载)ifmount|grep-q"$MOUNT_DIR";thenecho"警告:$MOUNT_DIR已挂载,跳过挂载步骤"|tee-a$LOG_FILEelse# 9. 临时挂载分区echo"=== 挂载$PARTITION$MOUNT_DIR==="|tee-a$LOG_FILEmount$PARTITION$MOUNT_DIRecho"$PARTITION挂载到$MOUNT_DIR完成"|tee-a$LOG_FILEfi# 10. 检查是否已写入fstab(避免重复添加)ifgrep-q"$MOUNT_DIR"/etc/fstab;thenecho"警告:$MOUNT_DIR已在fstab中,跳过写入步骤"|tee-a$LOG_FILEelse# 11. 获取分区UUID,写入fstab(UUID更稳定,避免设备名变化)UUID=$(blkid $PARTITION|awk-F'"''{print$2}')echo"=== 写入$MOUNT_DIR到 /etc/fstab ==="|tee-a$LOG_FILEecho"UUID=$UUID$MOUNT_DIRext4 defaults 0 0">>/etc/fstab# 验证fstab配置是否正确(避免语法错误导致开机失败)mount-aecho"$MOUNT_DIR已添加到fstab,开机自动挂载"|tee-a$LOG_FILEfi# 12. 输出最终结果echo-e"\n=== 磁盘初始化完成! ==="|tee-a$LOG_FILEecho"分区路径:$PARTITION"|tee-a$LOG_FILEecho"挂载目录:$MOUNT_DIR"|tee-a$LOG_FILEecho"文件系统:ext4"|tee-a$LOG_FILEecho"开机自动挂载:已配置(通过UUID)"|tee-a$LOG_FILEecho"日志路径:$LOG_FILE"|tee-a$LOG_FILE

3. 脚本使用与验证

# 1. 赋予脚本执行权限chmod+x auto_init_disk.sh# 2. 执行脚本(初始化/dev/sdb,创建50G分区,挂载到/data)./auto_init_disk.sh /dev/sdb 50G /data# 3. 验证结果df-h /data# 查看是否挂载成功cat/etc/fstab|grep/data# 查看是否写入fstabcat/var/log/auto_init_disk.log# 查看操作日志

总结:fdisk 是 Linux 存储管理的 “瑞士军刀”

fdisk虽看似基础,却能覆盖从 “新手分区” 到 “高级运维” 的全场景需求:基础操作中,记住p/n/d/w即可完成分区创建与删除;高级功能里,结合dd备份分区表、修改分区类型 ID,能应对存储故障;最佳实践中,搭配mountssh实现磁盘初始化与批量管理;而 Shell 脚本则将重复操作自动化,大幅提升运维效率。

需要注意的是,fdisk操作直接作用于磁盘底层,误操作会导致数据丢失,因此生产环境中务必提前备份分区表,且在测试环境验证操作流程后再执行。掌握fdisk,就掌握了 Linux 存储管理的核心能力,为后续学习 LVM、RAID 等进阶技术打下坚实基础。

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

Unity开发困局突围:Loxodon Framework如何重构游戏UI架构

Unity开发困局突围:Loxodon Framework如何重构游戏UI架构 【免费下载链接】loxodon-framework An MVVM & Databinding framework that can use C# and Lua to develop games 项目地址: https://gitcode.com/gh_mirrors/lo/loxodon-framework 深夜两点&am…

作者头像 李华
网站建设 2026/5/4 18:03:29

终极实战:5步构建企业级离线OCR识别系统

终极实战:5步构建企业级离线OCR识别系统 【免费下载链接】PaddleOCR-json OCR离线图片文字识别命令行windows程序,以JSON字符串形式输出结果,方便别的程序调用。提供各种语言API。由 PaddleOCR C 编译。 项目地址: https://gitcode.com/gh_…

作者头像 李华
网站建设 2026/4/19 13:52:39

Flow Launcher:让Windows效率翻倍的3大核心功能详解

Flow Launcher:让Windows效率翻倍的3大核心功能详解 【免费下载链接】Flow.Launcher :mag: Quick file search & app launcher for Windows with community-made plugins 项目地址: https://gitcode.com/GitHub_Trending/fl/Flow.Launcher 还在为Windows…

作者头像 李华
网站建设 2026/5/4 15:32:21

2、GTK编程:信号处理、数据类型与控件布局

GTK编程:信号处理、数据类型与控件布局 1. 信号处理与窗口显示 在GTK编程中,当我们完成了信号处理函数的设置以及控件在窗口中的布局后,需要让GTK将这些控件显示在屏幕上。以下是相关代码示例: gtk_container_add (GTK_CONTAINER (window), button); gtk_widget_show (…

作者头像 李华
网站建设 2026/5/6 3:23:05

AI工程完整教程:从模型选型到企业级部署的终极指南

AI工程完整教程:从模型选型到企业级部署的终极指南 【免费下载链接】aie-book [WIP] Resources for AI engineers. Also contains supporting materials for the book AI Engineering (Chip Huyen, 2025) 项目地址: https://gitcode.com/GitHub_Trending/ai/aie-b…

作者头像 李华
网站建设 2026/5/6 8:35:23

Zeus物联网平台:重新定义工业物联网的分布式监控新标准

Zeus物联网平台:重新定义工业物联网的分布式监控新标准 【免费下载链接】zeus-iot Zeus IoT is the worlds first open source Internet of Things distributed collection platform based on Zabbix, with the ability to collect, analyze, and store data from m…

作者头像 李华