我正在尝试使用 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 OTHERNAME
到mkdosfs
命令行以消除 ISO 卷名称的歧义,从而导致为其/dev/disk/by-label/FooInstall
创建指向 ISO 的链接。