我一直在尝试安装 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。