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

Ell*_*iew 5 live-usb partitioning mbr fdisk gpt

问题和背景:

在发行版的 MBR 分区表中,例如 ubuntu-16.04-desktop-amd64.iso,为什么 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
Run Code Online (Sandbox Code Playgroud)

给出:

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.
Run Code Online (Sandbox Code Playgroud)

(要对此进行解码,请参阅https://en.wikipedia.org/wiki/Master_boot_record。)

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

  • 然后注意地址 01d2 处的“ef”,它表示 #2 主分区为 type=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
Run Code Online (Sandbox Code Playgroud)

尝试编辑分区表:

  • fdisk报告这些分区重叠。请注意 sdb2 [2927216] 的开头是如何在 sdb1 [0-2955679] 中的

    sudo fdisk -l /dev/sdb
    
    Run Code Online (Sandbox Code Playgroud)

    给出:

      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)
    
    Run Code Online (Sandbox Code Playgroud)
  • 从我读到的内容来看,可以有一个 GPT 分区,但不能让分区重叠。

  • 当我尝试将 iso 添加到 U 盘时,麻烦就开始了。棒启动 Ubuntu 可以正常运行,但是无论我尝试使用哪个分区编辑器,我都无法在没有错误的情况下编辑分区表(即未启动且未安装)。

  • 此外,如果没有以下冗长的过程,我什至无法删除分区表并将USB记忆棒恢复正常:

    dd if=/dev/zero of=/dev/sdb bs=[something like 512 or 2048; doesn't matter] count=[some large number like 100000^]
    
    Run Code Online (Sandbox Code Playgroud)

    ^较小的数字似乎并不总是能解决这个问题。我怀疑您不仅需要清除主要的 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.
    
    Run Code Online (Sandbox Code Playgroud)
  • 同样从 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.
    
    Run Code Online (Sandbox Code Playgroud)

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

顺便说一句,我不是在问如何解决重叠问题,因为这就是发行版的实际情况,而且从它的外观来看,已经有一段时间了(我还查看了 Ub-v16、14 和 12),相反,如果可能的话,我正在寻找如何编辑它。

想法:

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

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

  • 是否有不同的,可能是更旧的 Ubuntu 发行版没有这个问题?

Rod*_*ith 10

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

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

为了处理如此多的格式和启动方法,开发人员使用数据结构玩游戏。这些映像真的不应该被视为“普通”磁盘映像,特别是,除非您是这些数据结构的顶级专家,否则您最应该强调不要尝试以任何方式修改这些映像。FWIW,我编写了 GPT fdisk ( gdisk, cgdisk, and sgdisk) 分区工具,不会尝试您所说的尝试!

相反,如果您需要修改安装介质,您应该执行以下两项操作之一:

  • 使用RufusPen Drive LinuxUNetbootin等工具将映像文件写入 U 盘,然后修改 U 盘。这样做的原因是这些工具不会dd将图像内容简单地复制到磁盘;相反,他们从映像中获取文件并将它们复制到具有预先存在的文件系统(或者有时是该工具创建的文件系统)常规分区磁盘。结果是一个更普通的磁盘,可以使用普通的分区表编辑器和其他实用程序进行修改。
  • 准备您自己的自定义图像。我没有关于如何执行此操作的文档的指示,但是 Ubuntu 映像当然是由自动化工具创建的,而不是通过使用十六进制编辑器手动编辑分区表。如果您追踪用于创建图像的工具和脚本,您可能能够创建以您想要的方式修改的图像。这种方法由创建 Ubuntu 的“旋转”的人使用,因此您可能希望首先查找有关如何执行此操作的文档。

在这两种方法中,第一种可能是您想要的更好的方法。事实上,我很确定某些此类工具提供了一个选项,可以精确地执行您想要的操作。(不过,我不记得哪些工具提供了这样的功能。)第二种方法更有可能对诸如将包添加到自定义安装映像之类的任务有用。

如果您以前曾经能够做这种事情,那么它很可能已经改变了,因为开发人员发现需要对数据结构进行更可怕的黑客攻击,以便解决特定系统的问题。例如,如果 Brand X 的计算机无法解析 Frankenstein 的 Monster 分区表,开发人员可能会对其进行调整,使其适用于 Brand X 计算机,即使这意味着数据结构比以前更奇怪。不过,这只是我的猜测,我当然不能谈论你所描述的具体细节。


Ell*_*iew 1

解决方法

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

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


使用 USB 记忆棒进行备份的使用提示: 我保留了两个相同的 USB 备份操作系统记忆棒,用于备份我的主要 Debian 双引导 W10 系统。我希望我的系统在进行备份时不要运行。我还想要两个相同的 U 盘,因为有时 U 盘会磨损。这使我可以轻松地通过从剩余的好棍子到新棍子的 dd 副本来轻松制作新棍子。

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