我有一台 UEFI 计算机,其驱动器采用 GPT 分区。此驱动器上有一个 EFI 系统分区、一个带有可启动 Ubuntu 系统的第二个分区以及大量未分配空间。我想将整个驱动器恢复到旧版 BIOS 计算机,并从中启动 Ubuntu。
为了避免备份整个 2TB 驱动器(包括所有未分配空间),我尝试备份和恢复分区映像,但没有成功,我被发送到 GRUB shell。我将目标驱动器格式化为 GPT,因为它似乎允许我这样做。也许我应该使用 MBR,但我不确定 GPT 分区是否可以放在 MBR 上。所以我的问题是:是否可以将 Linux GPT 分区恢复到 MBR 或一般的旧式 BIOS 系统?是否有办法使用单个分区而不是完整的驱动器映像来执行此操作,以节省时间?
答案1
了解如何将 GPT 分区磁盘转换为 MBR 分区磁盘
由于两个分区表结构的磁盘格式不同,这种转换可能会产生困难。
术语 LBA 描述了一种磁盘访问方法,该方法使用从零开始到 n-1 结束的上升“门牌号”,其中 n 表示磁盘的总扇区数。
谷氨酰胺磷酸酶(代表 GUID 分区表)
GPT 是一种从 LBA=0 开始的简单结构,由从 LBA=1 开始的标头和下面的表组成,其中每个条目都以 LBA(逻辑块地址)的形式指向分区的起始和结束扇区。磁盘末尾有该结构的备份。
为了防止旧版操作系统覆盖该空间而无法识别 GPT 结构,将保护性 MBR 放置在 LBA=0 中,告知旧版操作系统整个空间已用完。
因此磁盘上的结构看起来将是这样的:
pMBR GPTHeaderAndTable p1 p2 p3 p4 p5 p6 ... GPTbackup
每个分区之间不需要有空闲空间。
膜生物反应器(代表主引导记录)
MBR 最初也是一个简单的表,位于磁盘的第一个扇区(LBA=0),最多包含四个条目。后来,微软通过引入扩展分区扩展了此结构。此结构中可以容纳无限数量的所谓逻辑分区。
缺点是其磁盘布局:它需要在每个分区占用的空间之间驻留一个附加分区表的链式列表。
LBA=0 中的简单 MBR 只能保存一个主分区条目。处理两个分区(一个主分区和另一个逻辑分区)时,需要第二个分区表位于主分区和逻辑分区之间:
MBR primary1 ext_table logical1
请注意,标记的第二个分区logical1
不会立即跟上primary1
。ext_table
它会占用一个扇区。
当处理三个分区(一个主分区和两个逻辑分区)时,MBR 结构将要求 MBR 位于 LBA=0,并且每个逻辑分区之间有一个分区表:
MBR primary1 ext_table logical1 ext_table logical2
每个都ext_table
至少占用一个扇区。
以 Microsoft 风格创建 MBR
更糟糕的是,Microsoft 的 fdisk 最初将分区表放置在磁柱边界 [磁柱=任意,磁头=0,扇区=1] 上,而分区本身放置在 [磁柱=任意,磁头=1,扇区=1] 上,该磁盘的 CHS 布局为 63 个扇区,会产生 63 个未使用的扇区。CHS 寻址(磁柱、磁头、扇区)是一种过时的扇区寻址方案。它的信息是 Windows XP 等旧操作系统所必需的。MBR 样式的分区表包含 CHS 样式和 LBA 样式的信息来寻址分区。
根据转换程序所需的兼容程度,每个分区之间至少需要 1 个扇区来存储额外的分区表。
随着高级磁盘格式的出现及其 4096 字节的物理扇区大小,遵循这些做法是相当愚蠢的(性能下降并给磁盘带来压力)。我认为至少 Gparted 和其他可能允许以不同的方式进行分区,将分区起始点放在兆字节边界上(每个分区之间浪费了 2048 个扇区(2048*512=1048576))。
MBR 格式分区的空间要求可能会导致分区移动一些扇区。这是一个危险的操作,尤其是在没有像笔记本电脑电池这样的电源缓冲器的情况下,建议进行备份。考虑到备份所需的时间,人们可能会考虑获取第二个磁盘分区,然后将分区逐个复制到新磁盘。
关于您的评论的评论
@vincebel:无法保证此转换一定有效,并且这可能是一个有风险的操作。上面的内容应该可以向您解释这一点。
@gronostaj:我尝试解释额外的空间要求。另一方面,GPT 表及其备份的空间不再需要。但是,转换方法可以随着分区数量的增加而增加空间要求。请不要使用 ELI5 之类的缩写。我不是以英语为母语的人,我必须查找它们。谢谢。
答案2
从本质上讲,分区条目(无论分区表的类型如何)中最重要的信息只是一对数字,表示分区的起点(逻辑块地址,LBA)和终点(即驱动器的连续逻辑块范围,或者如果您愿意的话,也可以称为扇区)。当然,它们也会告诉您分区的大小。
因此,只要您可以在目标驱动器上创建 MBR/msdos 分区表,其分区(条目)的大小与 GPT 分区驱动器上的源分区相同,并且两个驱动器的逻辑块/扇区大小相同,你可以做类似的事情dd if=/dev/sdXn of=/dev/sdYm
(其中n
可能等于或不等于m
)来转储每个分区一次(但当然,如果你坚持的话,你可以编写一个小 shell 循环来自动化操作;只是大多数人可能不认为这是一种安全的做法)从源驱动器到目标驱动器,并且每个驱动器上的所有数据都将被妥善保存。
真正让您担心/困扰的是,在转储/恢复后,您可能无法开箱即用地启动目标驱动器,因为元数据新分区表中丢失/更改的分区信息可能对于您使用的引导加载程序的正确加载至关重要。从本质上讲,您只需要重新安装(包括正确重写/重新生成相关的引导加载程序配置)即可。
此外,您可能需要查看目标驱动器上需要哪些 grub 变体。假设您需要它在 BIOS/CSM 和原生 UEFI 上均可启动,则需要安装 i386-pc 变体和 x86_64-efi 变体(或者,对于 32 位 UEFI 的特殊情况,则安装 i386-efi 变体)。
值得注意的是,数据可以放置在不属于驱动器上任何分区的逻辑块上,例如 MBR 和最近(即,就起始 LBA 而言)随后的分区。例如,i386-pc grub 将其部分代码放在此处。(但这只是一点旁注。它与您的情况并不完全相关。)
PS “扇区”一词在不同语境中可能具有不同含义。有些人认为它特指(传统)硬盘上的“物理块”。在 Linux内核代码(不一定在用户空间程序中)它特指 512 字节块。在这个答案中,它只是用作“逻辑块”的同义词,以防这个术语对你来说太奇怪。
答案3
无法更改分区映射类型,例如,在不删除分区的情况下从 GPT 更改为 MBR。
编辑:上面一行不正确。感谢 gronostaj 的修正。
对于 Linux 系统,你应该能够
- 进行文件备份
- 删除分区图。一种可能的方法:https://serverfault.com/a/250845/473427
- 在 MBR 分区图下重新创建分区
- 恢复备份。
该过程具有极大的破坏性,因此在删除分区图之前请确保您的备份有效。