[ipxe-devel] [PATCH 1/1] allow to build ISO image with EFI support (ipxe.eiso)

Christian Hesse list at eworm.de
Wed Feb 24 08:21:55 UTC 2016


From: Christian Hesse <mail at eworm.de>

Signed-off-by: Christian Hesse <mail at eworm.de>
---
 src/arch/x86/Makefile.pcbios |  6 +++++
 src/util/geniso              | 52 ++++++++++++++++++++++++++++++++++----------
 2 files changed, 46 insertions(+), 12 deletions(-)

diff --git a/src/arch/x86/Makefile.pcbios b/src/arch/x86/Makefile.pcbios
index 18a6f75..9cb3e0b 100644
--- a/src/arch/x86/Makefile.pcbios
+++ b/src/arch/x86/Makefile.pcbios
@@ -82,6 +82,12 @@ NON_AUTO_MEDIA	+= iso
 	$(Q)ISOLINUX_BIN=$(ISOLINUX_BIN) LDLINUX_C32=$(LDLINUX_C32) \
 	    VERSION="$(VERSION)" bash util/geniso -o $@ $<
 
+# rule to make a non-emulation ISO boot image with EFI support
+NON_AUTO_MEDIA += eiso
+%eiso: %lkrn bin-i386-efi/ipxe.efi bin-x86_64-efi/ipxe.efi util/geniso
+	$(QM)$(ECHO) "  [GENISO] $@"
+	$(Q)ISOLINUX_BIN=$(ISOLINUX_BIN) VERSION="$(VERSION)" bash util/geniso -e -o $@ $<
+
 # rule to make a floppy emulation ISO boot image
 NON_AUTO_MEDIA	+= liso
 %liso:	%lkrn util/geniso
diff --git a/src/util/geniso b/src/util/geniso
index ff090d4..7694036 100755
--- a/src/util/geniso
+++ b/src/util/geniso
@@ -6,16 +6,21 @@ function help() {
 	echo "usage: ${0} [OPTIONS] foo.lkrn [bar.lkrn,...]"
 	echo
 	echo "where OPTIONS are:"
+	echo " -e       build image with EFI support"
 	echo " -h       show this help"
 	echo " -l       build legacy image with floppy emulation"
 	echo " -o FILE  save iso image to file"
 }
 
+EFI=0
 LEGACY=0
 FIRST=""
 
-while getopts "hlo:" opt; do
+while getopts "ehlo:" opt; do
 	case ${opt} in
+		e)
+			EFI=1
+			;;
 		h)
 			help
 			exit 0
@@ -37,17 +42,25 @@ if [ -z "${OUT}" ]; then
 	exit 1
 fi
 
-# There should either be mkisofs or the compatible genisoimage program
-for command in genisoimage mkisofs; do
-	if ${command} --version >/dev/null 2>/dev/null; then
-		mkisofs=(${command})
-		break
-	fi
-done
-
-if [ -z "${mkisofs}" ]; then
-	echo "${0}: mkisofs or genisoimage not found, please install or set PATH" >&2
+# We need xorriso (from libisoburn) for EFI support, so try that first.
+if xorriso --version >/dev/null 2>/dev/null; then
+	mkisofs=(xorriso -as mkisofs)
+elif [ ${EFI} -eq 1 ]; then
+	echo "${0}: xorriso not found, but required for EFI support. Please install." >&2
 	exit 1
+else
+	# fall back to mkisofs or the compatible genisoimage program
+	for command in genisoimage mkisofs; do
+		if ${command} --version >/dev/null 2>/dev/null; then
+			mkisofs=(${command})
+			break
+		fi
+	done
+
+	if [ -z "${mkisofs}" ]; then
+		echo "${0}: mkisofs or genisoimage not found, please install or set PATH" >&2
+		exit 1
+	fi
 fi
 
 dir=$(mktemp -d bin/iso.dir.XXXXXX)
@@ -122,13 +135,28 @@ case "${LEGACY}" in
 		# copy isolinux bootloader
 		cp ${ISOLINUX_BIN} ${dir}
 
+		mkisofs+=(-b isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table)
+
+		if [ "${EFI}" -eq 1 ]; then
+			# generate EFI image
+			img=${dir}/efiboot.img
+
+			mformat -f 2880 -C -i ${img} ::
+			mmd -i ${img} "::/EFI"
+			mmd -i ${img} "::/EFI/BOOT"
+			mcopy -m -i ${img} bin-x86_64-efi/ipxe.efi "::EFI/BOOT/BOOTX64.EFI"
+			mcopy -m -i ${img} bin-i386-efi/ipxe.efi "::EFI/BOOT/BOOTIA32.EFI"
+
+			mkisofs+=(-eltorito-alt-boot -e efiboot.img -isohybrid-gpt-basdat -no-emul-boot)
+		fi
+
 		# syslinux 6.x needs a file called ldlinux.c32
 		if [ -n "${LDLINUX_C32}" -a -s "${LDLINUX_C32}" ]; then
 			cp ${LDLINUX_C32} ${dir}
 		fi
 
 		# generate the iso image
-		"${mkisofs[@]}" -b isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table -output ${OUT} ${dir}
+		"${mkisofs[@]}" -output ${OUT} ${dir}
 
 		# isohybrid will be used if available
 		if isohybrid --version >/dev/null 2>/dev/null; then
-- 
2.7.1




More information about the ipxe-devel mailing list