class="markdown_views prism-github-gist">
概述
GNU Parted是一个在Linux系统下用于创建和操作分区表的程序,它与fdisk/gdisk程序最大的区别在于它除了“交互式模式”,还有一个其他程序所没有的“非交互式模式”,也叫“命令行模式”(简单起见,后文统一使用该名称),我们可以在Shell脚本里面直接使用Parted“命令行模式”给磁盘创建分区。
在嵌入式Linux系统启动的过程中一般是没有图形界面和用户交互来创建系统分区的,Parted“命令行模式”这个时候就可以在Shell脚本里面大显身手。接下来我们先简单介绍下Parted的“交互式模式”,然后描述Parted“命令行模式”以及相关实践。
交互式模式
Parted基本使用方法如下:
parted [options] device [command [argument]]
其中第一个"options"常用选项如下:
选项
说明
-h, --help
显示帮助信息
-l, --list
显示所有磁盘设备的分区表信息
-s, --script
非交互式/命令行模式
-v, --version
显示版本信息
-a alignment-type, --align alignment-type
设置新分区遵循的对齐方式
对齐方式"alignment-type"只能有如下4个选项:
对齐方式
说明
none
使用磁盘设备支持的最小对齐方式
cylinder
按照柱面对齐
minimal
使用磁盘拓扑信息提供的最小对齐。该值和 opt 值将使用磁盘提供的布局信息,将逻辑分区表地址对齐到磁盘上的实际物理块。min 值是将分区正确对齐到物理块所需的最小对齐,这可避免性能降低。
optimal
使用磁盘拓扑信息提供的最佳对齐。此值可在保证最佳性能的情况下对齐到物理块大小的倍数。
如果要显示所有磁盘设备的分区表信息,可以用如下命令:
$ sudo parted -l
接下来我们进入Parted“交互式模式”,进入该模式可以输入"h"查看所有交互式命令和选项的说明,我们这里删除已有分区,之后创建两个新的主分区:
$ sudo parted /dev/sdb
GNU Parted 3.2
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) h
省略帮助信息...
(parted) rm
Partition number? 1
(parted) mkpart primary fat32 1MiB 8000MiB
(parted) mkpart primary fat32 8000MiB -1s
(parted) p
Model: SanDisk Cruzer Blade (scsi)
Disk /dev/sdb: 15.4GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 1049kB 8389MB 8388MB primary fat32 lba
2 8389MB 15.4GB 6988MB primary fat32 lba
注意:"-1s"指示磁盘的最后一个扇区(sector)。
命令行模式
进入“命令行模式”的常用格式是这样的:
parted -s device [command [argument]]
这里列出一些常用命令和参数(同样适用于之前的“交互式模式”):
命令
说明
mkpart [part-type fs-type name] start end
创建一个文件系统为 fs-type(如果指定)的 part-type 分区,以 start 开始,以 end 结束(缺省情况下,以兆字节为单位)。fs-type 可以是 fat16、fat32、ext2、HFS、linux-swap、NTFS、reiserfs 或 ufs 其中之一。part-type 应该是 primary、logical 或 extended 其中之一。
print
显示分区表
rm partition
删除分区
unit unit
将 unit 设置为显示位置和大小时使用的单位,以及在没有明确的单位后缀时,用于解释用户提供的位置和大小。unit 可以是 s(扇区)、B(字节)、kB、MB、GB、TB、%(设备大小的百分比)、cyl(柱面)、chs(柱面、磁头、扇区)或 compact(对于输入为兆字节,对于输出为某种用户友好形式)其中之一
下面我们尝试用“命令行模式”将16G的U盘分成3个主分区和一个逻辑分区, 首先是删除之前创建的两个分区,记得重新读取分区表信息。
$ sudo parted -s -a minimal /dev/sdb rm 1
$ sudo parted -s -a minimal /dev/sdb rm 2
$ sudo blockdev --rereadpt /dev/sdb
接下来我们按照sectors对齐("-a minimal"参数)来创建4个新的分区:
$ sudo parted -s -a minimal /dev/sdb mkpart primary 1s 7500000s
$ sudo parted -s -a minimal /dev/sdb mkpart primary 7500001s 15000000s
$ sudo parted -s -a minimal /dev/sdb mkpart primary 15000001s 22500000s
$ sudo parted -s -a minimal /dev/sdb mkpart extended 22500001s 100%
$ sudo parted -s -a minimal /dev/sdb mkpart logical 22500002s 100%
$ sudo blockdev --rereadpt /dev/sdb
$ sudo parted -s -a minimal /dev/sdb u s print
Model: SanDisk Cruzer Blade (scsi)
Disk /dev/sdb: 30031872s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 1s 7500000s 7500000s primary
2 7500001s 15000000s 7500000s primary
3 15000001s 22500000s 7500000s primary
4 22500001s 30031871s 7531871s extended lba
5 22500002s 30031871s 7531870s logical
注意:最后一个显示分区表命令里面的"u s"参数表示将 s(扇区) 设置为显示位置和大小时使用的单位,你也可是试试"u %", “u cyl”, "u chs"和"u compact"的结果,其中"u compact"的显示很人性化。
参考文档
Parted User’s Manual