로컬 cloud-init 사용자 데이터에서 자동 설치되도록 grub.cfg를 수정하기 위해 Ubuntu Live ISO를 리마스터하는 방법

로컬 cloud-init 사용자 데이터에서 자동 설치되도록 grub.cfg를 수정하기 위해 Ubuntu Live ISO를 리마스터하는 방법

저는 Intel 및 M1 Mac에서 작업하고 있으며 VMWare Fusion VM에서 Ubuntu Server를 실행하고 있습니다. 현재 최신 ubuntu-23.10-live-server-amd64.iso 및 ubuntu-23.10-live-server-arm64.iso를 사용하고 있습니다. Intel 기반 시스템에 필요한 대로 모든 것이 작동하도록 할 수 있지만 arm64.iso를 사용할 때는 /boot.catalog및 가 포함되어 있지 않습니다 /boot/grub/i386-pc/eltorito.img. 따라서 grub.cfg를 수정한 후에는 부팅 가능한 ISO를 다시 생성할 수 없습니다.

여기에서 시작하여 다양한 출처에서 얻은 정보를 모아봤습니다.https://ubuntu.com/server/docs/install/autoinstall-quickstart, 그러나 내 arm64 플랫폼에 대한 퍼즐의 마지막 조각을 채울 만큼 충분히 찾지 못했거나 이해하지 못했습니다. 또한, macOS에서는 사용할 수 없는 'losetup'에 의존하기 때문에 livefs-edit를 사용할 수 없었습니다. 그러나 xorriso는 Intel에서 문제를 100% 해결했으며 부팅 이미지 문제를 해결할 수 있다면 대부분 M1에서 문제를 해결한다고 생각합니다.

amd64.iso의 경우 다음과 같이 작동합니다.

  1. 원본 ISO 추출
  2. 사용자 데이터 및 메타데이터 파일 생성
  3. 자동 설치 메뉴 항목을 추가하려면 grub.cfg를 수정하세요.
  4. 다음을 사용하여 ISO를 다시 패키징합니다.
    xorriso -as mkisofs \
    --modification-date='2021101314195100' \
    --grub2-mbr \
    --interval:local_fs:0s-15s:zero_mbrpt,zero_gpt:"${ORIGINAL_ISO_PATH}" \
    --protective-msdos-label \
    -partition_cyl_align off \
    -partition_offset 16 \
    --mbr-force-bootable \
    -append_partition 2 28732ac11ff8d211ba4b00a0c93ec93b \
    --interval:local_fs:2470124d-2478587d::"${ORIGINAL_ISO_PATH}" \
    -part_like_isohybrid \
    -iso_mbr_part_type a2a0d0ebe5b9334487c068b6b72699c7 \
    -c '/boot.catalog' \
    -b '/boot/grub/i386-pc/eltorito.img' \
    -no-emul-boot \
    -boot-load-size 4 \
    -boot-info-table \
    --grub2-boot-info \
    -eltorito-alt-boot -e \
    '--interval:appended_partition_2_start_617531s_size_8464d:all::' \
    -no-emul-boot \
    -boot-load-size 8464 \
    -isohybrid-gpt-basdat \
    -o ubuntu-autoinstall.iso \
    -V 'Ubuntu autoinstall' ${EXTRACTED_ISO_PATH}

업데이트 Thomas Schmitt의 조언을 사용하여 제안서를 쿼리하고 다음을 사용하도록 수정했습니다.

xorriso -as mkisofs \
--modification-date='2023101104561500' \
-partition_cyl_align off \
-partition_offset 16 \
-append_partition 2 0xef --interval:local_fs:4615776d-4629311d::"${ORIGINAL_ISO_PATH}" \
-G --interval:local_fs:0s-15s:zero_mbrpt:"${ORIGINAL_ISO_PATH}" \
-iso_mbr_part_type 0xcd \
-c '/boot/boot.cat' \
-e '--interval:appended_partition_2_start_1153944s_size_13536d:all::' \
-no-emul-boot \
-boot-load-size 13536 \
-output ubuntu-autoinstall.iso \
extracted-iso/

결과는 다음과 같습니다.

GNU xorriso 1.5.6 : RockRidge filesystem manipulator, libburnia project.
Drive current: -outdev 'stdio:ubuntu-autoinstall.iso'
Media current: stdio file, overwriteable
Media status : is blank
Media summary: 0 sessions, 0 data blocks, 0 data, 1415g free
Added to ISO image: directory '/'='/extracted-iso'
xorriso : UPDATE :     980 files added in 1 seconds
xorriso : UPDATE :     980 files added in 1 seconds
xorriso : NOTE : Copying to System Area: 32768 bytes from file '--interval:local_fs:0s-15s:zero_mbrpt:ubuntu-23.10-live-server-amd64.iso'
libisofs: NOTE : Automatically adjusted MBR geometry to 1020/159/32
xorriso : UPDATE :  3.18% done
xorriso : UPDATE :  54.15% done
xorriso : UPDATE :  87.88% done
ISO image produced: 1300424 sectors
Written to medium : 1300424 sectors at LBA 0
Writing to 'stdio:ubuntu-autoinstall.iso' completed successfully.

부팅 가능한 원본과 그렇지 않은 새 ISO의 추출된 ISO를 검사할 때 확인할 수 있는 유일한 차이점은 다음과 같습니다. 여기에 이미지 설명을 입력하세요

부팅을 시도하면 다음과 같은 결과가 발생합니다. 여기에 이미지 설명을 입력하세요

나는 또한 다음을 시도했습니다.

xorriso -as mkisofs \
--modification-date='2023101104561500' \
-partition_cyl_align off \
-partition_offset 16 \
-append_partition 2 0xef --interval:local_fs:4615776d-4629311d::"${ORIGINAL_ISO_PATH}" \
-iso_mbr_part_type 0xcd \
-c '/boot/boot.cat' \
-e '--interval:appended_partition_2_start_1153944s_size_13536d:all::' \
-no-emul-boot \
-output ubuntu-autoinstall.iso \
extracted-iso/

머리카락을 잡아당기고 빨대를 쥐고 ​​있어요. 이것의 대부분은 완전히 이해하지 못하지만 -c부트 카탈로그가 배치된 것을 볼 수 있습니다. 그래서 새 ISO를 원본에 더 가깝게 만들기 위해 `c '/boot.catalog'를 사용했는데, 이제 원본 파일에서 다음과 같은 한 가지 차이점을 알 수 있습니다. 여기에 이미지 설명을 입력하세요

아마도 실제 MBR에 나에게 보이지 않는 것이 있는 것 같습니다. 더 많은 정보를 검색하면서 잘 모르는 것에 대해 추측할 뿐입니다.

해결됨Thomas Shchmitt의 도움 덕분입니다. 다음 단계는 ORIGINAL_EXTRACTED_ISO_DIR을 수정된 대상, 새로운 cloud-init 사용자 데이터, grub.cfg 등으로 바꾸는 것입니다.

case "$ARCHITECTURE" in
    "m1")
        echo "Running on M1 Mac."
        xorriso -as mkisofs \
        --modification-date='2023081005071100' \
        -partition_cyl_align off \
        -partition_offset 16 \
        -append_partition 2 0xef --interval:local_fs:4030464d-4042271d::"${ORIGINAL_ISO_FILE}" \
        -G --interval:local_fs:0s-15s:zero_mbrpt:"${ORIGINAL_ISO_FILE}" \
        -iso_mbr_part_type 0xcd \
        -c '/boot/boot.cat' \
        -e '--interval:appended_partition_2_start_1007616s_size_11808d:all::' \
        -no-emul-boot \
        -boot-load-size 11808 \
        -output ${AUTOINSTALL_ISO_FILE} \
        ${ORIGINAL_EXTRACTED_ISO_DIR}/
        ;;
    "intel")
        echo "Running on Intel Mac."
        xorriso -as mkisofs \
        --modification-date='2023081005062500' \
        --grub2-mbr --interval:local_fs:0s-15s:zero_mbrpt,zero_gpt:"${ORIGINAL_ISO_FILE}" \
        --protective-msdos-label \
        -partition_cyl_align off \
        -partition_offset 16 \
        --mbr-force-bootable \
        -append_partition 2 28732ac11ff8d211ba4b00a0c93ec93b --interval:local_fs:4156048d-4166115d::"${ORIGINAL_ISO_FILE}" \
        -appended_part_as_gpt \
        -iso_mbr_part_type a2a0d0ebe5b9334487c068b6b72699c7 \
        -c '/boot.catalog' \
        -b '/boot/grub/i386-pc/eltorito.img' \
        -no-emul-boot \
        -boot-load-size 4 \
        -boot-info-table \
        --grub2-boot-info \
        -eltorito-alt-boot \
        -e '--interval:appended_partition_2_start_1039012s_size_10068d:all::' \
        -no-emul-boot \
        -boot-load-size 10068 \
        -output ${AUTOINSTALL_ISO_FILE} \
        ${ORIGINAL_EXTRACTED_ISO_DIR}/
        ;;
    *)
        echo "Unsupported architecture: $ARCHITECTURE"
        exit 1
        ;;
esac

답변1

xorriso를 이용해 주셔서 감사합니다. :)

/boot/grub/i386-pc/eltorito.img는 x86 레거시 PC-BIOS용입니다. arm64의 ISO에서는 사용되지 않습니다. GRUB2 MBR의 경우에도 마찬가지입니다. EFI 항목은 세 가지 아키텍처 모두에서 매우 유사합니다.

원래 ISO의 부팅 장비를 다시 만들기 위한 제안을 xorriso에 요청:

$ xorriso -indev ubuntu-23.10-live-server-arm64.iso -report_el_torito as_mkisofs
...
-V 'Ubuntu-Server 23.10 arm64'
--modification-date='2023101104561500'
-partition_cyl_align off
-partition_offset 16
-append_partition 2 0xef --interval:local_fs:4615776d-4629311d::'ubuntu-23.10-live-server-arm64.iso'
-G --interval:local_fs:0s-15s:zero_mbrpt:'ubuntu-23.10-live-server-arm64.iso'
-iso_mbr_part_type 0xcd
-c '/boot/boot.cat'
-e '--interval:appended_partition_2_start_1153944s_size_13536d:all::'
-no-emul-boot
-boot-load-size 13536

이 경우 -G 옵션은 실제로 필요하지 않습니다. 파티션 테이블이 있기 때문에 제안합니다. 새 파티션 테이블을 생성하면 해당 효과가 무시됩니다. EFI 파티션의 크기가 변경될 위험이 있는 경우 -boot-load-size 옵션을 생략해야 합니다.

관련 정보