Iso

使用 xorriso 的 ISO 和 EFI 分區的不同卷標?

  • November 7, 2020

我正在嘗試使用 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填充分區之一?

您遇到的實際上是 udev 文件 60-persistent-storage.rules 中的一個錯誤,現在應該由

https://github.com/dsd/systemd/commit/dd1afeea4ed9b60b8a4d8b2a6d211f919cb5202e 修復https://github.com/系統/系統/問題/14408

在不修復規則文件的情況下,任何沒有 LABEL 的分區,例如因為它沒有文件系統,都可以竊取基本設備中文件系統的 LABEL。因此,您的 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 錯誤。目錄路徑中必須有一個“/”,如果 cat_path= 未設置且沒有“/”,xorriso 會出錯" 在 efi_path=.)

引用自:https://unix.stackexchange.com/questions/618410