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