在 Ubuntu ISO MBR 中,为什么 GPT 分区与启动分区重叠,并导致 MBR 不可编辑?

在 Ubuntu ISO MBR 中,为什么 GPT 分区与启动分区重叠,并导致 MBR 不可编辑?

问题和背景:

在发行版(例如 ubuntu-16.04-desktop-amd64.iso)的 MBR 分区表中,为什么 GPT 分区似乎与主启动分区重叠?如果我尝试以任何方式编辑分区表,这似乎会产生错误。

我想编辑 MBR 以添加 USB 持久性(如其他地方所述),并且必须添加分区或扩大启动分区。

我相信这曾经起作用,但是这个和类似的发行版中重叠的 GPT #2 分区似乎严重混淆了 fdisk、sfdisk、parted、gparted 和 partprobe。

我的机器是 MBR,而不是 GPT bios。

我错过了什么?


这是发行版的 MBR 分区表(直接来自 ISO 文件):

cat ubuntu-16.04-desktop-amd64.iso | xxd | head -32 | tail -5

给出:

00001b0: 28db 2b00 0000 0000 708e 0e0e 0000 8000  (.+.....p.......
00001c0: 0100 0058 e0fa 0000 0000 6048 2c00 00fe  ...X......`H,...
00001d0: ffff effe ffff 4411 2c00 8012 0000 0000  ......D.,.......
00001e0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00001f0: 0000 0000 0000 0000 0000 0000 0000 55aa  ..............U.

(要解码,请参阅https://en.wikipedia.org/wiki/Master_boot_record

  • 该表从地址 01be 开始,您可以在其中看到“80”,代表#1 主启动分区。

  • 然后注意地址 01d2 处的“ef”,它表示 #2 主分区的类型为 GPT。


以下是按分区(小端序)对表格进行的细分:

partition#1 (normal MBR):
  80        = 'boot' partition flag
  00 01 00  = starting HSC (head, sector, cylindar)
  00        =  partition type ("Empty partition entry")
  58 e0 fa  = last     HSC (head, sector, cylindar)

  0000 0000 = LBA (logical block address) of first absolute sector in the 
  6048 2c00 = number of sectors in partition

partition #2 (GPT):
  00        = non-boot partition
  fe ff ff  = starting HSC (head, sector, cylindar)
  ef        = partition type ("EFI system partition")
  fe ff ff  = last HSC

  4411 2c00 = LBA (logical block adr) of first abs sector in part.
  8012 0000 = number of sectors in partition

尝试编辑分区表:

  • fdisk报告这些分区重叠。请注意 sdb2 [2927216] 的开头位于 sdb1 [0-2955679] 内部,

    sudo fdisk -l /dev/sdb
    

    给出:

      Disk /dev/sdb: 14.5 GiB, 15527313408 bytes, 30326784 sectors
      Units: sectors of 1 * 512 = 512 bytes
      Sector size (logical/physical): 512 bytes / 512 bytes
      I/O size (minimum/optimal): 512 bytes / 512 bytes
      Disklabel type: dos
      Disk identifier: 0x40a863e7
    
      Device     Boot   Start     End Sectors  Size Id Type
      /dev/sdb1  *          0 2955679 2955680  1.4G  0 Empty
      /dev/sdb2       2927216 2931951    4736  2.3M ef EFI (FAT-12/16/32)
    
  • 据我所知,拥有 GPT 分区是可以的,但分区不能重叠。

  • 当我尝试将 iso dd 到 usb 盘时,麻烦就开始了。usb 盘可以正常启动 Ubuntu live,但无论我尝试哪种分区编辑器,都无法无错误地编辑分区表(即未启动且未安装时)。

  • 此外,如果不执行以下冗长的步骤,我甚至无法删除分区表并使 USB 恢复正常:

    dd if=/dev/zero of=/dev/sdb bs=[something like 512 or 2048; doesn't matter] count=[some large number like 100000^]
    

    ^较小的数字似乎并不总是能解决这个问题。我怀疑你不仅需要清除主 fs 块,还需要清除次要块。

    然后使用它fdisk在硬盘上创建一个新的 ms-dos 分区表。

    请注意,如果我在创建新分区表之前没有执行上述 dd 来擦除,则当我尝试编辑分区图(从 debian8 或 ubuntu-16)时,我会收到以下错误消息或类似信息:

    Libparted Warning The driver descriptor says the physical block size
    is 2048 bytes, but Linux says it is 512 bytes.
    
  • 此外,从 ubuntu-12,我得到了这个最有启发性的信息

    gparted -l /dev/sdb:  libparted : 2.3 Could not stat device -l -- No
    such file or directory. /dev/sdb contains GPT signatures, indicating
    that it has a GPT table.  However, it does not have a valid fake msdos
    partition table, as it should.  Perhaps it was corrupted -- possibly
    by a program that doesn't understand GPT partition tables.  Or perhaps
    you deleted the GPT table, and are now using an msdos partition table.
    Is this a GPT partition table?  Both the primary and backup GPT tables
    are corrupt.  Try making a fresh table, and using Parted's rescue
    feature to recover partitions.
    

那么我该如何编辑发行版的 MBR?

顺便说一句,我不是问如何修复重叠,因为这是发行版的实际状态,并且从外观上看,已经有一段时间了,(我也看了 Ub-v16、14 和 12),而是想弄清楚如何编辑它(如果可能的话)。

思路:

  • 这可能是由于使用了过多的 isohybrid 应用程序(用于将 ms-dos MBR 添加到 CDROM 9660 iso 以便它可以在 USB 上启动)造成的吗?

  • 是否有其他可能较新的分区表编辑器可供使用?

  • 是否有不同的、或许是较旧的 Ubuntu 发行版没有这个问题?

答案1

Ubuntu 的.iso映像文件使用 Frankenstein's Monster 格式,旨在支持多种启动方法和设备:

  • 启动媒体
    • 使用 ISO-9660 和 El Torito 将映像写入 DVD 以进行启动
    • 将原始映像复制到 USB 闪存驱动器或类似介质,以便使用传统磁盘分区系统进行启动
  • 引导模式
    • BIOS 模式启动
    • EFI 模式启动

为了兼容如此多的格式和启动方法,开发人员在数据结构上玩弄把戏。这些映像确实不应该被视为“普通”磁盘映像,特别是,你应该最强调的是不是除非您是这些数据结构的顶级专家,否则不要尝试以任何方式修改图像。FWIW,我编写了 GPT fdisk(gdiskcgdisksgdisk)分区工具,并且不会尝试你所说的你正在尝试的事情!

相反,如果您需要修改安装介质,您应该做以下两件事之一:

  • 使用类似的工具鲁弗斯笔式驱动器 Linux, 或者联合国网启动将映像文件写入 USB 闪存驱动器,然后修改 USB 闪存驱动器。此方法之所以有效,是因为这些工具不会执行简单的dd映像内容复制到磁盘;相反,它们会将文件从图像中复制到传统分区磁盘预先存在的文件系统(有时是该工具创建的磁盘)。结果是一个更正常的磁盘,可以使用正常的分区表编辑器和其他实用程序进行修改。
  • 准备您自己的自定义映像。我没有关于如何执行此操作的文档,但 Ubuntu 映像当然是由自动化工具创建的,而不是通过使用十六进制编辑器手动编辑分区表创建的。如果您跟踪用于创建映像的工具和脚本,您可能能够创建一个以您想要的方式修改的映像。创建 Ubuntu“旋转”的人使用这种方法,因此您可能希望首先查找有关如何执行此操作的文档。

在这两种方法中,第一种方法可能更适合你的需求。事实上,我很确定某些此类工具提供了精确执行所需操作的选项。(不过我不记得哪些工具提供了这样的功能。)第二种方法更适合将软件包添加到自定义安装映像等任务。

如果您以前能够做到这种事情,那么很有可能它已经发生了变化,因为开发人员发现需要对数据结构进行更可怕的破解,以解决特定系统的问题。例如,如果 X 品牌的计算机无法解析弗兰肯斯坦的怪物分区表,开发人员可能会对其进行调整,使其适用于 X 品牌的计算机,即使这意味着数据结构比以前更加奇怪。不过,这只是我的猜测,我当然无法谈论您所描述的具体情况。

答案2

解决方法

如果您不使用 USB 制作工具来创建 USB 棒,而是使用终端命令从头开始构建 USB 棒,则需要调整 USB 棒的分区大小。如果您的系统使用 BIOS,以下是有效的详细说明:

如何仅使用终端为 BIOS 创建具有持久性的实时 Ubuntu USB 驱动器


使用 USB 记忆棒备份的使用技巧: 我保留了两个相同的 USB 备份操作系统棒,用于备份我的主要 Debian 双启动 W10 系统。我希望在备份时我的系统不运行。我还想要两个相同的棒,因为有时 USB 棒会磨损。这样我就可以轻松地制作一个新的,只需将剩余的完好棒中的 dd 复制到新棒即可。

当我的系统损坏到无法修复时,它们不止一次拯救了我!而且我在上面这个链接中包含的增量备份和恢复过程也相当快。但是,您应该不时进行完整备份,因为您当前的增量可能会在您需要时无法工作,因为系统缺陷被写入其中,从而损坏了它。我现在尝试每周进行一次完整备份。

相关内容