转http://hi.baidu.com/linux/blog/item/5e2442a70db50694d14358ec.html
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的块设备了。