Как переработать образ Ubuntu Live ISO, чтобы изменить grub.cfg для автоподстановки из локального cloud-init user-data

Вопрос или проблема

Я работаю на Intel и M1 Mac и запускаю Ubuntu Server в виртуальных машинах VMware Fusion. В настоящее время я использую последнюю версию 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. Поэтому я не могу создать загрузочный ISO после внесения изменений в grub.cfg.

Я собрал информацию из различных источников, начиная с этого: https://ubuntu.com/server/docs/install/autoinstall-quickstart, но не нашел или не понял достаточно, чтобы заполнить этот последний элемент головоломки для моей платформы arm64. Также я не смог использовать livefs-edit, потому что это зависит от ‘losetup’, который недоступен на macOS; однако xorriso полностью решить проблему на Intel, и я предполагаю, что… в значительной степени это решает ее на M1, если я смогу решить проблему с изображением загрузки.

Для amd64.iso это работает:

  1. Извлечь оригинальный ISO
  2. Создать файлы user-data и meta-data
  3. Переписать grub.cfg, чтобы добавить элемент меню autoinstall
  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}

Обновление
Используя советы Томаса Шмитта, я запросил предложение и исправил его следующим образом:

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, проект libburnia.
Текущий диск: -outdev 'stdio:ubuntu-autoinstall.iso'
Текущее средство: stdio файл, перезаписываемый
Состояние носителя : пусто
Резюме носителя: 0 сессий, 0 блоков данных, 0 данных, 1415g свободно
Добавлено в образ ISO: каталог "https://serverfault.com/"='/extracted-iso'
xorriso : ОБНОВЛЕНИЕ :     980 файлов добавлено за 1 секунду
xorriso : ОБНОВЛЕНИЕ :     980 файлов добавлено за 1 секунду
xorriso : ЗАМЕТКА : Копирование в системную область: 32768 байт из файла '--interval:local_fs:0s-15s:zero_mbrpt:ubuntu-23.10-live-server-amd64.iso'
libisofs: ЗАМЕТКА : Автоматически скорректирована геометрия MBR до 1020/159/32
xorriso : ОБНОВЛЕНИЕ :  3.18% завершено
xorriso : ОБНОВЛЕНИЕ :  54.15% завершено
xorriso : ОБНОВЛЕНИЕ :  87.88% завершено
Образ ISO создан: 1300424 сектора
Записано на носитель : 1300424 сектора на LBA 0
Запись в 'stdio:ubuntu-autoinstall.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? Просто спекулирую о вещах, с которыми я не очень знаком, пока ищу больше информации.

Решено благодаря помощи Томаса Шмитта. Следующими шагами будет замена ORIGINAL_EXTRACTED_ISO_DIR на исправленную цель, новые cloud-init user-data, grub.cfg и т.д.

case "$ARCHITECTURE" in
    "m1")
        echo "Запуск на 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 "Запуск на 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 "Неподдерживаемая архитектура: $ARCHITECTURE"
        exit 1
        ;;
esac

спасибо за использование xorriso. 🙂

/boot/grub/i386-pc/eltorito.img предназначен для x86 устаревшего BIOS PC. Его нет необходимости
в ISO для arm64. То же самое относится и к MBR GRUB2.
EFI-файлы довольно схожи для всех трех архитектур.

Запрос xorriso на предложение по воссозданию загрузочного оборудования
оригинального ISO:

$ 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 в данном случае не так уж и необходима. Она предлагается, потому что
существует таблица разделов. Ее действие переопределяется созданием новой
таблицы разделов.
Опцию -boot-load-size следует пропустить, если есть риск, что размер
EFI-раздела изменился.

Кстати, как вы выбираете подписанные EFI-программы? Мой iso загружается только при отключении безопасной загрузки.

Моя команда выглядит так:

- name: "Создание образа ISO для LiveCD"
  command: >
    xorriso -as mkisofs
      -allow-lowercase
      -joliet
      -joliet-long
      -disable-deep-relocation
      -rock
      -appid "{{ debootstrap['resec']['info'] }}"
      -volid "{{ debootstrap['resec']['info'] }}"
      --boot-catalog-hide
      -partition_offset LBA
      --grub2-mbr /usr/lib/grub/i386-pc/boot_hybrid.img
      --mbr-force-bootable
      --protective-msdos-label
      -eltorito-boot boot/grub/i386-pc/eltorito.img
        -no-emul-boot
        -boot-load-size 4
        -boot-info-table
        --grub2-boot-info
      -eltorito-alt-boot
        -e boot/grub/efi.img
        -no-emul-boot
        -isohybrid-gpt-basdat
      -o {{ image_path|default('/tmp') }}/{{ debootstrap['image_prefix'] }}-{{ debootstrap['distro'] }}-{{ debootstrap['arch'] }}-remix.iso
    .
  args:
    chdir: "{{ debootstrap['paths']['casper'] }}"
    creates: "{{ image_path|default('/tmp') }}/{{ debootstrap['image_prefix'] }}-{{ debootstrap['distro'] }}-{{ debootstrap['arch'] }}-remix.iso"

(Это из ansible, которая готовит изображение)

Ответ или решение

Чтобы ремастеринговить образ ISO Ubuntu и изменить grub.cfg для автоматической установки с локального cloud-init user-data, выполняйте следующие шаги. Этот процесс был протестирован как на Intel, так и на M1 (ARM64) системах.

Шаги для ремастерирования ISO

  1. Извлечение исходного ISO
    Используйте следующую команду для извлечения содержимого оригинального ISO-образа:

    mkdir extracted-iso
    xorriso -indev ubuntu-23.10-live-server-amd64.iso -extract / extracted-iso/
  2. Создание файлов user-data и meta-data
    Создайте файлы user-data и meta-data в каталоге extracted-iso/nocloud/ и заполните их необходимыми параметрами автозаполнения для вашей настройки. Например:

    # user-data
    #cloud-config
    autoinstall:
     version: 1
     ...
    # meta-data
    instance-id: iid-123456
    local-hostname: my-vm
  3. Редактирование grub.cfg
    Откройте файл grub.cfg, который находится в extracted-iso/boot/grub/. Добавьте или измените необходимый элемент меню для автозагрузки:

    menuentry "Install Ubuntu" {
       set timeout=5
       linux /casper/vmlinuz --- quiet autoinstall user-data=nocloud;s=/dev/sr0
       initrd /casper/initrd
    }
  4. Репаковка ISO с xorriso
    Для Intel и ARM64 архитектур команды будут различаться. Используйте следующую команду, чтобы создать новый ISO-образ:

    Для Intel (amd64):

    xorriso -as mkisofs \
       --modification-date="2023101104561500" \
       --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:4156048d-4166115d::"${ORIGINAL_ISO_PATH}" \
       -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 \
       -eltorito-alt-boot \
       -e '--interval:appended_partition_2_start_1039012s_size_10068d:all::' \
       -no-emul-boot \
       -boot-load-size 10068 \
       -o ubuntu-autoinstall.iso \
       ${EXTRACTED_ISO_PATH}

    Для ARM64 (M1):

    xorriso -as mkisofs \
       --modification-date="2023101104561500" \
       -partition_cyl_align off \
       -partition_offset 16 \
       -append_partition 2 0xef --interval:local_fs:4030464d-4042271d::"${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_1007616s_size_11808d:all::' \
       -no-emul-boot \
       -boot-load-size 11808 \
       -o ubuntu-autoinstall.iso \
       ${EXTRACTED_ISO_PATH}/

Примечания:

  • Убедитесь, что xorriso установлен в вашей системе.
  • Замените ${ORIGINAL_ISO_PATH} и ${EXTRACTED_ISO_PATH} на соответствующие пути к вашим файлам ISO и извлеченным каталогам.
  • Для ARM64 образов не нужны файлы, относящиеся к i386 или x86 BIOS. Работа с EFI для ARM64 архитектуры требует только использования соответствующих EFI загрузчиков.

Дополнительные рекомендации

Если ваши устройства имеют включенный Secure Boot, это может вызывать проблемы с загрузкой. Возможно, вам придется отключить эту опцию для успешной работы с вашим пользовательским ISO.

В случае возникновения дополнительных вопросов или необходимости в доработке, пожалуйста, обращайтесь — будем рады помочь!

Оцените материал
Добавить комментарий

Капча загружается...