xorriso를 사용하여 ISO 및 EFI 파티션에 대해 서로 다른 볼륨 레이블을 제공하시겠습니까?

xorriso를 사용하여 ISO 및 EFI 파티션에 대해 서로 다른 볼륨 레이블을 제공하시겠습니까?

mkdosfsxorriso를 사용하여 USB 미디어에 추가하고 부팅 가능한 상태로 유지할 수 있는 미리 생성된 EFI 이미지(제공된 볼륨 이름 없이 생성됨) 를 사용하여 ISO를 빌드하고 부팅을 제어하려고 합니다 . 이것은 일반적으로 잘 작동합니다.

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-*/다르며 본질적으로 불안정하며 USB 장치 공급업체 이름이 포함된 항목)에는 ISO9660 파일 시스템 자체에 대한 링크가 없지만 GPT 파티션 테이블의 항목만 포함합니다.by-pathby-id

# 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

...그래서 결국 ISO 자체에 대한 심볼릭 링크가 아니라 최종 파티션 또는 이미지(불안정해 보이는)의 EFI 파티션에 대한 심볼릭 링크 /dev/disk/by-label/FooInstall가 됩니다 .Gap1

마찬가지로 명시적인 UUID를 할당하면 관련/dev/disk/by-uuid 반품Gap1원시 장치(및 유효한 iso9660 파일 시스템)가 아닌 파티션에 대한 링크로 종료됩니다 .

/dev/sdc궁극적으로 EFI 이미지나 Gap채워진 파티션 중 하나를 참조할 수 없는 ISO9660 파일 시스템 자체(위의 예)에 대한 안정적인 링크를 얻으려면 어떻게 해야 합니까 ?

답변1

당신이 겪고 있는 것은 실제로 udev 파일 60-pertant-storage.rules의 버그입니다. https://github.com/dsd/systemd/commit/dd1afeea4ed9b60b8a4d8b2a6d211f919cb5202e 에서 논의됨 https://github.com/systemd/systemd/issues/14408

규칙 파일을 복구하지 않으면 레이블이 없는 파티션(예: 파일 시스템이 없기 때문에)은 기본 장치에 있는 파일 시스템의 레이블을 훔칠 수 있습니다. 따라서 EFI 파티션 이미지에는 LABEL이 필요하며 마운트 가능한 ISO 파티션 이외의 파티션이 없어야 합니다.


글쎄, 당신은 해결책을 찾았습니다. 따라서 다음은 아카이브에 대한 것입니다.

ISO의 파일을 파티션으로 표시하는 대신 EFI 파일 시스템 이미지를 파티션으로 연결하면 탑재 가능한 파티션만 포함된 파티션 테이블을 얻을 수 있습니다.

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

MBR 대신 GPT를 원하는 경우 다음을 추가하세요.

-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=. )

답변2

GPT 대신 MBR을 사용하는 것이 이러한 주소 지정 가능성을 달성하는 유일하고 안정적인 방법인 것 같습니다.

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

...또한 ISO 볼륨 이름을 명확하게 하기 위해 명령줄 -n OTHERNAME에 추가되어 해당 ISO에 대한 링크가 생성됩니다.mkdosfs/dev/disk/by-label/FooInstall

관련 정보