如何在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
。它将接受相同的命令行参数。