GPT 标头(通常在 LBA 1 中)有一个PartitionEntryLBA
字段(请参阅规范中的 5.3.2 GPT 标头)。各种参考资料(例如维基百科 GPT 条目)中都有描述该字段的语言,指出它应该指向 LBA 2。
规范指出“主 GPT 分区条目阵列必须位于主 GPT 头之后并在第一个可用 LBA 之前结束”。
在这种情况下,“之后”似乎有一些回旋余地。这并不一定意味着立即地之后 - 第一个分区条目可以是标题之后的某些 LBA,并且仍然满足规范中的指导。
我正在使用一个嵌入式处理器,它在存储卡(例如 SD)的第二个扇区中查找 4k 向量表。所以我不能把 GPT 分区条目放在那里。所以我想在该表之后写入 GPT 分区条目(假设 512 字节扇区,偏移量为 5k 字节)。我认为这是合理的,但还没有查看任何标准 GPT 分区工具(例如 Linux 上的 parted)来查看是否/如何支持它。标准引导加载程序(例如 u-boot)是否能够在这样的位置找到分区条目表。
因此,我有兴趣了解使用各种分区工具和引导加载程序处理非典型 GPT 分区条目表位置(即,不在 LBA 2 上放置表的主副本)的实际经验。我偏爱 bsd/linux,但我也有兴趣了解其他环境(甚至关于某些商业操作系统的轶事)。
这是一个开放式的问题。更具体地说,是否存在任何已知的失败案例,这些案例涉及非典型的 GPT 分区条目表位置以及现有的分区工具和/或引导加载程序?
您可以在这里查看 UEFI 规格:http://www.uefi.org/specifications。我正在查看最新版本(修订版 2.4,勘误表 C)。
我尚未拥有 UEFI 会员资格(http://www.uefi.org/join),所以我无法访问那里的论坛(http://www.uefi.org/FWOSForum)。
ps 似乎有一个更严格的要求(?),即主 GPT 标头位于 LBA 1,即使StartingLBA
PMBR 中有一个字段(位于 LBA 0)。规范做具体说明该StartingLBA
字段应为 LBA 1。但如果必须位于 LBA 1,为什么还要保留该字段?如果情况需要,为什么不允许 GPT 标头位于 LBA 10?这在我当前的使用情况下不是必需的,并且本论坛中的问题有些夸张(可能在官方 UEFI 论坛中提出会更好)。
答案1
我敢发誓我在某些混合 ISO 映像(用于 Linux 发行版的那种,这样它们就可以刻录到 CD-R 或写入 USB 闪存驱动器而无需后期处理)中看到过类似的东西;但是,我刚刚检查了几个,它们似乎没有这样做。也许我记错了,或者我只是没有检查正确的。我在isohybrid
手册页中也没有看到任何关于此的内容——但我不确定这是创建这些映像最常用的方法。不过,您可能想比我更进一步地遵循这个线索……
顺便说一下,我是 GPT fdisk 的作者。我已经有一段时间没有接触过相关代码了,但快速回顾一下,我发现 GPT fdisk应该读取主分区表不从 LBA 2 开始的磁盘;但是,GPT fdisk 不支持更改此位置,即使它可以成功读取这样的磁盘,我也不能保证它会将表保存回原始位置。您可能能够对其进行破解以在其他位置启动该表以进行实验。事实上,我刚刚尝试了一下,但代码中有许多地方使用硬编码的“1”或“2”值来填充 LBA 值,而我在初次尝试中没有找到它们,所以我最终将标头写入分区表的中间,这当然不太好。如果您想尝试,请查看文件gpt.cc
。首先查找partitionEntriesLBA
和的firstUsableLBA
设置位置——但一些相关常量也在函数调用中。
至于主 GPT 标头的位置,我怀疑您是否可以更改它。保护性 MBR 本身并不是 GPT 数据结构的一部分;其目的是将磁盘标识为 GPT 磁盘并防止不了解 GPT 的工具弄乱磁盘,而不是标识 GPT 数据结构的起始位置。该StartingLBA
字段的存在是因为它是 MBR 数据结构的一部分,而不是因为 GPT 将其用于任何用途。我认为某些工具可能会使用 MBR 保护分区的起始点作为指向主标头的指针,但我怀疑大多数人是否会这样做。当然 GPT fdisk 不会这样做;它将 LBA 1 硬编码为主标头的位置。
如果你对此有更多疑问,你可以发布在edk2-devel 邮件列表。很多 EFI 开发人员都在那里闲逛,他们中的一些人可能知道您正在尝试做的事情的先例,或者知道实现您的目标的其他方法。