无法启动 Pop-OS:无法打开 \EFI\BOOT\mm64.efi

无法启动 Pop-OS:无法打开 \EFI\BOOT\mm64.efi

我一直在尝试安装 Pop-OS 20.10,但无法从此处的 USB 映像启动:https://pop.system76.com/。我从 UEFI 收到的错误消息是:

Failed to open \EFI\BOOT\mmx64.efi - Not Found
Failed to load image \EFI\BOOT\mmx64.efi: Not Found
Failed to start MokManager: Not Fond
Something has gone seriously wrong: import_mok_state() failed

askubuntu.com 中之前有一个帖子尝试解决此问题,https://askubuntu.com/questions/1085550/cant-install-ubuntu-18-10-on-xps-15-efi-boot-mmx64-efi-not-found。然而,那里的解决方案并不令人满意。他们都建议将 grubx64.efi 重命名或复制到 .iso 的 efi/boot 目录中的 mmx64.efi 文件;由于 .iso 文件是只读的,我无法执行此操作。

该机器是 Thinkpad T570,我在其主 NVMe 驱动器上安装了 Windows 10,在 WiFi 插槽 SSD 上安装了 Arch。

答案1

一个ISO9660 文件系统当然是只读的,是的。

但已混合用于 USB 使用的 UEFI 可启动 ISO 映像则不然只是ISO9660 文件系统:它还应该包含嵌入的辅助启动映像和嵌入的分区表,使其看起来像具有多个分区的 HDD 映像,而不仅仅是单个 ISO9660 文件系统。

常规的不可启动 ISO 映像可以通过以下file命令轻松识别:

# file virtio-win-0.1.102.iso 
virtio-win-0.1.102.iso: ISO 9660 CD-ROM filesystem data 'virtio-win-0.1.102'

但对 Pop_OS ISO 映像执行此操作,您将得到完全不同的结果:

# file pop-os_20.10_amd64_intel_18.iso 
pop-os_20.10_amd64_intel_18.iso: DOS/MBR boot sector; partition 2 : ID=0xef, start-CHS (0x3ff,254,63), end-CHS (0x3ff,254,63), startsector 484, 8192 sectors

它似乎包含一个分区表。要使用该分区表,您可以使用losetup -P

# losetup -P /dev/loop0 pop-os_20.10_amd64_intel_18.iso
# ls -l /dev/loop0*
brw-rw---- 1 root disk   7, 0 Jun 27 23:10 /dev/loop0
brw-rw---- 1 root disk 259, 6 Jun 27 23:10 /dev/loop0p1
brw-rw---- 1 root disk 259, 7 Jun 27 23:10 /dev/loop0p2

# fdisk -l /dev/loop0
Disk /dev/loop0: 2.4 GiB, 2516582400 bytes, 4915200 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: 0x3c3f6082

Device       Boot Start     End Sectors  Size Id Type
/dev/loop0p1 *        0 4915199 4915200  2.4G  0 Empty
/dev/loop0p2        484    8675    8192    4M ef EFI (FAT-12/16/32)

第一个分区的类型 ID 注册为 ,0因为 ISO9660 文件系统没有标准 MBR 分区类型值。第一个分区包含此 ISO 混合映像的主要 ISO9660 内容。但里面嵌入了另一个小隔断。

请注意,第一个分区根据 MBR 是可引导的,因此它很可能包含与 BIOS 兼容的引导扇区:

# file -s /dev/loop0p1
/dev/loop0p1: DOS/MBR boot sector; partition 2 : ID=0xef, start-CHS (0x3ff,254,63), end-CHS (0x3ff,254,63), startsector 484, 8192 sectors

另一方面,UEFI 并不关心 MBR 样式的引导标志。如果磁盘是 MBR 分区的,UEFI 希望看到具有特殊类型 ID 的 FAT 分区0xef来指示 EFI 系统分区。这正是第二个分区。

# file -s /dev/loop0p2
/dev/loop0p2: DOS/MBR boot sector, code offset 0x3c+2, OEM-ID "mkfs.fat", sectors/cluster 4, root entries 512, sectors 8192 (volumes <=32 MB), Media descriptor 0xf8, sectors/FAT 6, sectors/track 32, heads 64, serial number 0x80bb708e, unlabeled, FAT (12 bit)

您甚至可以挂载它并看到 Linux 会将其识别为vfat文件系统类型(其中包括除 ExFAT 之外的所有 FAT 变体)。并且它可以安装为可写:

# mount /dev/loop0p2 /mnt
# grep /mnt /proc/mounts
/dev/loop0p2 /mnt vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro 0 0

# tree /mnt
/mnt
└── efi
    └── boot
        ├── bootx64.efi
        └── grubx64.efi

# df -h /mnt
Filesystem      Size  Used Avail Use% Mounted on
/dev/loop0p2    4.0M  2.7M  1.4M  67% /mnt

这里,bootx64.efi实际上是 Secure Boot shimx64.efi,已重命名以匹配特殊的 UEFI 可移动媒体/后备引导加载程序文件名。并且grubx64.efi是 GRUB 的 UEFI 版本,所有模块均内置并使用证书签名,该证书的公共部分嵌入在 shim 中以满足安全启动要求。

该文件mmx64.efi应该非常适合该 FAT 文件系统中的 1.4M 可用空间。或者,如果您已禁用安全启动,则可以执行以下操作mv grubx64.efi bootx64.efi来消除安全启动垫片(这是需要的mmx64.efi)并直接启动到 UEFI 版本的 GRUB。

相关内容