MBR 的2TB限制
阅读原文时间:2021年04月20日阅读:1

使用大于2T的块设备(MBR介绍)

       Linux在内核中选择支持Large Block Device时,是可以使用大于2T的块设备的。但是当使用Fdisk来查看这个块设备时,却发现最大只能显示出来2T的空间,而且使用其他的分区工具时也很难使用大于2T的块设备。

Fdisk所使用的分区表为MBR,Master Boot Record,即主引导记录。他是不属于任何一个操作系统,也不能用操作系统提供的磁盘操作命令来读取它。硬盘的0柱面、0磁头、1扇区称为主引导扇区,Fdisk将会写512个字节的记录在此,即MBR记录。启动过程详见How It Works : Master Boot Record (MBR),http://cang.baidu.com/lis/snap/2a0542a949b8e3b8ba4fb147.html

MBR的组成

一个扇区的硬盘主引导记录MBR由4个部分组成:

1. 主引导程序(偏移地址0000H—0088H),它负责从活动分区中装载,并运行系统引导程序。

2. 出错信息数据区,偏移地址0089H--00E1H为出错信息,00E2H—01BDH全为0字节。

3. 分区表(DPT,Disk Partition Table)含4个分区项,偏移地址01BEH—01FDH,每个分区表项长16个字节,共64字节为分区项1、分区项2、分区项3、分区项4。

4. 结束标志字,偏移地址01FE—01FF的2个字节值为结束标志55AA,如果该标志错误系统就不能启动。

MBR的组成结构图:

0000-0088

Master Boot Record 主引导程序

主引导程序

0089-01BD

出错信息数据区

数据区

01BE-01CD

分区项1(16字节)

分区表

01CE-01DD

分区项2(16字节)

01DE-01ED

分区项3(16字节)

01EE-01FD

分区项4(16字节)

01FE

55

结束标志

01FF

AA

**

MBR中的分区信息结构**

占用512个字节的MBR中,偏移地址01BEH--01FDH的64个字节,为4个分区项内容(分区信息表)。它是由磁盘介质类型及用户在使用 FDISK定义分区说确定的。在实际应用中,FDISK对一个磁盘划分的主分区可少于4个,但最多不超过4个。每个分区表的项目是16个字节,其内容含义如下所示。

分区项表(16字节)内容及含义

存贮字节位

内容及含义

第1字节

引导标志。若值为80H表示活动分区,若值为00H表示非活动分区。

第2、3、4字节

本分区的起始磁头号、扇区号、柱面号。其中:

磁头号——第2字节;

扇区号——第3字节的低6位;

柱面号——为第3字节高2位+第4字节8位。

第5字节

分区类型符。

00H——表示该分区未用(即没有指定);

06H——FAT16基本分区;

0BH——FAT32基本分区;

05H——扩展分区;

07H——NTFS分区;

0FH——(LBA模式)扩展分区(83H为Linux分区等)。

第6、7、8字节

本分区的结束磁头号、扇区号、柱面号。其中:

磁头号——第6字节;

扇区号——第7字节的低6位;

柱面号——第7字节的高2位+第8字节。

第9、10、11、12字节

本分区之前已用了的扇区数。

第13、14、15、16字节

本分区的总扇区数。

从上述来看,在使用MBR时,最大的分区数据为4个。从分区信息表的结构组成可以看到,一个分区的总扇区数是由4个字节来代表的,那么他所包含的最大扇区为2^(4*8)个,每个扇区为512字节,即每个分区包含的最大字节数为(2^32)*2^9=2^41 bytes,即2T。

其实这个限制在Fdisk和Parted等分区工具在定义磁盘的结构体时,也可以非常容易的看到。

fdisk:

/*

* per partition table entry data

*

* The four primary partitions have the same sectorbuffer (MBRbuffer)

* and have NULL ext_pointer.

* Each logical partition table entry has two pointers, one for the

* partition and one link to the next one.

*/

struct pte {

struct partition *part_table; /* points into sectorbuffer */

struct partition *ext_pointer; /* points into sectorbuffer */

char changed; /* boolean */

unsigned int offset; /* disk sector number */ <--限制在这里

char *sectorbuffer; /* disk sector contents */

} ptes[MAXIMUM_PARTS];

parted:

/* ripped from Linux source */

struct _DosRawPartition {

uint8_t boot_ind; /* 00: 0x80 - active */

RawCHS chs_start; /* 01: */

uint8_t type; /* 04: partition type */

RawCHS chs_end; /* 05: */

uint32_t start; /* 08: starting sector counting from 0 */ <--限制

uint32_t length; /* 0c: nr of sectors in partition */ <--限制

} __attribute__((packed));

由上可见,如果使用fdisk来分区的话,是不可能使用到大于2T的块设备的。这里,就要引入GPT的概念。

在EFI规范中,一种突破传统MBR磁盘分区结构限制的GUID磁盘分区系统(GPT)被引入。GUID 分区表 (GPT)是一种由基于 Itanium 计算机中的可扩展固件接口 (EFI) 使用的磁盘分区架构。与主启动记录 (MBR) 分区方法相比,GPT 具有更多的优点,因为它允许每个磁盘有多达 128 个分区,支持高达 18 EB字节的卷大小,允许将主磁盘分区表和备份磁盘分区表用于冗余,还支持唯一的磁盘和分区 ID (GUID)。

与支持最大卷为 2 TB (terabytes) 并且每个磁盘最多有 4 个主分区(或 3 个主分区,1 个扩展分区和无限制的逻辑驱动器)的主启动记录 (MBR) 磁盘分区的样式相比,GUID 分区表 (GPT) 磁盘分区样式支持最大卷为 18 EB (exabytes) 并且每磁盘最多有 128 个分区。与 MBR 分区的磁盘不同,至关重要的平台操作数据位于分区,而不是位于非分区或隐藏扇区。另外,GPT 分区磁盘有多余的主要及备份分区表来提高分区数据结构的完整性。

下面说一下如何使用GPT分区表。首先要在内核(需要64位的)中加入对EFI的支持(一般默认都加了),然后使用parted即可。

例:

parted /dev/cciss/c0d1

mklabel gpt /*使用gpt分区表*/

mkpart primary 0 7143487.601

quit

这样就把/dev/cciss/c0d1使用gpt分区表,并且建立一个分区,分区大小约为7T。然后使用mkfs对/dev/cciss/c0d1p1进行创建文件系统就可以使用了。

上述是针对Linux操作系统来做的相关操作,其实在其他系统上都是相似的,只要改变块设备的分区表类型为GPT即可使用超过2T的块设备了

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章