使用 xorriso 为 ISO 和 EFI 分区提供不同的卷标?

使用 xorriso 为 ISO 和 EFI 分区提供不同的卷标?

我正在尝试使用 xorriso 构建一个 ISO,并使用预先创建的 EFI 映像(由mkdosfs未提供卷名创建的)控制启动,该映像可以 dd'd 到 USB 介质上并保持可启动。这通常效果很好:

xorriso \
  -volid "FooInstall" \
  -map /path/to/content \
  -boot_image any efi_path='/efi.img' \
  -boot_image any platform_id=0xef \
  -boot_image any efi_boot_part=--efi-boot-image \
  -boot_image any partition_table=on \
  -end

但是,当我这样做时,稳定/dev/disk/by-*/目录(除了by-path,这取决于媒体的插入方式并且本质上不稳定;以及by-id带有 USB 设备供应商名称的条目)没有任何指向 ISO9660 文件系统本身的链接,但仅限于它包含的 GPT 分区表中的条目:

# stat -c'%N' /dev/disk/by-*/* | grep sdc | grep -Ev '[/]by-(id|path)[/]'     # comments
'/dev/disk/by-label/FooInstall' -> '../../sdc2'                               # EFI
'/dev/disk/by-partlabel/EFI\x20boot\x20partition' -> '../../sdc2'             # EFI
'/dev/disk/by-partlabel/Gap0' -> '../../sdc1'                                 # Gap0
'/dev/disk/by-partlabel/Gap1' -> '../../sdc3'                                 # Gap1
'/dev/disk/by-partuuid/30373931-3130-4130-b031-303030303031' -> '../../sdc1'  # Gap0
'/dev/disk/by-partuuid/30373931-3130-4130-b032-303030303031' -> '../../sdc2'  # EFI
'/dev/disk/by-partuuid/30373931-3130-4130-b033-303030303031' -> '../../sdc3'  # Gap1
'/dev/disk/by-uuid/0000-0001' -> '../../sdc2'                                 # EFI
'/dev/disk/by-uuid/1970-01-01-00-00-01-00' -> '../../sdc3'                    # Gap1

...所以/dev/disk/by-label/FooInstall最终成为最终Gap1分区或映像上 EFI 分区的符号链接(这似乎不稳定),而不是 ISO 本身的符号链接。

同样,如果我分配一个显式的 UUID,则关联的/dev/disk/by-uuid 最终作为分区的链接Gap1,而不是原始设备(及其有效的 iso9660 文件系统)。

如何获得到 ISO9660 文件系统本身的稳定链接(在上面的示例中),而/dev/sdc该链接最终不能引用 EFI 映像或Gap填充分区之一?

答案1

您遇到的实际上是 udev 文件 60-persistent-storage.rules 中的一个错误,现在应该由 https://github.com/dsd/systemd/commit/dd1afeea4ed9b60b8a4d8b2a6d211f919cb5202e 讨论于 https://github.com/systemd/systemd/issues/14408

在不修复规则文件的情况下,任何没有标签的分区(例如,因为它没有文件系统)可以窃取基本设备中的文件系统的标签。因此,您的 EFI 分区映像需要一个 LABEL,并且除了可安装的 ISO 分区之外不应存在其他分区。


好吧,您已经找到了解决方法。所以以下内容更多的是针对档案:

您可以通过将 EFI 文件系统映像附加为分区而不是将 ISO 中的文件标记为分区来获得仅包含可安装分区的分区表。

-  -boot_image any efi_boot_part=--efi-boot-image \
-  -boot_image any partition_table=on \
+  -append_partition 2 0xef /...path.on.disk.../efi.img \

如果您想要 GPT 而不是 MBR,请添加:

-boot_image any appended_part_as=gpt \
-boot_image any partition_offset=16 \
-padding 0 \
-compliance no_emul_toc \

如果您想省略 ISO 9660 文件系统中的 efi.img:

-   -boot_image any efi_path='/efi.img'
-   -boot_image any platform_id=0xef \
    -append_partition 2 0xef /u/FERTIG/SX \
+   -boot_image any cat_path=/boot.cat \
+   -boot_image any efi_path='--interval:appended_partition_2:all::' \
+   -boot_image any platform_id=0xef \

(对 cat_path=/boot.cat 的需求源于我现在发现的 xorriso bug。目录路径中必须有一个“/”,如果未设置 cat_path= 并且没有“/”,xorriso 就会出错“在 efi_path= 中。)

答案2

使用 MBR 代替 GPT 似乎是获得这种可寻址性的唯一可靠方法。

xorriso \
  -volid "FooInstall" \
  -map /path/to/content \
  -boot_image any appended_part_as=mbr \
  -boot_image any partition_offset=16 \
  -boot_image any partition_table=on \
  -boot_image any efi_path='/efi.img' \
  -boot_image any platform_id=0xef \
  -boot_image any iso_mbr_part_type=0x83 \
  -boot_image any next \
  -append_partition 2 0xef "/path/to/content/efi.img" \
  -boot_image any efi_path=--interval:appended_partition_2:all:: \
  -end

...并且还添加-n OTHERNAMEmkdosfs命令行以消除 ISO 卷名称的歧义,从而导致为其/dev/disk/by-label/FooInstall创建指向 ISO 的链接。

相关内容