genisoimage 和 UEFI

问题描述 投票:0回答:5

如何在 Debian Jessie 机器上创建 UEFI ISO 映像?

当我在 Kubuntu 上使用 follow 命令时,一切正常

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 上的 genisoimage 似乎没有相同的选项。在 Debian 上 genisomage 不支持 UEFI。

两个系统上的版本相同: genisoimage 1.1.11

但是我必须在 Debian Jessie 上创建 ISO 映像。有什么解决办法吗?

debian ubuntu uefi iso-image
5个回答
3
投票

显然 Mondo 或 genisoimage 中存在不兼容的更改。 问题已报告,但所提供的包装器解决方法被 wiki 弄乱了。 使用包装器可以解决所有问题,具体取决于该语法。

这就是我所做的:

准备包装纸:

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

从此过上幸福的生活。 :-)


3
投票

首先,我没有成功构建 Debian 的 EFI 可启动 AMD64 映像,该映像在任何情况下都可启动(在 DVD 或 USB 记忆棒上或......)。

但是当我想要成功时,我确实回到了基础知识,并且我找到了使用其原始引导设备重新打包 Debian ISO 的说明

将内容调整为 2023 年的 ISO,我能够编写并成功测试以下过程。

例如,我将修改Debian 11.6 AMD64稳定ISO。安装以下 3 个 Debian 软件包后,我将在其

/firmware
目录中添加您可以在
/usr/lib/firmware
中的 Debian 计算机上找到的所有固件:
firmware-linux
firmware-linux-free
firmware-linux-nonfree
:

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

仍然是示例,我将重新打包 ISO,将其复制到 USB 闪存盘上,并在传统 (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/

从源 ISO 中提取 xorriso 构建命令:

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选项+相关校验和...):

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 中提取前 432 字节来生成 MBR:

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
添加到 ISO):

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

测试启动:在源 ISO 和新 ISO 上使用

xorriso -report_system_area
选项并进行比较:

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),就像原始的 Debian ISO 映像一样。


1
投票

如果您在 Ubuntu 计算机上执行 apt source genisoimage 并查看差异,您会发现他们在 cdrkit 中添加了重要的补丁集以获得此功能。您可以尝试向后移植更改。或者您可以使用 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>

1
投票

您可以安装

xorriso
并在脚本中将
genisoimage
替换为
xorrisofs
。它将接受相同的命令行参数。


0
投票

问题: genisoimage:无法识别的选项“-efi-boot”

解决方法如下: apt安装xorriso mv /usr/bin/genisoimage /usr/bin/genisoimage.bak ln -s /usr/bin/xorrisofs /usr/bin/genisoimage

© www.soinside.com 2019 - 2024. All rights reserved.