Linux下使用GPT分区入门
2015-06-07 16:52:49 阿炯

由于MBR分区表只支持2T磁盘,所以大于2T的磁盘必须使用GPT分区表,具体方法如下:

GPT格式的磁盘相当于原来MBR磁盘中原来保留4个partition table的4*16个字节,只留第一个16个字节,类似于扩展分区,真正的partition table在512字节之后,GPT磁盘没有四个主分区的限制,分区数量受制于操作系统的限制。在磁盘分区超过2TB时,不能使用交互很好的fdisk命令,只能磁盘转化为GPT格式。

但fdisk不支持GPT,我们可以使用parted来对GPT磁盘操作。parted功能很强大,既可用命令行也可以用于交互式,还有在gui下使用gparted来进行可视操作。当然最好的支持大文件系统格式还是XFS。对GPT磁盘分区表进行操作,就需要使用parted命令,其实parted功能很强大,它可以象fdisk一样既可用命令行也可以用于交互式;除了能够进行分区的添加,删除等常见操作外,还可以移动分区、制作文件系统、调整文件系统大小、复制文件系统。

MBR(Master Boot Record)与GPT(GUID Partition Table)

MBR 与 GPT都是分区格式,其中MBR最大分区小于等于2TB,而GPT分区没有2TB的限制,理论最大分区18 EB!现在我们要创建一个大于2TB的分区,就不能使用MBR格式的分区表了,而要使用GPT格式的分区表,我们最常用的fdisk 分区工具就爱莫能助了,在linux下就需要使用的Parted分区工具了。

MBR
主引导记录(Master Boot Record,缩写:MBR),又叫做主引导扇区,是计算机开机后访问硬盘时所必须要读取的首个扇区,它在硬盘上的三维地址为(柱面,磁头,扇区)=(0,0,1)。

MBR是由分区程序(如Fdisk,Parted)所产生的,它不依赖任何操作系统,而且硬盘引导程序也是可以改变的,从而能够实现多系统引导。

从主引导记录的结构可以知道,它仅仅包含一个64个字节的硬盘分区表。由于每个分区信息需要16个字节,所以对于采用MBR型分区结构的硬盘(其磁盘卷标类型为MS-DOS),最多只能识别4个主要分区。所以对于一个采用此种分区结构的硬盘来说,想要得到4个以上的主要分区是不可能的。这里就需要引出扩展分区了,扩展分区也是主分区(Primary partition)的一种,但它与主分区的不同在于理论上可以划分为无数个逻辑分区,每一个逻辑分区都有一个和MBR结构类似的扩展引导记录(EBR)。

在MBR分区表中最多4个主分区或者3个主分区+1个扩展分区,也就是说扩展分区只能有一个,然后可以再细分为多个逻辑分区。在Linux系统中,硬盘分区命名为sda1-sda4或者hda1-hda4(其中a表示硬盘编号可能是a、b、c等等)。在MBR硬盘中,分区号1-4是主分区(或者扩展分区),逻辑分区号只能从5开始。

在MBR分区表中,一个分区最大的容量为2T,且每个分区的起始柱面必须在这个disk的前2T内。你有一个3T的硬盘,根据要求你至少要把它划分为2个分区,且最后一个分区的起始扇区要位于硬盘的前2T空间内,如果硬盘太大则必须改用GPT。

GPT

全局唯一标识分区表(GUID Partition Table,缩写:GPT)是一个实体硬盘的分区结构。它是EFI(可扩展固件接口标准)的一部分,用来替代BIOS中的主引导记录分区表。但因为MBR分区表不支持容量大于2.2TB(2.2 × 1012字节)的分区,所以也有一些BIOS系统为了支持大容量硬盘而用GPT分区表取代MBR分区表。

在MBR硬盘中,分区信息直接存储于主引导记录(MBR)中(主引导记录中还存储着系统的引导程序)。但在GPT硬盘中,分区表的位置信息储存在GPT头中。但出于兼容性考虑,硬盘的第一个扇区仍然用作MBR,之后才是GPT头。

与支持最大卷为2 TB(Terabytes)并且每个磁盘最多有4个主分区(或3个主分区,1个扩展分区和无限制的逻辑驱动器)的MBR磁盘分区的样式相比,GPT磁盘分区样式支持最大卷为18 EB(Exabytes)并且每磁盘的分区数没有上限,只受到操作系统限制(由于分区表本身需要占用一定空间,最初规划硬盘分区时,留给分区表的空间决定了最多可以有多少个分区,IA-64版Windows限制最多有128个分区,这也是EFI标准规定的分区表的最小尺寸)。与MBR分区的磁盘不同,至关重要的平台操作数据位于分区,而不是位于非分区或隐藏扇区。另外GPT分区磁盘有备份分区表来提高分区数据结构的完整性。

EFI

可扩展固件接口(英文名Extensible Firmware Interface 或EFI)是一种个人电脑系统规格,用来定义操作系统与系统韧体之间的软件界面,为替代BIOS的升级方案。可扩展固件接口负责加电自检(POST)、连系操作系统以及提供连接操作系统与硬件的接口。EFI最初由英特尔开发,现时由UEFI论坛来推广与发展。UEFI是由EFI1.10为基础发展起来的,它的所有者已不再是Intel,而是一个称作Unified EFI Form的国际组织,贡献者有Intel、Microsoft、AMI等几个大厂,属于开放源码系列。

简单对比一下两种分区表
MBR分区表:(MBR含义:主引导记录)
所支持的最大卷:2T (T; terabytes,1TB=1024GB)
对分区的设限:最多4个主分区或3个主分区加一个扩展分区(扩展分区中支持无限制的逻辑驱动器)

GPT分区表:(GPT含义:GUID分区表)
支持最大卷:18EB,(E:exabytes,1EB=1024TB)
每个磁盘最多支持128个分区


关于MBR、GPT、EFI的关系总结

MBR磁盘分区:每块磁盘最多支持4个主分区,最大卷为2TB。
GPT磁盘分区:每块磁盘最多支持128个分区,最大卷为18EB。

1、传统的BIOS只支持从MBR分区的硬盘启动。MBR分区的分区表保存在硬盘的第一个扇区,而且只有64字节,所以最多只能有四个表项。也就是说,我们只能把硬盘分为4主分区,或者分成小于等于3个主分区再加一个扩展分区。扩展分区又可以分为多个逻辑分区。MBR分区的优点就是简单,大家都用,所以大家都懂的嘛,很多操作系统都可以从MBR分区的硬盘启动。缺点就是MBR分区不能识别大于2T的硬盘空间,也不能有大于2T的分区。

2、GPT分区的硬盘可以解决以上MBR分区的所有缺点,它没有4个主分区的限制,想分几个主分区就可以分几个主分区,它可以识别大于2T的硬盘空间,每个分区的大小也可以超过2T,但是它的缺点是需要操作系统支持。比如只有WinXP 64位、Win Vista、Win 7和Win 8和比较新的Linux发行版支持GPT分区的硬盘。而且,如果没有EFI的支持的话,以上系统也只能将GPT分区的硬盘当成数据盘,不能从GPT分区的硬盘启动。

3、要从GPT分区的硬盘启动,则主板使用EFI、硬盘使用GPT分区、操作系统支持GPT和EFI这三个条件缺一不可。目前比较新的64位Linux系统和Win8系统都是支持EFI的,所以都是需要从GPT分区的硬盘启动的。现在的电脑主板已经逐渐抛弃legacy BIOS,而只支持EFI了。目前很多预装Win8的笔记本的主板几乎都只支持EFI了。所以,学习GPT和EFI的相关知识势在必行。

4、以上分区策略都是固定分区。硬盘分区一旦完成,则分区的大小不可改变,如果要改变分区的大小的话,只有重新分区。而且由于没有办法把多个硬盘分到一个区,所以再怎么分,每个分区的大小都有限,所以我们需要一种动态分区的东西。LVM就是这样一个东东,它叫逻辑卷管理。使用LVM的机制是这样的:首先把硬盘分区或者整块硬盘标记为一个物理卷(PV),然后再创建一个卷组(VG),把一个或多个物理卷加入卷组,最后对卷组进行分区,每一个分区称为一个逻辑卷(LV)。LVM的优点就是可以随时向卷组中添加物理卷扩展卷组的大小,以可以动态调整逻辑卷的大小。使用LVM就可以顺利解决这个问题,把这个硬盘加入卷组就可以扩大卷组的大小,然后再调整分区所在的逻辑卷的大小即可。LVM既可以搭配MBR使用,也可以搭配GPT使用。

只支持EFI的主板只能从GPT分区的硬盘启动,而且该硬盘第1个分区必须为fat32文件系统,该文件系统中存放的是EFI需要的各种文件。使用parted程序,执行mklabel msdos命令可把硬盘从GPT分区更改为MBR分区,具体的转换方法:

方法一:parted工具转换
parted -s /dev/sda mklabel msdos

方法二:diskpart工具转换
输入diskpart,输入list disk查看磁盘信息,输入select disk 0选择磁盘,输入clean清空磁盘分区,输入convert mbr转换分区表格式。

以下是convert命令的一些常用方法:
convert basic -将次盘磁盘从动态转换为基本
convert dynamic -将磁盘从基本转换为动态
convert gpt -将磁盘从MBR转换为GPT
convert mbr -将磁盘从GPT转换为MBR

在提示符下输入parted就会进入交互式模式,如果有多个磁盘的话,我们需要运行select sdx,x为磁盘,来进行磁盘的选择。

parted的交互模式:
parted>
parted>select sdb假设磁盘为sdb
parted>mklabel gpt   将MBR磁盘格式化为GPT
#parted>mklabel msdos 将GPT磁盘转化为MBR磁盘
parted>mkpart primary 0 1000  划分一个起始位置为0,大小为1000M的主分区
parted>mkpart primary 1000 2000划分一个起始位置为1000M,大小为1000M的主分区
#parted>mkpart primary 0 -1   将整块磁盘分成一个分区
parted>print 打印当前分区
parted>quit  退出

更多parted命令:
check NUMBER do a simple check on the file system
cp [FROM-DEVICE] FROM-NUMBER TO-NUMBER   copy file system to another partition
help [COMMAND]   prints general help, or help on

指令
mklabel LABEL-TYPE   create a new disklabel (partition table)
mkfs NUMBER FS-TYPE  make a FS-TYPE file system on
partititon NUMBER
mkpart PART-TYPE [FS-TYPE] START END make a partition
mkpartfs PART-TYPE FS-TYPE START END make a partition with a file system
move NUMBER START ENDmove partition NUMBER
name NUMBER NAME name partition NUMBER as NAME
print [free|NUMBER|all]  display the partition table, a partition, or all devices
quit exit program
rescue START END rescue a lost partition near START and END
resize NUMBER START END  resize partition NUMBER and its file system
rm NUMBERdelete partition NUMBER
select DEVICEchoose the device to edit
set NUMBER FLAG STATEchange the FLAG on partition NUMBER
toggle [NUMBER [FLAG]]   toggle the state of FLAG on partition

NUMBER
unit UNITset the default unit to UNIT
version  displays the current version of GNU

在parted里边不支持ext3的文件系统,所以如果要使用的话,要退出parted来进行格式化。
mkfs.xfs /dev/sdx1

因为fdisk是不支持GPT磁盘,所以不要使用fdisk -l来查看X磁盘刚才分好的区,是看不到的。

命令行的模式:
将硬盘转化为GPT磁盘后,执行下列命令
parted /dev/sdx mkpart primary 0 100   #划分一个起始位置为0大小为100M的主分区
parted /dev/sdx mkpart primary xfs 0 -0  #划分所有空间

创建分区示例
parted /dev/sdb mklabel gpt
parted -s /dev/sdb mkpart primary 0 -1 划分所有空间到一个分区
parted -s /dev/sdb mkpart primary 0 100% 同上
parted  /dev/sdb  mkpart  ext3  0  500000    创建500G分区/dev/sdb1
parted /dev/sdb mkpart swap 500000 504000  创建4G大小分区/dev/sdb2
partprobe 重新加载分区表

parted的命令方式及常用功能

Parted 命令分为两种模式:命令行模式和交互模式。
1、命令行模式: parted [option] device [command] ,该模式可以直接在命令行下对磁盘进行分区操作,比较适合编程应用。如:
parted /dev/sdb print –显示磁盘/dev/sdb分区。

2、交互模式:parted [option] device
parted /dev/sdb – 进入交互模式,建议使用交互模式,尤其是对parted命令不是很熟悉的情况下。

常用的2种分区表:MBR与GPT区别。
MBR:MBR分区表(即主引导记录)大家都很熟悉,是过去我们使用windows时常用的。
所支持的最大卷:2T,而且对分区有限制:最多4个主分区或3个主分区加一个扩展分区
GPT: GPT(即GUID分区表)。是源自EFI标准的一种较新的磁盘分区表结构的标准,是未来磁盘分区的主要形式。与MBR分区方式相比,具有如下优点。
突破MBR 4个主分区限制,每个磁盘最多支持128个分区。支持大于2T的分区,最大卷可达18EB。

当在命令行输入parted后,进入parted命令的交互模式,输入help会显示帮助信息。下面就简单介绍一下常用的功能:
1、Check 简单检查文件系统。建议用其他命令检查文件系统,比如fsck

2、Help 显示帮助信息

3、mklabel 创建分区表, 即是使用msdos(MBR)还是使用gpt,或者是其他方式分区表

4、 mkfs 创建文件系统。该命令不支持ext3 格式,因此建议不使用,最好是用parted分好区,然后退出parted交互模式,用其他命令进行分区,比如:mkfs.ext3

5、mkpart 创建新分区
格式:mkpart PART-TYPE  [FS-TYPE]  START  END
PART-TYPE 类型主要有primary(主分区),extended(扩展分区),logical(逻辑区),扩展分区和逻辑分区只对msdos。
fs-type   文件系统类型,主要有fat32,NTFS,ext2,ext3等。
start end 分区的起始和结束位置。

6、mkpartfs 建立分区及其文件系统。目前还不支持ext3文件系统,因此不建议使用该功能。最后是分好区后,退出parted,然后用其他命令建立文件系统

7、print 输出分区信息。该功能有3个选项,
free 显示该盘的所有信息,并显示磁盘剩余空间
number 显示指定的分区的信息
all 显示所有磁盘信息

8、resize 调整指定的分区的大小。目前对ext3格式支持不是很好,所以不建议使用该功能

9、rescue 恢复不小心删除的分区。如果不小心用parted的rm命令删除了一个分区,那么可以通过rescue功能进行恢复。恢复时需要给出分区的起始和结束的位置。然后parted就会在给定的范围内去寻找,并提示恢复分区,由于parted直接写磁盘,因此一旦不小心删除了某一分区,建议立即用rescue恢复。
parted /dev/sdb mkpart xfs 504000 514000 创建10G分区/dev/sdb3
mkfs.xfs /dev/sdb3  将/dev/sdb3格式化成xfs文件系统。
parted /dev/sdb rm 3 删除/dev/sdb3
parted /dev/sdb rescue 504000 514000 依照屏幕提示,输入yes即可恢复被误删除分区

10、rm 删除分区。命令格式 rm  number 。如:rm 3 就是将编号为3的分区删除

11、select 选择设备。当输入parted命令后直接回车进入交互模式是,如果有多块硬盘,需要用select 选择要操作的硬盘。如:select /dev/sdb

12、set 设置标记。更改指定分区编号的标志。标志通常有如下几种:boot  hidden   raid   lvm 等。
boot 为引导分区,hidden 为隐藏分区,raid 软raid,lvm 为逻辑分区。
如:set 3  boot on  设置分区号3 为启动分区
注:以上内容为parted常用的功能,由于该工具目前对ext3支持得不是很好,因此有些功能无法应用,比如move(移动分区)和resize等。因为fdisk是不支持GPT磁盘,所以使用fdisk -l来查看磁盘刚才的分区是没有用的,挂载之后可以用df-h查看分区使用情况。

Parted命令用法

parted [选项]... [设备 [命令 [参数]...]...]
将带有“参数”的命令应用于“设备”。如果没有给出“命令”,则以交互模式运行。

选项:
-h, --help 显示此求助信息
-i, --interactive 在必要时,提示用户
-s, --script 从不提示用户
-v, --version 显示版本

命令:
检查 MINOR 对文件系统进行一个简单的检查
cp [FROM-DEVICE] FROM-MINOR TO-MINOR 将文件系统复制到另一个分区
help [COMMAND] 打印通用求助信息,或关于 COMMAND 的信息
mklabel 标签类型 创建新的磁盘标签 (分区表)
mkfs MINOR 文件系统类型 在 MINOR 创建类型为“文件系统类型”的文件系统
mkpart 分区类型 [文件系统类型] 起始点 终止点 创建一个分区
mkpartfs 分区类型 文件系统类型 起始点 终止点 创建一个带有文件系统的分区
move MINOR 起始点 终止点 移动编号为 MINOR 的分区
name MINOR 名称 将编号为 MINOR 的分区命名为“名称”
print [MINOR] 打印分区表,或者分区
quit 退出程序
rescue 起始点 终止点 挽救临近“起始点”、“终止点”的遗失的分区
resize MINOR 起始点 终止点 改变位于编号为 MINOR 的分区中文件系统的大小
rm MINOR 删除编号为 MINOR 的分区
select 设备 选择要编辑的设备
set MINOR 标志 状态 改变编号为 MINOR 的分区的标志

注意:mklabel label-type 必须是一下这些类型:
* bsd
* loop (raw disk access)
* gpt
* mac
* msdos
* pc98
* sun

例:(parted) mklabel gpt 或者 (parted) mklabel msdos

mkpart(建立新分区)

格式:mkpart part-type fs-type start end

建立一个新的分区
part-type是以下类型之一 primary(主分区), extended(扩展分区), logical(逻辑分区)。
fs-type来指定文件系统,比如xfs 。
start和end是新分区开始和结束的具体位置。0表示起止,-1表示结尾;或者以mb表示或者GB表示。

操作示例:

第一个主分区3G
剩余分区都给扩展分区
第一个逻辑卷分区2G
第二个逻辑源用剩余空间

第一个主分区3G
parted -s /dev/sdb mklabel msdos
parted -s /dev/sdb mkpart primary 0 3G

剩余空间给扩展分区
parted -s /dev/sdb mkpart entended 3 100%

在扩展分区上创建第一个逻辑分区
parted -s /dev/sdb mkpart logic 3G 5G

创建第二个逻辑分区
parted -s /dev/sdb mkpart logic 5G 100% #100%代表使用剩余的所有空间

查看分区大小
parted -s /dev/sdb print
Model: ATA QEMU HARDDISK (scsi)
Disk /dev/sdb: 8590MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type      File system  标志
 1      512B    3000MB  3000MB  primary
 2      3001MB  8590MB  5589MB  extended               lba
 5      5000MB  8590MB  3590MB  logical

删除分区
parted -s /dev/sdb rm 5          #rm后面跟的事分区的编号,print出的Number
parted -s /dev/sdb print
Number  Start   End     Size    Type      File system  标志
 1      512B    3000MB  3000MB  primary
 2      3001MB  8590MB  5589MB  extended               lba

对/dev/sdc分一个主分区,类型为swap
parted -s /dev/sdc mklabel msdos
parted -s /dev/sdc -- mkpartfs primary linux-swap 0 -1         #从使用所有空间


参考文档:

Parted User Manual
该文章最后由 阿炯 于 2021-08-26 17:10:31 更新,目前是第 2 版。