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
в вашем сценарии. Он примет те же параметры командной строки.