使用 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
填充分區之一?
您遇到的實際上是 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=.)