一 磁盘
磁盘的组成主要有磁盘盘、机械手臂、磁盘读取头与主轴马达所组成, 而数
据的写入其实是在磁盘盘上面。磁盘盘上面又可细分出扇区(Sector)与磁道(Track)两种单位, 其中扇有点像底下这样:
那么是否每个扇区都一样重要呢?其实整颗磁盘的第一个扇区特别的重要,因为他记录了整颗磁盘的
重要信息! 早期磁盘第一个扇区里面含有的重要信息我们称为 MBR (Master Boot Record) 格式,但
是由于近年来磁盘的容量不断扩大,造成读写上的一些困扰, 甚至有些大于 2TB 以上的磁盘分区
已经让某些操作系统无法存取。因此后来又多了一个新的磁盘分区格式,称为 GPT (GUID partition
table)! 那么分区表又是啥?
其实妳刚刚拿到的整颗硬盘就像一根原木,你必须要在这根原木上面切割出你想
要的区段, 这个区段才能够再制作成为你想要的家具!如果没有进行切割,那么原木就不能被有效
的使用。 同样的道理,你必须要针对你的硬盘进行分区,这样硬盘才可以被你使用的!这两种分区格式与限制不太相同!
通常磁盘可能有多个磁盘盘,所有磁盘盘的同一个磁道我们称为磁柱 (Cylinder), 通常那是文件系统的最小单位,也就是分区槽的最小单位啦!为什么说『通常』
呢?因为近来有 GPT 这个可达到 64bit 纪录功能的分区表, 现在我们甚至可以使用扇区 (sector)
号码来作为分区单位!
二 MSDOS (MBR) 分区表格式与限制
早期的 Linux 系统为了兼容于 Windows 的磁盘,因此使用的是支持 Windows 的 MBR(Master Boot
Record, 主要开机纪录区) 的方式来处理开机管理程序与分区表!而开机管理程序纪录区与分区表则
通通放在磁盘的第一个扇区, 这个扇区通常是 512bytes 的大小 (旧的磁盘扇区都是 512bytes !),
所以说,第一个扇区 512bytes 会有这两个数据:
1. 主要启动记录区(Master Boot Record, MBR):可以安装开机管理程序的地方,有 446 bytes
2. 分区表(partition table):记录整颗硬盘分区的状态,有 64 bytes
3. 硬盘的分区有效标志(Magic Number): 有2bytes,aa和55被称为幻数(Magic Number),BIOS读取MBR最后会看是否为这两个幻数,如果没有则认为这是一个没有分区的硬盘
由于分区表所在区块仅有 64 bytes 容量,因此最多仅能有四组记录区,每组记录区记录了该区段的启
始与结束的磁柱号码。 若将硬盘以长条形来看,然后将磁柱以柱形图来看,那么那 64 bytes 的记录
区段有点像底下的图示:
假设上面的硬盘装置文件名为/dev/sda 时,那么这四个分区槽在 Linux 系统中的装置文件名如下所示,
重点在于档名后面会再接一个数字,这个数字与该分区槽所在的位置有关!
P1:/dev/sda1
P2:/dev/sda2
P3:/dev/sda3
P4:/dev/sda4
上图中我们假设硬盘只有 400 个磁柱,共分区成为四个分区槽,第四个分区槽所在为第 301 到 400
号磁柱的范围。当你的操作系统为 Windows 时,那么第一到第四个分区槽的代号应该就是 C, D, E, F。
当你有资料要写入 F 槽时, 你的数据会被写入这颗磁盘的 301~400 号磁柱之间的意思。
由于分区表就只有 64 bytes 而已,最多只能容纳四笔分区的记录, 这四个分区的记录被称为主要
(Primary)或延伸(Extended)分区槽。 根据上面的图示与说明,我们可以得到几个重点信息:
1. 其实所谓的『分区』只是针对那个 64 bytes 的分区表进行设定而已!
2. 硬盘默认的分区表仅能写入四组分区信息
3. 这四组分区信息我们称为主要(Primary)或延伸(Extended)分区槽
4. 分区槽的最小单位『通常』为磁柱(cylinder)
5. 当系统要写入磁盘时,一定会参考磁盘分区表,才能针对某个分区槽进行数据的处理
咦!你会不会突然想到,为啥要分区啊?基本上你可以这样思考分区的角度:
1. 数据的安全性:
因为每个分区槽的数据是分开的!所以,当你需要将某个分区槽的数据重整时,例如你要将计算机中
Windows 的 C 槽重新安装一次系统时, 可以将其他重要数据移动到其他分区槽,例如将邮件、桌面数据移
动到 D 槽去,那么 C 槽重灌系统并不会影响到 D 槽! 所以善用分区槽,可以让妳的数据更安全。
2. 系统的效能考虑:
由于分区槽将数据集中在某个磁柱的区段,例如上图当中第一个分区槽位于磁柱号码 1~100 号,如此一来
当有数据要读取自该分区槽时, 磁盘只会搜寻前面 1~100 的磁柱范围,由于数据集中了,将有助于数据读
取的速度与效能!所以说,分区是很重要的!
既然分区表只有记录四组数据的空间,那么是否代表我一颗硬盘最多只能分区出四个分区槽?当然不
是啦!有经验的朋友都知道, 你可以将一颗硬盘分区成十个以上的分区槽的!那又是如何达到的呢?
在 Windows/Linux 系统中, 我们是透过刚刚谈到的延伸分区(Extended)的方式来处理的啦!延伸分区
的想法是: 既然第一个扇区所在的分区表只能记录四笔数据, 那我可否利用额外的扇区来记录更多
的分区信息?实际上图示有点像底下这样:
NOTE:实际上延伸分区并不是只占一个区块,而是会分布在每个分区槽的最前面几个扇区来
记载分区信息的!只是为了方便读者记忆, 鸟哥在上图就将他简化了!有兴趣的读者可以到底下的连结瞧一瞧实
际延伸分区的纪录方式:
http://en.wikipedia.org/wiki/Extended_boot_record
在上图当中,我们知道硬盘的四个分区记录区仅使用到两个,P1 为主要分区,而 P2 则为延伸分区。
请注意,延伸分区的目的是使用额外的扇区来记录分区信息,延伸分区本身并不能被拿来格式化。 然
后我们可以透过延伸分区所指向的那个区块继续作分区的记录。
如上图右下方那个区块有继续分区出五个分区槽, 这五个由延伸分区继续切出来的分区槽,就被称
为逻辑分区槽(logical partition)。 同时注意一下,由于逻辑分区槽是由延伸分区继续分区出来的,所
以他可以使用的磁柱范围就是延伸分区所设定的范围喔! 也就是图中的 101~400 !
同样的,上述的分区槽在 Linux 系统中的装置文件名分别如下:
1. P1:/dev/sda1
2. P2:/dev/sda2
3. L1:/dev/sda5
4. L2:/dev/sda6
5. L3:/dev/sda7
6. L4:/dev/sda8
7. L5:/dev/sda9
仔细看看,怎么装置文件名没有/dev/sda3 与/dev/sda4 呢?因为前面四个号码都是保留给 Primary 或
Extended 用的! 所以逻辑分区槽的装置名称号码就由 5 号开始了!这在 MBR 方式的分区表中是
个很重要的特性,不能忘记!
MBR 主要分区、延伸分区与逻辑分区的特性我们作个简单的定义:
1. 主要分区与延伸分区最多可以有四笔(硬盘的限制)
2. 延伸分区最多只能有一个(操作系统的限制)
3. 逻辑分区是由延伸分区持续切割出来的分区槽;
4. 能够被格式化后,作为数据存取的分区槽为主要分区与逻辑分区。延伸分区无法格式化;
5. 逻辑分区的数量依操作系统而不同,在 Linux 系统中 SATA 硬盘已经可以突破 63 个以上的分区限制;
MBR 分区表除了主分区、延伸分区、逻辑分区需要注意之外,由于每组分区表仅有 16bytes 而
已,因此可纪录的信息真的是相当有限的! 所以,在过去 MBR 分区表的限制中经常可以发现如下
的问题:
1. 操作系统无法抓取到 2.2T 以上的磁盘容量!
2. MBR 仅有一个区块,若被破坏后,经常无法或很难救援。
3. MBR 内的存放开机管理程序的区块仅 446bytes,无法容纳较多的程序代码。
这个 2.2TB 限制的现象在早期并不会很严重。但是,近年来硬盘厂商动不对推出的磁盘容量就高达
好几个 TB 的容量!目前 (2016) 单一磁盘最高容量甚至高达 8TB 了! 如果使用磁盘阵列的系统,
像鸟哥的一组系统中,用了 24 颗 4TB 磁盘搭建出磁盘阵列,那在 Linux 底下就会看到有一颗
70TB 左右的磁盘! 如果使用 MBR 的话...那得要 2TB/2TB 的割下去,虽然 Linux kernel 现在已
经可以透过某些机制让磁盘分区高过 63 个以上,但是这样就得要割出将近 40 个分区槽~ 真要命...
为了解决这个问题,所以后来就有 GPT 这个磁盘分区的格式出现了!
三 GUID partition table, GPT 磁盘分区表
因为过去一个扇区大小就是 512bytes 而已,不过目前已经有 4K 的扇区设计出现!为了兼容于所有
的磁盘,因此在扇区的定义上面, 大多会使用所谓的逻辑区块地址(Logical Block Address, LBA)来处
理。GPT 将磁盘所有区块以此 LBA(预设为 512bytes 喔!) 来规划,而第一个 LBA 称为 LBA0 (从
0 开始编号)。
与 MBR 仅使用第一个 512bytes 区块来纪录不同, GPT 使用了 34 个 LBA 区块来纪录分区信息!
同时与过去 MBR 仅有一的区块,被干掉就死光光的情况不同, GPT 除了前面 34 个 LBA 之外,
整个磁盘的最后 33 个 LBA 也拿来作为另一个备份!这样或许会比较安全些吧!详细的结构有点像
底下的模样:
上述图示的解释说明如下:
LBA0 (MBR 相容区块)
与 MBR 模式相似的,这个兼容区块也分为两个部份,一个就是跟之前 446 bytes 相似的
区块,储存了第一阶段的开机管理程序! 而在原本的分区表的纪录区内,这个兼容模式仅
放入一个特殊标志的分区,用来表示此磁盘为 GPT 格式之意。而不懂 GPT 分区表的磁盘
管理程序, 就不会认识这颗磁盘,除非用户有特别要求要处理这颗磁盘,否则该管理软件
不能修改此分区信息,进一步保护了此磁盘!
LBA1 (GPT 表头纪录)
这个部份纪录了分区表本身的位置与大小,同时纪录了备份用的 GPT 分区 (就是前面谈到
的在最后 34 个 LBA 区块) 放置的位置, 同时放置了分区表的检验机制码 (CRC32),操
作系统可以根据这个检验码来判断 GPT 是否正确。若有错误,还可以透过这个纪录区来
取得备份的 GPT(磁盘最后的那个备份区块) 来恢复 GPT 的正常运作!
LBA2-33 (实际纪录分区信息处)
从 LBA2 区块开始,每个 LBA 都可以纪录 4 笔分区纪录,所以在默认的情况下,总共
可以有 4*32 = 128 笔分区纪录喔!因为每个 LBA 有 512bytes,因此每笔纪录用到 128
bytes 的空间,除了每笔纪录所需要的标识符与相关的纪录之外,GPT 在每笔纪录中分别提供了 64bits 来记载开始/结束的扇区号码,因此,GPT 分区表对于单一分区槽来说, 他
的最大容量限制就会在『 264 * 512bytes = 263 * 1Kbytes = 233*TB = 8 ZB 』,要注意 1ZB =
230TB 啦! 你说有没有够大了?
现在 GPT 分区预设可以提供多达 128 笔纪录,而在 Linux 本身的核心装置纪录中,针对单一磁盘
来说,虽然过去最多只能到达 15 个分区槽,不过由于 Linux kernel 透过 udev 等方式的处理,现在
Linux 也已经没有这个限制在了! 此外,GPT 分区已经没有所谓的主、延伸、逻辑分区的概念,既
然每笔纪录都可以独立存在, 当然每个都可以视为是主分区!每一个分区都可以拿来格式化使用!
NOTE:由于新的机制的关系,分区槽已经可以突破核心限制的状况! 此
外,为了查询正确性,鸟哥还真的有注意到网络上有朋友实际拿一颗磁盘分区出 130 个以上的分区槽, 结果他发
现 120 个以前的分区槽均可以格式化使用,但是 130 之后的似乎不太能够使用了!或许跟默认的 GPT 共 128 个
号码有关!虽然新版的 Linux 大多认识了 GPT 分区表,没办法,我们 server 常常需要比较高容量的磁盘!
不过,在磁盘管理工具上面, fdisk 这个老牌的软件并不认识 GPT !要使用 GPT 的话,得要操
作类似 gdisk 或者是 parted 指令 另外,开机管理程序方面, grub 第一版并不认识 GPT !得要 grub2 以后才会认识的!
注:本文主要来自鸟哥
其他参考文献:http://blog.chinaunix.net/uid-24774106-id-3340397.html