磁盘分区

磁盘分区

磁盘连接的方式与装置文件名的关系

  • Linux的装置(磁盘是一种装置)都以文件的形态存在,所以磁盘也应是文件,其文件命名规则为: 正常的实体机器大概使用的都是 /dev/sd[a-]的磁盘文件名,在虚拟机环境下可能是 /dev/vd[a-p]
  • /dev/sd[a-]中[]中的取值是 * 跟据Linux核心侦探到磁盘的顺序 *, 假设物理Linux主机中有两块磁盘,先侦测到的磁盘的文件名为 /dev/sda,后侦探到的磁盘名为 /dev/sdb

MSDOS(MBR) 与 GPT 磁盘分区表

一块磁盘可以分成多个分区槽(partition),如同Windows中一块磁盘可以分成C:, D:, E:,…等槽,这就是分区槽。在Linux中同样有类似的分区槽。

MSDOS(MBR) 分区表格式与限制

早期在Linux中是使用的是支持 Windows的 MBR(Master Boot Record,主要开机记录区)的方式处理开机管理程序和分区表,开机管理程序记录区(MBR)与分区表通常放在磁盘的第一个扇区,这个扇区通常是 512bytes的大小,具体分配为:

  • 主要启动记录区(Master Boot Record, MBR):可以安装开机管理程序的地方,有 446 bytes
  • 分区表(partition table):记录整颗硬盘分区的状态,有 64bytes

描述一个分区的属性需要 16bytes,而分区表仅有 64bytes,因此只能有个分区记录。这个分区记录称为主要(Primary)或延伸(Extended)分区槽。
为什么会有延伸分区槽呢?因为我们有时候一块磁盘上有超过四个分区槽,类比Windows中,你也许会C:, D:, E:, F:, G等盘(大于四个),在延伸分区槽的开头部位我们可以有新的分区表记录其他分区槽。见下图便于理解:


磁盘分区
MBR分区无拓展分区


磁盘分区
MBR分区有拓展分区

  • 由延伸分区槽切出来的分区槽称为逻辑分区槽(logical partition),所有的逻辑分区槽加起来组成了延伸分区槽
  • 延伸分区槽不能格式化,因为延伸分区槽包括多个逻辑分区槽,除非将所有逻辑分区槽删除后才能格式化
  • 如果延伸分区破坏,那么所有的逻辑分区将会被删除。
  • 延伸分区槽一般讲磁盘剩余容量全部占用,因为无法在延伸分区槽之外在继续分区剩余容量就被浪费了

Linux中分区槽的命名方式:

假设某块磁盘的文件名为 /dev/sda,则:

  • 假设有四个主分区,无延伸分区槽,则这四个主分区的文件名为 /dev/sda1, /dev/sda2,/dev/sda3,/dev/sda4
  • 假设有三个主分区,一个拓展分区,拓展分区内有两个逻辑分区,则主分区文件名分别为 /dev/sda1, /dev/sda2,/dev/sda3, 拓展分区中的两个逻辑分区的文件名为 /dev/sda5,/dev/sda6
  • 假设有一个主分区,一个拓展分区,拓展分区内有两个逻辑分区,则主分区文件名分别为 /dev/sda1,拓展分区中的两个逻辑分区的文件名为 /dev/sda5,/dev/sda6

也就是说[1-4]是给主分区使用的,若主分区数量小于4,则剩余数字忽略,而逻辑分区必须从[5]开始。

GPT 磁盘分区表(GUID partition table,唯一全局标识分区表)

GPT 磁盘分区表出现的原因:

  • 使用 MBR分区表,操作系统无法抓取到 2.2T 以上的磁盘容量,而现在的磁盘容量大多超过 2.2T
  • MBR 仅有一个区块,若破坏后,经常无法或很难救援
  • MBR 内的存放开机管理程序的区块仅 446bytes,无法容纳较多程序代码

过去一个扇区大小为 512bytes,现在已有 4K的扇区设计出现。为了兼容所有磁盘,在扇区的定义上使用逻辑区块地址(Logical Block Address, LBA)处理。GPT 将磁盘所有区块以 LBA(预设为 512bytes)规划,第一个 LBA 称为 LBA0(从 0 开始编号)。

GPT 使用 34 个 LBA区块来记录分区信息,在磁盘最后有 33 个 LBA 来拿来作为备份,详情见下图:


磁盘分区
GPT 分区表的的结构示意图

相关解释

  • LBA0(MBR 相容区块)
    与 MBR 模式相似的,这个兼容区块也分为两个部份,一个就是跟之前 446 bytes 相似的 区块,储存了第一阶段的开机管理程序。 而在原本的分区表的纪录区内,这个兼容模式仅 放入一个特殊标志的分区,用来表示此磁盘为 GPT 格式之意。而不懂 GPT 分区表的磁盘 管理程序, 就不会认识这颗磁盘,除非用户有特别要求要处理这颗磁盘,否则该管理软件 不能修改此分区信息,进一步保护了此磁盘。
  • LBA1(GPT 表头记录)
    这个部份纪录了分区表本身的位置与大小,同时纪录了备份用的 GPT 分区 (就是前面谈到 的在最后 34 个 LBA 区块) 放置的位置, 同时放置了分区表的检验机制码 (CRC32),操作系统可以根据这个检验码来判断 GPT 是否正确。若有错误,还可以透过这个纪录区来 取得备份的 GPT(磁盘最后的那个备份区块) 来恢复 GPT 的正常运作!
  • LBA2-33(实际记录分区信息处)
    从 LBA2 区块后,每个 LBA都可以记录 4 笔分区记录,所以默认情况下,总共可以有 4*32 = 128 笔分区记录(与 MBR 不同,GPT每笔记录需要 128 bytes, 4 = 512 / 128)。GPT 在每笔记录中分别提供 64bits 来记录开始/结束的扇区号码,因此 GPT 分区表对于单一分区槽最大容量为 $$ 2^64 * 512bytes = 2^63 * 1Kbytes = 2^33 * TB = 8 ZB


个人网站中原文 磁盘分区