genisoimage and UEFI



如何在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映像。有什么解决办法吗?

显然在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

从此幸福地生活在一起。: -)

首先,我没有成功地构建一个可以在任何情况下(在DVD或u盘上或…)都可以启动的Debian的EFI AMD64映像。

但是因为我想成功,我回到了基础,我找到了重新包装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

验证您有line:

-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 key并尝试启动:

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

按键重启

请注意:

  • 在u盘上启动
  • 当dd拷贝到硬盘驱动器上并尝试在此驱动器上启动时它可以工作
  • 我也在DVD上刻录了ISO,它也是可引导的
  • 我也尝试直接从虚拟机管理程序启动ISO文件,它正在工作并启动

我重新包装的ISO映像在任何情况下都可以启动(所有支持的MBR和UEFI),就像原始的Debian ISO映像一样。

如果您在Ubuntu机器上执行apt源代码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>

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

相关内容

  • 没有找到相关文章

最新更新