diff options
| author | fishsoupisgood <github@madingley.org> | 2019-04-29 01:17:54 +0100 | 
|---|---|---|
| committer | fishsoupisgood <github@madingley.org> | 2019-05-27 03:43:43 +0100 | 
| commit | 3f2546b2ef55b661fd8dd69682b38992225e86f6 (patch) | |
| tree | 65ca85f13617aee1dce474596800950f266a456c /roms/ipxe/src/util/geniso | |
| download | qemu-master.tar.gz qemu-master.tar.bz2 qemu-master.zip | |
Diffstat (limited to 'roms/ipxe/src/util/geniso')
| -rwxr-xr-x | roms/ipxe/src/util/geniso | 142 | 
1 files changed, 142 insertions, 0 deletions
| diff --git a/roms/ipxe/src/util/geniso b/roms/ipxe/src/util/geniso new file mode 100755 index 00000000..521c929e --- /dev/null +++ b/roms/ipxe/src/util/geniso @@ -0,0 +1,142 @@ +#!/bin/bash +# +# Generate a isolinux ISO boot image + +function help() { +	echo "usage: ${0} [OPTIONS] foo.lkrn [bar.lkrn,...]" +	echo +	echo "where OPTIONS are:" +	echo " -h       show this help" +	echo " -l       build legacy image with floppy emulation" +	echo " -o FILE  save iso image to file" +} + +LEGACY=0 +FIRST="" + +while getopts "hlo:" opt; do +	case ${opt} in +		h) +			help +			exit 0 +			;; +		l) +			LEGACY=1 +			;; +		o) +			OUT="${OPTARG}" +			;; +	esac +done + +shift $((OPTIND - 1)) + +if [ -z "${OUT}" ]; then +	echo "${0}: no output file given" >&2 +	help +	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 +	exit 1 +fi + +dir=$(mktemp -d bin/iso.dir.XXXXXX) +cfg=${dir}/isolinux.cfg + +mkisofs+=(-quiet -l -volid "iPXE" -preparer "iPXE build system" +	-appid "iPXE ${VERSION} - Open Source Network Boot Firmware" +	-publisher "http://ipxe.org/" -c boot.cat) + +# generate the config +cat > ${cfg} <<EOF +# These default options can be changed in the geniso script +SAY iPXE ISO boot image +TIMEOUT 30 +EOF +for f; do +	if [ ! -r ${f} ]; then +		echo "${f} does not exist, skipping" >&2 +		continue +	fi +	b=$(basename ${f}) +	g=${b%.lkrn} +	g=${g//[^a-z0-9]} +	g=${g:0:8}.krn +	case "${FIRST}" in +		"") +			echo "DEFAULT ${b}" +			FIRST=${g} +			;; +	esac +	echo "LABEL ${b}" +	echo " KERNEL ${g}" +	cp ${f} ${dir}/${g} +done >> ${cfg} + +case "${LEGACY}" in +	1) +		# check for mtools +		case "$(mtools -V)" in +			Mtools\ version\ 3.9.9*|Mtools\ version\ 3.9.1[0-9]*|[mM]tools\ *\ [4-9].*) +				;; +			*) +				echo "Mtools version 3.9.9 or later is required" >&2 +				exit 1 +				;; +		esac + +		# generate floppy image +		img=${dir}/boot.img +		mformat -f 1440 -C -i ${img} :: + +		# copy lkrn file to floppy image +		for f in ${dir}/*.krn; do +			mcopy -m -i ${img} ${f} ::$(basename ${g}) +			rm -f ${f} +		done + +		# copy config file to floppy image +		mcopy -i ${img} ${cfg} ::syslinux.cfg +		rm -f ${cfg} + +		# write syslinux bootloader to floppy image +		if ! syslinux ${img}; then +			echo "${0}: failed writing syslinux to floppy image ${img}" >&2 +			exit 1 +		fi + +		# generate the iso image +		"${mkisofs[@]}" -b boot.img -output ${OUT} ${dir} +		;; +	0) +		# copy isolinux bootloader +		cp ${ISOLINUX_BIN} ${dir} + +		# syslinux 6.x needs a file called ldlinux.c32 +		LDLINUX_C32=$(dirname ${ISOLINUX_BIN})/ldlinux.c32 +		if [ -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} + +		# isohybrid will be used if available +		if isohybrid --version >/dev/null 2>/dev/null; then +			isohybrid ${OUT} >/dev/null +		fi +		;; +esac + +# clean up temporary dir +rm -fr ${dir} | 
