导读:在 Linux 系统中,磁盘分区是管理存储设备的基础操作,而
fdisk作为一款经典的磁盘分区工具,几乎是每个 Linux 管理员的必备技能。它不仅能完成基础的分区创建、删除,还能应对分区表备份、类型修改等高级需求,甚至能通过 Shell 脚本实现自动化运维。接下来,我们从场景、语法、用法、实践到脚本,一步步解锁fdisk的全部能力。
一、fdisk 命令适用场景:什么时候该用它管理磁盘?
fdisk是一款面向磁盘分区表的交互性工具,主要用于MBR(主引导记录)磁盘(也支持部分 GPT 磁盘操作),日常工作中以下场景一定会用到它:
- 新硬盘初始化:服务器或电脑新增硬盘后,必须用
fdisk创建分区(如划分系统分区、数据分区),否则无法格式化和使用; - 现有分区调整:需要缩小 / 扩大分区(需配合文件系统工具)、删除无用分区,或修改分区类型(如将普通分区改为 swap 分区);
- 分区信息排查:当系统识别不到磁盘、不确定分区大小 / 类型时,用
fdisk查看分区表,快速定位存储设备状态; - 分区表故障修复:误删分区、分区表损坏时,通过
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,新建分区),按提示选择分区类型、编号、大小:
- 选择分区类型:输入
p(primary,主分区)或e(extended,扩展分区),新手选p即可; - 分区编号:默认从 1 开始(如
sdb1),直接按回车; - 起始扇区:默认从磁盘第一个可用扇区开始,直接按回车;
- 结束扇区:指定分区大小,输入
+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. 删除分区(谨慎操作!会清空数据)
若需删除分区,进入交互模式后:
- 输入
p查看要删除的分区编号(如sdb1的编号是 1); - 输入
d,再输入分区编号(如 1); - 输入
w保存,完成删除。
四、fdisk 高级使用方法:搞定复杂存储需求
掌握基础操作后,fdisk还能应对更复杂的场景,比如修改分区类型、备份分区表、处理 GPT 磁盘等,这些功能在生产环境中非常实用。
1. 修改分区类型 ID(如改为 swap、LVM 分区)
Linux 通过 “分区类型 ID” 识别分区用途(如普通分区 ID 是 83,swap 是 82,LVM 是 8e),修改步骤如下:
- 进入
fdisk /dev/sdb,输入p查看分区(如要修改sdb1); - 输入
t(type,修改类型); - 输入分区编号(如 1);
- 输入目标类型 ID(如
82表示 swap,8e表示 LVM); - 输入
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. 备份与恢复分区表(防分区表损坏)
分区表损坏会导致磁盘无法识别,提前备份至关重要,借助fdisk和dd命令实现:
备份分区表: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 分区表:
- 进入
fdisk /dev/sdc,输入g(gpt,创建 GPT 分区表); - 输入
n创建分区(步骤同 MBR,GPT 支持更多分区); - 输入
w保存,此时磁盘标签类型会变为gpt;
注意:GPT 磁盘建议用gdisk工具,fdisk仅用于临时应急操作。
五、fdisk 最佳实践:结合其他命令解决实际问题
fdisk单独使用时功能有限,结合blkid、mount、testdisk等工具,能解决 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 /data2. 批量检查多台服务器磁盘分区状态
需求:管理 10 台服务器,需快速确认所有服务器的/dev/sda磁盘分区是否正常(无损坏、分区大小符合预期)。
步骤:
准备服务器 IP 列表(
server_list.txt):192.168.1.101 192.168.1.102 ...用
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后续:可在脚本中添加 “分区大小校验”(如判断
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_FILE3. 脚本使用与验证
# 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,能应对存储故障;最佳实践中,搭配mount、ssh实现磁盘初始化与批量管理;而 Shell 脚本则将重复操作自动化,大幅提升运维效率。
需要注意的是,fdisk操作直接作用于磁盘底层,误操作会导致数据丢失,因此生产环境中务必提前备份分区表,且在测试环境验证操作流程后再执行。掌握fdisk,就掌握了 Linux 存储管理的核心能力,为后续学习 LVM、RAID 等进阶技术打下坚实基础。