摘自《鸟哥的linux私房菜》
2.2.1 磁盘连接的方式与装置文件名的关系
常见的磁盘接口有两种,分别是 SATA与SAS 接口,目前(2015)的主流是SATA 接口。不过更老旧的计算机则有可能是IDE接口! 以前的IDE接口与SATA 接口在Linux 的磁盘代号并不相同。近年来为了统一,大部分Linux distribution 已经将IDE接口的磁盘文件名仿真成跟SATA 一样了!
虚拟化是目前很常见的一项技术, 虚拟机使用的『虚拟磁盘』并不是正规的磁盘接口!这种情况底下,你的磁盘文件名就不一样了! 正常的实体机器大概使用的都是/dev/sd[a-] 的文件名,至于虚拟机环境底下,为了加速,可能就会使用/dev/vd[a-p] 这种装置文件名喔!
SATA/USB/SAS 等磁盘接口都是使用SCSI 模块来驱动的, 这些接口的磁盘装置文件名都是/dev/sd[a-p]的格式。如果你的PC 上面有两个SATA 磁盘以及一个USB 磁盘,而主板上面有六个SATA 的插槽。这两个SATA 磁盘分别安插在主板上的SATA1, SATA5 插槽上。Linux是使用侦测到的顺序来决定装置文件名的,并非与实际插槽代号有关,因此装置的文件名如下:
- SATA1 插槽上的檔名:/dev/sda
- SATA5 插槽上的檔名:/dev/sdb
- USB 磁盘(开机完成后才被系统捉到):/dev/sdc
每个分区的装置文件名又是什么?
2.2.2 MSDOS(MBR) 与GPT 磁盘分区表(partition table)
MSDOS (MBR) 分区表格式与限制
早期的 Linux 系统为了兼容于Windows 的磁盘,因此使用的是支持Windows 的MBR(Master Boot Record) 的方式来处理开机管理程序与分区表!而开机管理程序纪录区与分区表则通通放在磁盘的第一个扇区,这个扇区通常是 512bytes 的大小(旧的磁盘扇区都是512bytes ),
即,第一个扇区512bytes 会有这两个数据:
- 主要启动记录区(Master Boot Record, MBR):可以安装开机管理程序的地方,有446 bytes
- 分区表(partition table):记录整颗硬盘分区的状态,有64 bytes
分区表仅有64 bytes 容量,最多仅能有四组记录区,每组记录区记录了该区段的启始与结束的磁柱号码。若将硬盘以长条形来看,那么那 64 bytes 的记录区段有点像底下的图示:
假设上面的硬盘装置文件名为/dev/sda 时,那么这四个分区槽在Linux 系统中的装置文件名为:
- P1:/dev/sda1
- P2:/dev/sda2
- P3:/dev/sda3
- P4:/dev/sda4
既然分区表只有记录四组数据的空间,那么是否代表我一颗硬盘最多只能分出四个分区?我们可以利用额外的扇区来记录更多的分区信息,即延伸分区。我们可以透过延伸分区所指向的那个区块继续作分区的记录。实际上图示有点像底下这样:
在在上图当中,硬盘的四个分区记录区仅使用到两个,P1 为主要分区,而P2 则为延伸分区。
请注意,延伸分区的目的是使用额外的扇区来记录分区信息,延伸分区本身并不能被拿来格式化。
由延伸分区继续切出来的分区槽,称为逻辑分区槽(logical partition)。上述的分区槽在Linux 系统中的装置文件名分别如下:
- P1:/dev/sda1
- P2:/dev/sda2
- L1:/dev/sda5
- L2:/dev/sda6
- L3:/dev/sda7
- L4:/dev/sda8
- L5:/dev/sda9
主要分区、延伸分区与逻辑分区总结:
- 主要分区与延伸分区最多可以有四笔(硬盘的限制)
- 延伸分区最多只能有一个(操作系统的限制)
- 逻辑分区是由延伸分区持续切割出来的分区槽;
- 能够被格式化后,作为数据存取的分区槽为主要分区与逻辑分区。延伸分区无法格式化;
- 逻辑分区的数量依操作系统而不同,在Linux 系统中SATA 硬盘已经可以突破63 个以上的分区限制;
每组分区表仅有16bytes,可纪录的信息真的是相当有限的! 所以,在过去MBR 分区表的限制中经常可以发现如下的问题:
- 操作系统无法抓取到2.2T 以上的磁盘容量!
- MBR 仅有一个区块,若被破坏后,经常无法或很难救援。
- MBR 内的存放开机管理程序的区块仅446bytes,无法容纳较多的程序代码。
GUID partition table, GPT 磁盘分区表
过去一个扇区大小就是 512bytes 而已,不过目前已经有4K 的扇区设计出现!为了兼容所有的磁盘,在扇区的定义上面, 大多会使用所谓的逻辑区块地址(Logical Block Address, LBA)来处理。GPT 将磁盘所有区块以此LBA(预设为512bytes) 来规划,而第一个LBA 称为LBA0 (从0 开始编号)。
GPT 使用了34 个LBA 区块来纪录分区信息!
GPT 除了前面34 个LBA 之外,整个磁盘的最后33 个LBA 也拿来作为备份!详细的结构有点像底下的模样:
LBA0 (MBR 相容区块)
与 MBR 模式相似的,这个兼容区块也分为两个部份,一个就是跟之前446 bytes 相似的区块,储存了第一阶段的开机管理程序! 而在原本的分区表的纪录区内,这个兼容模式仅放入一个特殊标志的分区,用来表示此磁盘为GPT 格式之意。而不懂GPT 分区表的磁盘管理程序, 就不会认识这颗磁盘,除非用户有特别要求要处理这颗磁盘,否则该管理软件不能修改此分区信息,进一步保护了此磁盘喔!
LBA1 (GPT 表头纪录)
这个部份纪录了分区表本身的位置与大小,同时纪录了备份用的GPT 分区放置的位置, 同时放置了分区表的检验机制码(CRC32),操作系统可以根据这个检验码来判断GPT 是否正确。若有错误,还可以透过这个纪录区来取得备份的GPT(磁盘最后的那个备份区块) 来恢复GPT 的正常运作!
LBA2-33 (实际纪录分区信息处)
从 LBA2 区块开始,每个LBA 都可以纪录4 笔分区纪录,所以在默认的情况下,总共可以有4*32 = 128 笔分区纪录!
因为每个LBA 有512bytes,因此每笔纪录用到128bytes 的空间,除了每笔纪录所需要的标识符与相关的纪录之外,GPT 在每笔纪录中分别提供了64bits 来记载开始/结束的扇区号码,因此,GPT 分区表对于单一分区槽来说, 他的最大容量限制就会在『264 * 512bytes = 263 * 1Kbytes = 233*TB = 8 ZB 。
现在 GPT 分区预设可以提供多达128 笔纪录,而在Linux 本身的核心装置纪录中,针对单一磁盘来说,虽然过去最多只能到达15 个分区,不过由于Linux kernel 透过udev 等方式的处理,现在Linux 也已经没有这个限制在了! 此外,GPT 分区已经没有所谓的主、延伸、逻辑分区的概念,既然每笔纪录都可以独立存在,当然每个都可以视为是主分区!每一个分区都可以拿来格式化使用喔!
虽然新版的 Linux 大多认识了GPT 分区表,在磁盘管理工具上面, fdisk 这个老牌的软件并不认识GPT 喔!要使用GPT 的话,得要操作类似gdisk 或者是parted 指令才行!另外,开机管理程序方面, grub 第一版并不认识GPT 喔!得要grub2 以后才会认识的!