必须先用lsblk和blkid确认目标磁盘为空、未挂载、无lvm层,再执行mklabel gpt;单位须设为mib,起始位置从1mib开始以确保4k对齐,mkpart中ext4仅为类型标识,实际格式化需用mkfs命令。

parted 创建 GPT 分区前必须确认磁盘状态
直接执行 mklabel gpt 会清空整个磁盘,如果误操作在系统盘上,后果不可逆。先用 lsblk 和 blkid 确认目标设备是否为空、未挂载、无 LVM 层:
-
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT /dev/sdb—— 看 TYPE 是 disk 还是 part/lvm,MOUNTPOINT 是否为空 -
blkid /dev/sdb—— 若输出为空,说明无文件系统;若报错 "No such file or directory",说明设备存在但未分区 - 特别注意:
/dev/sdb是整块盘,/dev/sdb1才是分区。别对已有分区(如/dev/sdb1)执行mklabel
mklabel gpt 后必须立即设置单位并检查对齐
parted 默认单位是扇区(sector),但手动输入扇区数极易出错。不设单位就建分区,大概率导致 4K 对齐失败,I/O 性能暴跌。
- 交互模式下第一件事:输入
unit MiB(推荐二进制单位),之后所有数值都按 MiB 解析 - 起始位置务必从
1MiB开始(不是 0,也不是 1MB),这是现代 SSD/HDD 的最小对齐边界 - 执行
print查看当前对齐情况:Alignment: 1MiB表示 OK;若显示2048s或其他值,说明单位没生效或磁盘物理块大小异常
mkpart 命令中 type 和 fs-type 参数不能互换
很多人把 mkpart primary ext4 1MiB 10GiB 里的 ext4 当作“格式化类型”,其实它只是提示信息,parted 不负责格式化,也不校验该字符串是否合法。
- 第一个参数(
primary)在 GPT 下实际被忽略,GPT 没有主/逻辑分区概念;写primary、logical甚至root都不影响结果 - 第二个参数(
ext4)仅写入分区类型字段(Type Code),Linux 内核靠它识别用途;GPT 下更规范的写法是用标准类型名,比如efi、linux-swap、lvm,而非文件系统名 - 真正决定文件系统的是后续的
mkfs.ext4命令,和mkpart无关
resizepart 扩容时常见报错及绕过方法
想扩容已存在的 GPT 分区?别急着 resizepart。它只改分区表终点,不碰数据,但有几个硬限制:
- 目标终点不能超过磁盘总容量 —— 先用
print看Size字段,再算剩余空间 - 分区必须处于未挂载状态,否则报错
Device or resource busy;即使umount了,也要检查lsof +D /mount/point或fuser -v /mount/point - 不能缩小分区(parted 明确禁止),只能扩大;缩小需先用
resize2fs缩文件系统,再用resizepart缩分区表 - 扩容后必须立刻运行
resize2fs /dev/sdb1(ext4)或xfs_growfs /mount/point(xfs),否则df仍显示旧大小
最易被忽略的一点:parted 修改分区表后,内核可能缓存旧分区信息。裸分区环境下,建议执行 partprobe /dev/sdb 或重启 kpartx -u /dev/sdb 强制重读,否则 mkfs 可能写到错误偏移。











