genisoimage и UEFI

Как я могу создать образ UEFI ISO на компьютере Debian Jessie?

Когда я использую команду Follow на моем Kubuntu, все в порядке

genisoimage -quiet -V "my-amd64" -J -R -r -l -cache-inodes -c isolinux/boot.cat  -b isolinux/isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table -eltorito-alt-boot -e boot/grub/efi.img -no-emul-boot -o my-amd64.iso my-amd64/

isohybrid --uefi my-amd64.iso

Но когда я запускаю эту команду в Debian Jessie, я получаю сообщение об ошибке:

genisoimage: option '-e' is ambiguous; possibilities: '--eltorito-boot' '--exchange' '--ethershare' '--exclude-list' '--exclude' '--eltorito-catalog' '--eltorito-alt-boot'
Usage: genisoimage [options] -o file directory ...

Похоже, гениальное изображение на Kubuntu (15.04) и Debian Jessie не имеет таких же опций. На Debian Genisomage не поддерживает UEFI.

Версия в обеих системах одинакова:genisoimage 1.1.11

Но я должен создать образ ISO на Debian Jessie. Любой обходной путь для этого?

4 ответа

Во-первых, мне не удалось создать загрузочный EFI-образ Debian AMD64, который можно было бы загрузить в любой ситуации (на DVD, на USB-накопителе или...).

Но поскольку я хотел добиться успеха, я вернулся к основам и нашел инструкции по перепаковке ISO-образа Debian с его оригинальным загрузочным оборудованием.

Адаптировав содержимое к ISO 2023 года, я смог написать и успешно протестировать следующую процедуру.

Для примера я изменю стабильный ISO Debian 11.6 AMD64. Я добавлю в него/firmwareкаталог всех прошивок, которые вы можете найти на компьютере Debian в/usr/lib/firmwareпосле установки следующих трех пакетов Debian:firmware-linux firmware-linux-free firmware-linux-nonfree:

      sudo apt install firmware-linux firmware-linux-free firmware-linux-nonfree

А после еще для примера перепакую ISO, скопирую на флешку и успешно загрузлюсь в Legacy (MBR) и в режиме UEFI. Образ тоже работает при записи на DVD.

Сделать рутmkisoкаталог:

      mkdir /home/nba/mkiso
cd /home/nba/mkiso
wget https://cdimage.debian.org/debian-cd/current/amd64/iso-dvd/debian-11.6.0-amd64-DVD-1.iso

Извлечь исходный ISO:

      mkdir deb
sudo apt install xorriso
xorriso -osirrox on -indev deb11.6-nba-amd64.iso -extract / ./deb

или

      sudo apt install bsdtar
bsdtar -C ./deb -xf debian-11.6.0-amd64-DVD-1.iso

Добавить файлы/прошивку. Хотим добавить прошивку в ISO-образ:

      sudo apt install firmware-linux firmware-linux-free firmware-linux-nonfree

mkdir -p /home/nba/mkiso/fw
cp -rf /usr/lib/firmware /home/nba/mkiso/fw/

Извлеките команду сборки xorriso из исходного ISO:

      cat deb/.disk/mkisofs


xorriso -as mkisofs -r -checksum_algorithm_iso sha256,sha512 -V 'Debian 11.6.0 amd64 1' -o /srv/cdbuilder.debian.org/dst/deb-cd/out/3bullseyeamd64/debian-11.6.0-amd64-DVD-1.iso -checksum-list /srv/cdbuilder.debian.org/src/deb-cd/tmp/3bullseyeamd64/bullseye/checksum-check -jigdo-checksum-algorithm md5 -jigdo-force-checksum /pool/ -jigdo-min-file-size 1024 -jigdo-exclude 'README*' -jigdo-exclude /doc/ -jigdo-exclude /md5sum.txt -jigdo-exclude /.disk/ -jigdo-exclude /pics/ -jigdo-exclude 'Release*' -jigdo-exclude 'Packages*' -jigdo-exclude 'Sources*' -jigdo-jigdo /srv/cdbuilder.debian.org/dst/deb-cd/out/3bullseyeamd64/debian-11.6.0-amd64-DVD-1.jigdo -jigdo-template /srv/cdbuilder.debian.org/dst/deb-cd/out/3bullseyeamd64/debian-11.6.0-amd64-DVD-1.template -jigdo-map Debian=/srv/cdbuilder.debian.org/src/ftp/debian/ -jigdo-exclude boot1 -J -joliet-long -cache-inodes -isohybrid-mbr syslinux/usr/lib/ISOLINUX/isohdpfx.bin -b isolinux/isolinux.bin -c isolinux/boot.cat -boot-load-size 4 -boot-info-table -no-emul-boot -eltorito-alt-boot -e boot/grub/efi.img -no-emul-boot -isohybrid-gpt-basdat -isohybrid-apm-hfsplus boot1 CD1

Измените команду сборки xorriso (удалите параметры -jidgo + соответствующую контрольную сумму...):


Создайте MBR, извлекая первые 432 байта из исходного ISO:

      cd /home/nba/mkiso
dd if=debian-11.6.0-amd64-DVD-1.iso of=isohdpfx.bin bs=1 count=432 

Собрать новый iso (добавивdeb/иfw/firmwareк ИСО):

      xorriso -as mkisofs -r -V 'deb11.6-nba-amd64' -o ./deb11.6-nba-amd64.iso -J -joliet-long -cache-inodes -isohybrid-mbr ./isohdpfx.bin -b isolinux/isolinux.bin -c isolinux/boot.cat -boot-load-size 4 -boot-info-table -no-emul-boot -eltorito-alt-boot -e boot/grub/efi.img -no-emul-boot -isohybrid-gpt-basdat -isohybrid-apm-hfsplus deb fw

Проверьте, извлекая только что созданный ISO:

      mkdir /home/nba/mkiso/deb2
cd /home/nba/mkiso/
xorriso -osirrox on -indev deb11.6-nba-amd64.iso -extract / deb2

Убедитесь, что прошивка присутствует в/home/nba/mkiso/deb2/firmware:

      ls /home/nba/mkiso/deb2/firmware

Тестовая загрузка: используйтеxorriso -report_system_areaварианты исходного ISO и нового ISO и сравните:

      xorriso -indev debian-11.6.0-amd64-DVD-1.iso -report_system_area as_mkisofs
xorriso -indev deb11.6-nba-amd64.iso -report_system_area as_mkisofs

Убедитесь, что у вас есть строка:

      -isohybrid-mbr --interval:local_fs:0s-15s:zero_mbrpt,zero_gpt,zero_apm:'deb11.6-nba-amd64.iso'

и строки:

      -eltorito-alt-boot
-e '/boot/grub/efi.img'
-no-emul-boot

Скопируйте на USB-накопитель и попробуйте загрузиться:

      sudo dd if=deb11.6-nba-amd64.iso of=/dev/sda bs=256M status=progress

Перезагрузка по ключу!

Пожалуйста, обрати внимание :

  • Он загружается с USB-накопителя
  • Это работает, когда dd копирует на жесткий диск и пытается загрузиться с этого диска.
  • Я также записал ISO на DVD, и он тоже был загрузочным.
  • Я также пытаюсь загрузиться с ISO-файла напрямую из гипервизора, и все получилось - работает и загружается

Все это означает, что мой перепакованный ISO-образ был загрузочным в любой ситуации (MBR и UEFI на всех поддержках), как и исходный ISO-образ Debian.

Видимо произошли несовместимые изменения в Mondo или genisoimage. О проблеме сообщили, но предоставленный обходной путь обертки был немного искажен вики. Использование обертки решает проблему для всего, в зависимости от этого синтаксиса.

Вот что я сделал:

Подготовьте упаковщик:

mv /usr/bin/genisoimage /usr/bin/genisoimage.dist
YourFavoriteTextEditor /usr/bin/genisoimage

Скопируйте / вставьте упаковщик:

#!/bin/bash

options=() # the buffer array for the parameters

while [[ $1 ]]
do
  case "$1" in
   -e)
     options+=("--eltorito-boot")
     shift
     ;;
   *)
     options+=("$1")
     shift
     ;;
  esac
done

echo Calling genisoimage.dist "${options[@]}"
eval exec /usr/bin/genisoimage.dist "${options[@]}"

Сделать упаковщик исполняемым:

chmod 755 /usr/bin/genisoimage

Жить долго и счастливо.:-)

Если вы выполните apt source genisoimage на машине с Ubuntu и посмотрите в diff, вы обнаружите, что к cdrk it добавлен значительный набор патчей, чтобы получить эту возможность. Вы можете попытаться зарегистрировать изменения. Или вы можете использовать xorriso, который, кажется, имеет такую ​​возможность, если у вас установлены syslinux-utils для файлов. Команда будет тогда.

xorriso -as mkisofs \
  -o <output> \
  -isohybrid-mbr /usr/lib/syslinux/isohdpfx.bin \
  -c isolinux/boot.cat \
  -b isolinux/isolinux.bin \
   -no-emul-boot -boot-load-size 4 -boot-info-table \
  -eltorito-alt-boot \
  -e isolinux/efiboot.img \
   -no-emul-boot \
   -isohybrid-gpt-basdat \
   -r -J \
   <CD_root>

Вы можете установить xorrisoи заменить genisoimageс xorrisofsв вашем сценарии. Он примет те же параметры командной строки.

Другие вопросы по тегам