2. 磁盘分区工具实战:fdisk、parted、gdisk 与脚本化自动化
磁盘分区,说白了就是给硬盘画格子。你买来一块新硬盘,不分区直接用?嗯,也不是不行,但生产环境里没人这么干。分区能帮你隔离数据、管理权限、甚至提升故障恢复的效率。
今天咱们就聊聊三个最常用的分区工具:fdisk、parted 和 gdisk。外加一个让运维偷懒的绝招——分区脚本化。
一句话总结:MBR 用 fdisk,GPT 用 gdisk,大容量或高级操作用 parted。脚本化用 parted 或 sgdisk 最稳。
2.1 fdisk 详解:经典 MBR 分区工具
fdisk 是我最早接触的分区工具。那时候还在用 IDE 硬盘,分区表还是 MBR。fdisk 的交互界面虽然古老,但胜在稳定、轻量、几乎每个 Linux 发行版都自带。
2.1.1 基本用法
# 查看当前磁盘分区情况
fdisk -l
# 进入交互模式,操作 /dev/sdb
fdisk /dev/sdb
进入交互模式后,按 m 可以看帮助菜单。常用的命令就几个:
| 命令 | 作用 | 备注 |
|---|---|---|
n |
新建分区 | 会提示主分区还是扩展分区 |
d |
删除分区 | 按编号删除 |
p |
打印分区表 | 随时查看当前状态 |
w |
写入并退出 | ⚠️ 这一步才真正生效 |
q |
不保存退出 | 后悔药 |
⚠️ 重要提醒:fdisk 的所有操作在按 w 之前都是内存中的假动作。我曾经在客户现场手滑按了 w,把一块有数据的盘给清了……嗯,从那以后我养成了先 p 再三确认的习惯。
2.1.2 fdisk 的局限
fdisk 只支持 MBR 分区表,最大只能认 2TB 的磁盘。超过 2TB?fdisk 会报错,或者只显示 2TB。这时候就得请出 gdisk 或 parted 了。
2.2 gdisk 详解:GPT 时代的 fdisk 替代者
gdisk 的用法和 fdisk 几乎一模一样,但它操作的是 GPT 分区表。GPT 支持 2TB 以上的磁盘,而且分区数量几乎没有限制(默认 128 个)。
2.2.1 基本用法
# 查看 GPT 分区信息
gdisk -l /dev/sdc
# 进入交互模式
gdisk /dev/sdc
交互命令和 fdisk 高度相似:n 新建、d 删除、p 打印、w 写入。唯一多出来的常用命令是 x,进入专家模式,可以调整分区 GUID、备份分区表等。
💡 小技巧:gdisk 可以无损将 MBR 转换为 GPT。用 gdisk /dev/sdX 进入后,按 w 写入,它会自动检测并转换。但前提是磁盘上 MBR 分区没有超过 2TB 的限制。
2.2.2 实战场景
我记得有一次给一台存储服务器换盘,原来的 1TB 换成了 4TB。用 fdisk 分区死活只能认 2TB,换成 gdisk 一步到位。你想想看,如果当时没意识到这个问题,数据写到 2TB 以后就全乱了。
2.3 parted 详解:全能型分区瑞士军刀
parted 和前面两个工具不太一样。它既能操作 MBR,也能操作 GPT,还支持更多高级功能,比如调整分区大小、文件系统对齐、非交互式脚本操作。
2.3.1 基本用法
# 查看分区信息
parted /dev/sdd print
# 交互模式
parted /dev/sdd
parted 的交互命令风格更接近自然语言:
(parted) mklabel gpt # 创建 GPT 分区表
(parted) mkpart primary 0% 50% # 创建分区,从 0% 到 50% 空间
(parted) mkpart primary 50% 100%
(parted) print # 查看结果
(parted) quit # 退出,自动保存
关键区别:parted 的操作是即时生效的,没有 fdisk 那种「先模拟再写入」的缓冲。所以用 parted 时一定要小心,输错了就真错了。
2.3.2 对齐优化
现代硬盘(尤其是 SSD)对分区对齐很敏感。分区没对齐,性能可能下降 30% 以上。parted 默认会做对齐优化,但你可以手动指定:
parted /dev/sdd mkpart primary ext4 0% 100%
# 或者显式指定对齐单位
parted /dev/sdd mkpart primary ext4 2048s 100%
我个人习惯用 0% 和 100% 这种百分比写法,parted 会自动计算最佳对齐位置。省心。
2.4 分区脚本化自动化
手动分区一次两次还行,几十台服务器呢?手敲会疯的。所以脚本化是运维的必修课。
2.4.1 使用 parted 非交互模式
parted 天然支持命令行直接传参,最适合脚本化:
#!/bin/bash
DISK="/dev/sde"
# 创建 GPT 分区表
parted $DISK mklabel gpt
# 创建两个分区:第一个 100GB,第二个用剩余空间
parted $DISK mkpart primary ext4 0% 100GB
parted $DISK mkpart primary ext4 100GB 100%
# 查看结果
parted $DISK print
2.4.2 使用 sgdisk(gdisk 的脚本版)
sgdisk 是 gdisk 的命令行版本,专为脚本设计:
#!/bin/bash
DISK="/dev/sdf"
# 清空分区表
sgdisk -o $DISK
# 创建分区:第一个 200GB,第二个 300GB,第三个用剩余
sgdisk -n 1:0:+200G -t 1:8300 -c 1:"data01" $DISK
sgdisk -n 2:0:+300G -t 2:8300 -c 2:"data02" $DISK
sgdisk -n 3:0:0 -t 3:8300 -c 3:"data03" $DISK
# 查看结果
sgdisk -p $DISK
💡 参数说明:-n 后面三个值分别是「分区号:起始扇区:大小」。0 表示自动,+200G 表示从当前位置往后 200GB。-t 设置分区类型,8300 是 Linux 文件系统。-c 设置分区名称。
2.4.3 使用 fdisk 的批处理模式
fdisk 也支持通过管道传参,但可读性差一些:
#!/bin/bash
DISK="/dev/sdg"
# 用 echo 模拟交互输入
echo -e "g\nn\n\n\n+100G\nn\n\n\n\nw" | fdisk $DISK
这种写法虽然能用,但维护起来很痛苦。我建议能用 sgdisk 或 parted 就别用 fdisk 脚本化。
2.5 三种工具对比总结
| 特性 | fdisk | gdisk | parted |
|---|---|---|---|
| 分区表类型 | MBR | GPT | MBR + GPT |
| 最大磁盘容量 | 2TB | 无限制 | 无限制 |
| 交互式操作 | ✅ 经典 | ✅ 类似 fdisk | ✅ 自然语言 |
| 脚本化支持 | ⚠️ 勉强 | ✅ sgdisk 优秀 | ✅ 原生支持 |
| 即时生效 | ❌ 需 w 写入 | ❌ 需 w 写入 | ✅ 即时生效 |
| 分区对齐 | 需手动 | 自动 | 自动 |
2.6 本章知识体系
下面这张图帮你理清三个工具的使用场景和选择逻辑:
⚠️ 最后再啰嗦一句:不管用哪个工具,分区前一定确认磁盘设备名。我见过太多人把 /dev/sda(系统盘)当成 /dev/sdb(数据盘)来分区,结果系统直接崩了。用 lsblk 或 fdisk -l 先看清楚,不丢人。