Skip to content

分区表

MBR(master boot record)

主引导记录( MBR ) 是分区计算机大容量存储设备(例如用于IBM PC 兼容系统及其他系统的固定磁盘或可移动驱动器)的前几个块中的一种引导扇区。 MBR 的概念于 1983 年随PC DOS 2.0公开引入。

MBR 保存有关磁盘扇区(也称为“块”)如何划分为分区的信息,每个分区理论上包含一个文件系统。 MBR 还包含可执行代码,可充当已安装操作系统的加载程序 — 通常将控制权传递给加载程序的第二阶段,或与每个分区的卷引导记录 (VBR) 结合使用。该 MBR 代码通常称为引导加载程序。MBR 由位于驱动器第一个扇区的 512 个或更多字节组成。

MBR结构

  1. 经典通用 MBR 的结构
AddressDescriptionSize
(bytes)
0x0000 (0)Bootstrap code area446
0x01BE (446)Partition entry16
0x01CE (462)Partition entry16
0x01DE (478)Partition entry16
0x01EE (494)Partition entry16
0x01FE (510)0x552
0x01FF (511)0xAA
Total size: 446 + 4×16 + 2512
  1. 现代MBR的结构
AddressDescriptionSize
(bytes)
0x0000 (0)Bootstrap code area (part 1)218
0x00DA (218)0x00002
0x00DC (220)Original physical drive (0x800xFF)1
0x00DD (221)Seconds (0–59)1
0x00DE (222)Minutes (0–59)1
0x00DF (223)Hours (0–23)1
0x00E0 (224)Bootstrap code area (part 2, code entry at 0x0000)216 (or 222)
0x01B8 (440)32-bit disk signature4
0x01BC (444)0x0000 (0x5A5A if copy-protected)2
0x01BE (446)Partition entry16
0x01CE (462)Partition entry16
0x01DE (478)Partition entry16
0x01EE (494)Partition entry16
0x01FE (510)0x552
0x01FF (511)0xAA
Total size: 218 + 6 + 216 + 6 + 4×16 + 2512

PTE

分区表条目(Partition table entries), 存放分区信息. 分区表是PC XT时代硬盘技术的产物,它使用柱面、磁头和扇区( CHS寻址)为单位细分存储介质。这些值不再与现代磁盘驱动器中的同名值相对应,并且与其他设备无关,例如固态驱动器,它们物理上没有柱面或磁头。

在 CHS 方案中,按照惯例,扇区索引(几乎)总是从扇区 1 开始,而不是从扇区 0 开始,并且由于 MS-DOS/PC DOS 直至 7.10 的所有版本中都存在错误,磁头数量通常受到限制到 255 而不是 256。当 CHS 地址太大而无法放入这些字段时,目前通常使用元组(1023, 254, 63),尽管在较旧的系统上以及使用较旧的磁盘工具时,柱面值通常以接近 8 GB 的 CHS 屏障为模进行缠绕,从而导致模糊性和数据损坏的风险。 (如果情况涉及带有 GPT 的磁盘上的“保护性”MBR,Intel 的可扩展固件接口规范要求使用元组 (1023, 255, 63)。) 10 位柱面值按顺序记录在两个字节内以便于调用原始/传统INT 13h BIOS 磁盘访问例程,其中 16 位被分为扇区和柱面部分,而不是字节边界。

由于 CHS 寻址的限制, 已过渡到使用 LBA(或逻辑块寻址) 。分区长度和分区起始地址都是以 32 位数量存储在分区表条目中的扇区值。扇区大小过去被认为固定为 512 (2 9 ) 字节,并且包括芯片组、引导扇区、操作系统、数据库引擎、分区工具、备份和文件系统实用程序以及其他软件在内的各种重要组件都很难具有此值。 -编码。自 2009 年底以来,采用 4096 字节扇区( 4Kn或高级格式)的磁盘驱动器已经可用,尽管其中一些驱动器的扇区大小仍然通过硬盘中的转换向主机系统报告为 512 字节。驱动器固件并称为 512 仿真驱动器 ( 512e )。

由于块地址和大小使用 32 位存储在 MBR 的分区表中,因此使用具有 512 字节扇区(实际或模拟)的驱动器的分区的最大大小以及最高起始地址不能超过 2 TiB −512字节( 2199023255040 字节或 4294967295 (2 32 -1) 个扇区 × 512 (2 9 ) 个扇区字节)。 缓解这种容量限制是 GPT 发展的主要动机之一。

分区条目的布局

偏移量 (字节)字段长度描述
0x001 byte状态或物理驱动器(位 7 设置为活动或可引导,旧 MBR 只接受 0x80,0x00 表示非活动,0x01–0x7F 表示无效)
0x013 bytes分区中第一个绝对扇区的 CHS 地址,格式由三个字节描述,见下三行
0x011 byte
0x021 byte扇区的低 6 位,高 2 位为柱面
0x031 byte柱面的低 8 位
0x041 byte分区类型
0x053 bytes分区中最后一个绝对扇区的 CHS 地址,格式由三个字节描述,见下三行
0x051 byte
0x061 byte扇区的低 6 位,高 2 位为柱面
0x071 byte柱面的低 8 位
0x084 bytes分区中第一个绝对扇区的 LBA 地址
0x0C4 bytes分区中的扇区数量

GPT(GUID Partition Table)

在 20 世纪 90 年代末,英特尔开发了一种新的分区表格式,作为最终统一可扩展固件接口(UEFI) 的一部分。 GUID 分区表在 UEFI 2.8 规范的第 5 章中指定。 GPT 使用 64 位逻辑块地址,允许最大磁盘大小为 2 64 个扇区。对于具有 512 字节扇区的磁盘,最大大小为 8 ZiB (2^64 × 512 字节)或 9.44 ZB (9.44 × 1021 字节)。 对于具有 4,096 字节扇区的磁盘,最大大小为 64 ZiB (2^64 × 4,096 字节)或 75.6 ZB (75.6 × 10^1 字节)。

与 MBR 一样,GPT 使用逻辑块寻址(LBA) 代替历史柱面磁头扇区(CHS) 寻址。保护性 MBR 存储在 LBA 0 中,GPT 标头存储在 LBA 1 中,备份 GPT 标头存储在最终 LBA 中。 GPT 标头有一个指向分区表(分区条目数组)的指针,该指针通常位于 LBA 2。分区表上的每个条目的大小为 128 字节。 UEFI 规范规定,无论扇区大小如何,至少为分区条目阵列分配 16,384 字节。 因此,在具有 512 字节扇区的磁盘上,至少有 32 个扇区用于分区条目阵列,并且第一个可用块位于 LBA 34 或更高,而在 4,096 字节扇区的磁盘上,至少有 4 个扇区用于分区条目阵列。扇区用于分区条目阵列,第一个可用块位于 LBA 6 或更高。

为了有限的向后兼容性,GPT 规范中仍然保留了旧主引导记录(MBR) 的空间,但现在使用它的方式可以防止基于 MBR 的磁盘实用程序错误识别并可能覆盖 GPT 磁盘。这称为保护性 MBR 。

LBA1

偏移量长度内容
0 (0x00)8 字节签名 (“EFI PART”, 45h 46h 49h 20h 50h 41h 52h 54h 或 0x5452415020494645ULL 在小端机器上)
8 (0x08)4 字节标头修订号 - 1.0 (00h 00h 01h 00h) 对于 UEFI 2.10
12 (0x0C)4 字节小端字节序中的标头大小(以字节为单位,通常为 5Ch 00h 00h 00h 或 92 字节)
16 (0x10)4 字节标头的 CRC32(偏移量 +0 到 +0x5b)采用小端字节序,在计算过程中该字段清零
20 (0x14)4 字节预留的; 必须为零
24 (0x18)8 字节当前 LBA(此标头副本的位置)
32 (0x20)8 字节备份 LBA(另一个标头副本的位置)
40 (0x28)8 字节分区的第一个可用 LBA(主分区表最后一个 LBA + 1)
48 (0x30)8 字节最后可用的 LBA(辅助分区表第一个 LBA - 1)
56 (0x38)16 字节混合字节序的磁盘 GUID
72 (0x48)8 字节分区条目数组的起始 LBA(为了兼容性,通常为 2)
80 (0x50)4 字节数组中的分区条目数
84 (0x54)4 字节单个分区条目的大小(通常为 80h 或 128)
88 (0x58)4 字节小端字节序的分区条目数组的 CRC32
92 (0x5C)420 字节预留的; 块的其余部分必须为零(512 字节的扇区大小为 420 字节;但对于较大的扇区大小可以更多)

Partition entries

偏移量长度内容
0 (0x00)16 字节分区类型 GUID
16 (0x10)16 字节唯一分区 GUID(混合字节序)
32 (0x20)8 字节第一个 LBA
40 (0x28)8 字节最后一个 LBA(包含在内,通常为奇数)
48 (0x30)8 字节属性标志(例如位 60 表示只读)
56 (0x38)72 字节分区名称(36 个UTF-16 LE 代码单元)

属性标识

内容
0所需平台(计算机正常运行所需的平台,例如 OEM 分区,磁盘分区实用程序必须按原样保留分区)
1EFI 固件应该忽略分区的内容并且不尝试从中读取
2传统 BIOS 可启动(相当于偏移处的活动标志(通常设置为第 7 位)MBR 分区表的分区条目中 +0h)
3–47保留供将来使用
48–63由各个分区类型定义和使用

将文件作为硬盘

  1. 创建一个磁盘文件, 示例创建一个1G的文件
Terminal window
dd if=/dev/zero of=/path/to/virtual_disk.img bs=1M count=1024
  1. 将文件映射到 loop 设备
Terminal window
sudo losetup /dev/loop0 /path/to/virtual_disk.img

这里 /dev/loop0 是创建的 loop 设备,您可以用 losetup -f 来找到下一个可用的 loop 设备

  1. 使用cfdisk进行分区
cfdisk /dev/loop0

分区完成后可以在/dev/mapper/下看到分区, 如/dev/mapper/loop0p1,如果没有发现分区, 使用kpartx创建设备映射

Terminal window
sudo apt-get install kpartx
sudo kpartx -a /dev/loop0
  1. 格式化分区
Terminal window
sudo mkfs.ext4 /dev/loop0p1
  1. 挂载分区
Terminal window
sudo mkdir /mnt/loop0p1
sudo mount /dev/loop0p1 /mnt/loop0p1
  1. 卸载并释放 loop 设备
Terminal window
sudo umount /mnt/loop0p1
sudo losetup -d /dev/loop0