创作背景
Gkit部署环境的时候遇到一个报错,管理域准备环节报错内容如下:
bash
[2026-04-02 16:20:21] Error Log:Parted failed, result is
[ parted: invalid token: logicError: Expecting a partition type. ]
when exec: [ sudo parted -s /dev/vdb mkpart logic 51202MiB 148480MiB ]
[2026-04-02 16:20:21] Error Log:Disk partition and mount failure list:
['paas-core(7.225.165.104)']
[2026-04-02 16:20:21] Error Log:Disk mount failed.
[2026-04-02 16:20:41] Error Log:Task_GDE262RC1 task execution failed!
其中有一条信息很重要,是关于parted命令创建分区的时候的报错。排查发现/dev/vdb磁盘手动创建了一个主分区,是使用fdisk命令创建的,主要是用来给gkit挂盘。使用fdisk命令创建的分区默认是MBR分区格式,分区表类型是dos类型。查看分区详情,发现根本没有创建扩展分区,所以在执行parted命令创建逻辑分区的时候报错了。
正确的流程应该是先创建好扩展分区,例如:
bash
# 在MBR磁盘上创建主分区
parted -s /dev/sdb mkpart primary ext4 1MiB 50GiB
# 在MBR磁盘上创建扩展分区
parted -s /dev/sdb mkpart extended 50GiB 100GiB
# 在扩展分区内部创建逻辑分区
parted -s /dev/sdb mkpart logical ext4 50GiB 100GiB
bash
parted -s /dev/vdf mkpart extended 51202MiB 102400MiB
parted -s /dev/vdf mkpart logic 51202MiB 102400MiB
或者
parted -s /dev/vdf mkpart extended 51202MiB 100%
parted -s /dev/vdf mkpart logic 51202MiB 100%
parted命令语法
bash
[root@paas-core ~]# parted --help
Usage: parted [OPTION]... [DEVICE [COMMAND [PARAMETERS]...]...]
Apply COMMANDs with PARAMETERS to DEVICE. If no COMMAND(s) are given, run in
interactive mode.
OPTIONs:
-h, --help displays this help message
-l, --list lists partition layout on all block devices
-m, --machine displays machine parseable output
-j, --json displays JSON output
-s, --script never prompts for user intervention
-f, --fix in script mode, fix instead of abort when asked
-v, --version displays the version
-a, --align=[none|cyl|min|opt] alignment for new partitions
COMMANDs:
align-check TYPE N check partition N for TYPE(min|opt)
alignment
help [COMMAND] print general help, or help on
COMMAND
mklabel,mktable LABEL-TYPE create a new disklabel (partition
table)
mkpart PART-TYPE [FS-TYPE] START END make a partition
name NUMBER NAME name partition NUMBER as NAME
print [devices|free|list,all] display the partition table, or
available devices, or free space, or all found partitions
quit exit program
rescue START END rescue a lost partition near START
and END
resizepart NUMBER END resize partition NUMBER
rm NUMBER delete partition NUMBER
select DEVICE choose the device to edit
disk_set FLAG STATE change the FLAG on selected device
disk_toggle [FLAG] toggle the state of FLAG on selected
device
set NUMBER FLAG STATE change the FLAG on partition NUMBER
toggle [NUMBER [FLAG]] toggle the state of FLAG on partition
NUMBER
type NUMBER TYPE-ID or TYPE-UUID type set TYPE-ID or TYPE-UUID of
partition NUMBER
unit UNIT set the default unit to UNIT
version display the version number and
copyright information of GNU Parted
parted常用命令参数
mklabel命令
mklabel是parted工具中的一个重要命令,用于创建或更改磁盘的分区表类型。这个操作会删除磁盘上的所有数据,使用前必须确保已备份重要信息。
基本的语法如下:
bash
parted -s 设备路径 mklabel 分区表类型
支持的分区表类型如下:
bash
msdos
MBR(Master Boot Record)分区表
最多支持4个主分区或3个主分区+1个扩展分区
最大支持2TB磁盘容量
兼容性最好,适用于各种系统和启动方式
gpt
GPT(GUID Partition Table)分区表
支持最多128个分区
支持超过2TB的磁盘容量
提供更好的数据完整性和容错能力
适用于UEFI启动方式
# 下面这个分区表类型就不太常用
loop
循环设备分区表
用于磁盘映像文件的特殊分区表
mac
Apple Mac分区表
旧版苹果系统使用的格式
amiga
Amiga计算机系统使用的分区表
pc98
PC-98计算机系统使用的分区表
sun
Sun Solaris系统使用的分区表
bsd
BSD系列操作系统使用的分区表
下面介绍一下常见用法的示例:
bash
# 示例1:将磁盘更改为GPT分区表
parted -s /dev/sdb mklabel gpt
# 示例2:将磁盘更改为MBR分区表
parted -s /dev/sdb mklabel msdos
# 示例3:交互式模式下更改分区表
parted /dev/sdb
(parted) mklabel gpt
(parted) quit
mkpart命令
mkpart命令是parted工具中的一个核心功能,用于在磁盘上创建新分区。下面我们详细解析这个命令的各种用法和参数。
基本语法:
bash
parted -s 设备路径 mkpart [分区类型] [文件系统类型] 起始位置 结束位置
参数详解
- 设备路径
bash
指定要操作的磁盘设备
格式:/dev/sdb、/dev/nvme0n1等
必须是存在的块设备
- 分区类型
bash
可选参数,具体取决于分区表类型:
对于MBR分区表(msdos):
primary - 主分区(最多4个)
logical - 逻辑分区(只能在扩展分区内部创建)
extended - 扩展分区(一个磁盘只能有一个)
对于GPT分区表(gpt):
可以省略不写
或者指定为primary(虽然不影响结果)
省略分区类型时,parted会根据当前分区表类型自动选择合适的类型。
- 文件系统类型
bash
可选参数,用于标识分区将使用的文件系统类型,常见选项有:
ext2、ext3、ext4
fat16、fat32
ntfs
hfs、hfs+
linux-swap
xfs
btrfs
nilfs2
...等等
也可以使用空值或不指定此参数,稍后使用mkfs命令单独格式化分区。
- 起始位置和结束位置
bash
指定分区在磁盘上的位置范围
可以使用多种单位表示:
绝对大小:1MiB、100MB、2GiB、10GB
百分比:%25(磁盘的25%)、%50、%100
扇区号:2048、1048576等
用法示例如下:
bash
示例1:创建主分区
# 创建50GB的主分区,从1MiB开始
parted -s /dev/sdb mkpart primary ext4 1MiB 50GiB
bash
示例2:创建扩展分区和逻辑分区
# 先创建扩展分区
parted -s /dev/sdb mkpart extended 50GiB 100GiB
# 在扩展分区内部创建逻辑分区
parted -s /dev/sdb mkpart logical ext4 50GiB 75GiB
bash
示例3:使用百分比分配空间
# 创建使用前50%空间的主分区
parted -s /dev/sdb mkpart primary ext4 0% 50%
# 创建使用后50%空间的主分区
parted -s /dev/sdb mkpart primary xfs 50% 100%
bash
示例4:GPT分区表下创建分区
# 在GPT磁盘上创建分区,不指定分区类型
# 使用所有剩余空间
parted -s /dev/sdc mkpart "" xfs 1MiB 100%
注意,开始位置和结束位置的单位,为了对其考量,也可以这样使用不同的单位
bash
# 从对齐点开始创建分区(提高SSD性能)
parted -s /dev/sdb mkpart primary ext4 2048s 50GiB
# 或使用MiB单位
parted -s /dev/sdb mkpart primary ext4 1MiB 50GiB
print命令
print命令是parted工具中最常用的命令之一,用于显示磁盘分区信息。无论是交互模式还是脚本模式,print命令都是查看当前磁盘状态的重要工具。
基本用法
bash
1. 交互式模式使用
bash
parted /dev/sdb
(parted) print
(parted) quit
2. 脚本模式使用
bash
parted -s /dev/sdb print
print命令输出详解如下:
bash
Model: Virtio Block Device (virtblk)
Disk /dev/sdb: 200 GiB, 214748364800 bytes, 419430400 sectors
Unit: 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: gpt
Disk identifier: A1B2C3D4-E5F6-7890-ABCD-EF1234567890
Device Start End Size Type File system Flags
/dev/sdb1 2048 1048575 512M EFI System Partition fat16 boot,esp
/dev/sdb2 1048576 419430399 200G Linux filesystem ext4
输出的字段分析如下:
bash
# 磁盘信息区域
Model: 磁盘型号
Disk /dev/sdb: 设备路径和总容量
Unit: 单位设置
Sector size: 逻辑和物理扇区大小
I/O size: 最优和最小I/O大小
Disklabel type: 分区表类型(msdos/gpt等)
Disk identifier: 分区表标识符(GPT中为UUID,MBR中为十六进制标识)
bash
# 分区信息区域
Device: 分区设备路径
Start: 起始扇区号
End: 结束扇区号
Size: 分区大小
Type: 分区类型
File system: 文件系统类型(如果已创建)
Flags: 分区标志位
常用用法示例如下:
bash
# 显示不同单位的信息
parted -s /dev/sdb print unit MiB # 以MiB为单位
parted -s /dev/sdb print unit GB # 以GB为单位
parted -s /dev/sdb print unit s # 以扇区为单位
[root@collector01 ~]# parted /dev/vdb unit s print
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 461373440s
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 4096s 419430399s 419426304s logic
2 419432448s 461371391s 41938944s logic
[root@collector01 ~]# parted /dev/vdb unit mib print
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 225280MiB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 2.00MiB 204800MiB 204798MiB logic
2 204801MiB 225279MiB 20478MiB logic
[root@collector01 ~]# parted /dev/vdb unit MB print
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 236223MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 2.10MB 214748MB 214746MB logic
2 214749MB 236222MB 21473MB logic
bash
1. 快速查看磁盘状态
# 显示基本分区信息
parted -s /dev/sdb print
2. 查看特定分区信息
# 切换到交互模式后查看分区详情
parted /dev/sdb
(parted) print 1 # 查看第一个分区的详细信息
3. 查看磁盘对齐状态
# 检查分区是否正确对齐
parted -s /dev/sdb print
# 查看Start值是否为2048的倍数(1MiB对齐)
4. 查看分区标志
# 显示各分区的标志位
parted -s /dev/sdb print
# 特别关注boot、esp、lvm等标志位
5. 使用不同单位查看
# 以MB为单位查看
parted -s /dev/sdb print unit MB
# 以百分比形式显示
parted -s /dev/sdb print unit %
结合grep过滤关键信息
bash
# 只显示分区信息区域
parted -s /dev/sdb print | tail -n +7
# 查看特定的分区类型
parted -s /dev/sdb print | grep "ext4"
# 查看包含特殊标志的分区
parted -s /dev/sdb print | grep "boot"
脚本中获取分区信息
bash
#!/bin/bash
# 获取分区数量
PART_COUNT=$(parted -s /dev/sdb print | grep -c "^[ ]*[0-9]")
# 获取磁盘总大小
DISK_SIZE=$(parted -s /dev/sdb print | grep "Disk /dev/sdb" | awk '{print $3}')
# 获取文件系统类型
FS_TYPE=$(parted -s /dev/sdb print | awk '/\/dev\/sdb1/ {print $5}')
echo "分区数量:$PART_COUNT"
echo "磁盘大小: $DISK_SIZE"
echo "文件系统:$FS_TYPE"
type命令
type命令是parted工具中的一个重要功能,用于修改分区的类型标识符。这个命令在MBR和GPT分区表中都有不同的应用场景和功能。
基本语法如下:
bash
parted -s 设备路径 type 分区编号 分区类型
MBR分区表中的类型
bash
MBR分区表使用2字节的十六进制代码标识分区类型,常见类型包括:
primary - 主分区标识
extended - 扩展分区标识
logical - 逻辑分区标识
82 - Linux交换空间
83 - Linux原生分区(常用)
8e - Linux LVM分区
85 - Linux扩展分区
fd - Linux RAID自动检测
07 - NTFS/exFAT分区
0b/0c - FAT32分区
0e/0f - 扩展FAT32分区
06 - FAT16分区
17 - 隐藏的HPFS/NTFS分区
12 - Compaq诊断分区
ef - EFI系统分区
示例如下:
bash
# 将第一个分区类型设置为Linux原生分区
parted -s /dev/sdb type 1 83
# 将第二个分区设置为Linux交换空间
parted -s /dev/sdb type 2 82
# 将第三个分区设置为Linux LVM
parted -s /dev/sdb type 3 8e
# 将分区类型设置为fat32
parted -s /dev/sdb type 1 0c
# 使用分区名称而非代码
parted -s /dev/sdb type 1 primary
GPT分区表中的类型
bash
GPT分区表使用GUID(Globally Unique Identifier)标识分区类型,常见类型包括:
Linux filesystem - Linux文件系统
Linux swap - Linux交换空间
Linux RAID - Linux RAID阵列
Linux LVM - Linux LVM物理卷
EFI System Partition - EFI系统分区
Microsoft Reserved - Microsoft保留分区
Basic Data - 基本数据分区
Microsoft Reserved Partition - Microsoft保留分区
Microsoft Recovery Environment - Windows恢复环境
示例如下:
bash
# 将第一个分区设置为Linux文件系统
parted -s /dev/sdc type 1 "Linux filesystem"
# 将第二个分区设置为EFI系统分区
parted -s /dev/sdc type 2 "EFI System Partition"
# 将第三个分区设置为Linux LVM
parted -s /dev/sdc type 3 "Linux LVM"
# 将分区类型设置为Microsoft恢复环境
parted -s /dev/sdc type 4 "Microsoft Recovery Environment"
操作示例
FAQ
1、为什么创建第一个分区的时候,开始位置是1MiB或者2MiB?
不管是使用fdisk命令,还是parted命令,创建第一个分区的其实位置都是从1MiB这个位置开始的。这个就有点疑问,查询了一下,主要由一下几个方面的原因
1. 保留引导扇区空间
现代硬盘的前几个扇区通常用于存储以下重要信息:
主引导记录(MBR)
GUID分区表(GPT)的保护扇区
磁盘对齐信息
从0MiB开始可能会覆盖这些重要信息,导致系统无法正常启动或识别磁盘。
2. 磁盘对齐考虑
性能优化
现代存储设备(如SSD)在读写数据时,最佳性能通常是按照特定块大小对齐的
从1MiB(2048扇区)开始可以确保分区与设备的物理块大小对齐
这种对齐可以显著提高I/O性能
避免访问问题
有些存储控制器在访问未对齐的分区时性能会显著下降
从1MiB开始可以避免这种性能瓶颈
3. 分区表保护
对于GPT格式,开头和结尾都有保护区
从1MiB开始可以避免破坏这些保护区
保留空间可以防止分区表被意外覆盖
4. 兼容性考虑
确保分区在各种操作系统和硬件平台上都能正确识别
避免与某些固件或启动管理器产生冲突
Gkit工具在磁盘划分分区的时候,默认先将磁盘创建为gpt格式的分区表,然后再创建一个分区,将所有的磁盘空间划分给第一个分区,并给这个分区打上一个标签名称Name=logic