问题和背景:
在发行版(例如 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(gdisk
、cgdisk
和sgdisk
)分区工具,并且我不会尝试你所说的你正在尝试的事情!
相反,如果您需要修改安装介质,您应该做以下两件事之一:
- 使用类似的工具鲁弗斯,笔式驱动器 Linux, 或者联合国网启动将映像文件写入 USB 闪存驱动器,然后修改 USB 闪存驱动器。此方法之所以有效,是因为这些工具不会执行简单的
dd
映像内容复制到磁盘;相反,它们会将文件从图像中复制到传统分区磁盘和预先存在的文件系统(有时是该工具创建的磁盘)。结果是一个更正常的磁盘,可以使用正常的分区表编辑器和其他实用程序进行修改。 - 准备您自己的自定义映像。我没有关于如何执行此操作的文档,但 Ubuntu 映像当然是由自动化工具创建的,而不是通过使用十六进制编辑器手动编辑分区表创建的。如果您跟踪用于创建映像的工具和脚本,您可能能够创建一个以您想要的方式修改的映像。创建 Ubuntu“旋转”的人使用这种方法,因此您可能希望首先查找有关如何执行此操作的文档。
在这两种方法中,第一种方法可能更适合你的需求。事实上,我很确定某些此类工具提供了精确执行所需操作的选项。(不过我不记得哪些工具提供了这样的功能。)第二种方法更适合将软件包添加到自定义安装映像等任务。
如果您以前能够做到这种事情,那么很有可能它已经发生了变化,因为开发人员发现需要对数据结构进行更可怕的破解,以解决特定系统的问题。例如,如果 X 品牌的计算机无法解析弗兰肯斯坦的怪物分区表,开发人员可能会对其进行调整,使其适用于 X 品牌的计算机,即使这意味着数据结构比以前更加奇怪。不过,这只是我的猜测,我当然无法谈论您所描述的具体情况。
答案2
解决方法
你能如果您不使用 USB 制作工具来创建 USB 棒,而是使用终端命令从头开始构建 USB 棒,则需要调整 USB 棒的分区大小。如果您的系统使用 BIOS,以下是有效的详细说明:
如何仅使用终端为 BIOS 创建具有持久性的实时 Ubuntu USB 驱动器
使用 USB 记忆棒备份的使用技巧: 我保留了两个相同的 USB 备份操作系统棒,用于备份我的主要 Debian 双启动 W10 系统。我希望在备份时我的系统不运行。我还想要两个相同的棒,因为有时 USB 棒会磨损。这样我就可以轻松地制作一个新的,只需将剩余的完好棒中的 dd 复制到新棒即可。
当我的系统损坏到无法修复时,它们不止一次拯救了我!而且我在上面这个链接中包含的增量备份和恢复过程也相当快。但是,您应该不时进行完整备份,因为您当前的增量可能会在您需要时无法工作,因为系统缺陷被写入其中,从而损坏了它。我现在尝试每周进行一次完整备份。