#!/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} <&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 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} # 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}