Como remasterizar um Ubuntu Live ISO para revisar o grub.cfg para instalação automática a partir de dados de usuário locais do cloud-init

Como remasterizar um Ubuntu Live ISO para revisar o grub.cfg para instalação automática a partir de dados de usuário locais do cloud-init

Estou trabalhando em Macs Intel e M1 e executando o Ubuntu Server em VMs VMWare Fusion. Atualmente estou usando o ubuntu-23.10-live-server-amd64.iso e o ubuntu-23.10-live-server-arm64.iso mais recentes. Posso fazer com que tudo funcione conforme necessário para sistemas baseados em Intel, mas ao usar arm64.iso, ele não contém um /boot.cataloge /boot/grub/i386-pc/eltorito.img. Portanto, não consigo recriar um ISO inicializável após minhas revisões do grub.cfg.

Reuni informações de várias fontes, começando aqui:https://ubuntu.com/server/docs/install/autoinstall-quickstart, mas não encontrei ou entendi o suficiente para preencher esta última peça do quebra-cabeça da minha plataforma arm64. Além disso, não consegui usar o livefs-edit porque depende de 'losetup', que não está disponível no macOS; entretanto, o xorriso resolveu o problema 100% na Intel e imagino... resolve principalmente nos M1s se eu conseguir resolver o problema da imagem de inicialização.

Para amd64.iso isso funciona:

  1. Extraia o ISO original
  2. Crie arquivos de dados do usuário e metadados
  3. Revise o grub.cfg para adicionar um item de menu de instalação automática
  4. Reempacote o ISO com o seguinte:
    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}

Atualizar Seguindo o conselho de Thomas Schmitt, consultei a proposta e revisei para usar:

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/

O resultado foi:

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.

A única diferença que posso ver ao inspecionar os ISOs extraídos do original, que é inicializável, e do novo, que não é: insira a descrição da imagem aqui

E tentar inicializar resulta nisso: insira a descrição da imagem aqui

Eu também tentei:

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/

Estou puxando meu cabelo e me agarrando a qualquer coisa. Muito disso eu não entendo completamente, mas posso ver que -cfoi colocado o catálogo de inicialização. Então, para aproximar o novo ISO do original, usei `c '/boot.catalog', o que agora me leva a uma diferença em um arquivo original, que se parece com isto: insira a descrição da imagem aqui

Suspeito que haja algo NÃO visível para mim, talvez no MBR real? Apenas especulando sobre coisas com as quais não estou muito familiarizado enquanto procuro mais informações.

Resolvidograças à ajuda de Thomas Shchmitt. As próximas etapas seriam substituir ORIGINAL_EXTRACTED_ISO_DIR por um destino revisado, novos dados do usuário cloud-init, grub.cfg, etc.

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

Responder1

obrigado por voar xorriso. :)

/boot/grub/i386-pc/eltorito.img é para PC-BIOS legado x86. Não há utilidade para isso em uma ISO para arm64. O mesmo se aplica ao MBR GRUB2. O material EFI é bastante semelhante para todas as três arquiteturas.

Pedindo ao xorriso uma proposta para recriar o equipamento de boot da ISO original:

$ 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

A opção -G não é realmente necessária neste caso. É proposto porque existe uma tabela de partições. Seu efeito é anulado pela criação do novo arquivo de partição. A opção -boot-load-size deve ser omitida se houver algum risco de alteração do tamanho da partição EFI.

informação relacionada