X-Git-Url: https://git.grml.org/?p=grml-live.git;a=blobdiff_plain;f=grml-live;h=a6dcafb7cc9c6c69b98977ef57727e98393f9a24;hp=d542724fa7225dcf8e7a1ce450b2561ab4ea5fdc;hb=2a20d6eed8a2eaf8b740bf96d9c5059c1c9fb192;hpb=ff80c12bbdaf7ffaff4722bbd96808f2dbfbcad9 diff --git a/grml-live b/grml-live index d542724..a6dcafb 100755 --- a/grml-live +++ b/grml-live @@ -12,6 +12,9 @@ export LANG=C export LC_ALL=C +# avoid leaking into chroots +unset TMPDIR + # define function getfilesize before "set -e" if stat --help >/dev/null 2>&1; then getfilesize='stat -c %s' # GNU stat @@ -81,13 +84,13 @@ More details: man grml-live + /usr/share/doc/grml-live/grml-live.html Please send your bug reports and feedback to the grml-team: http://grml.org/bugs/ " + [ "$(id -u 2>/dev/null)" != 0 ] && echo "Please notice that this script requires root permissions." } # make sure it's possible to get usage information without being # root or actually executing the script if [ "$1" = '-h' -o "$1" = '--help' ] ; then usage - [ "$(id -u 2>/dev/null)" != 0 ] && echo "Please notice that this script requires root permissions." exit 0 fi # }}} @@ -144,7 +147,13 @@ fi # source main configuration file: LIVE_CONF=/etc/grml/grml-live.conf -. $LIVE_CONF +if ! [ -r "$LIVE_CONF" ] ; then + ewarn "Configuration file $LIVE_CONF can not be read, ignoring" +else + einfo "Sourcing configuration file $LIVE_CONF" + . $LIVE_CONF + eend $? +fi # }}} # umount all directories {{{ @@ -152,10 +161,15 @@ umount_all() { # make sure we don't leave any mounts - FAI doesn't remove them always umount $CHROOT_OUTPUT/proc/sys/fs/binfmt_misc 2>/dev/null || /bin/true umount $CHROOT_OUTPUT/proc 2>/dev/null || /bin/true + umount $CHROOT_OUTPUT/run 2>/dev/null || /bin/true umount $CHROOT_OUTPUT/sys 2>/dev/null || /bin/true umount $CHROOT_OUTPUT/dev/pts 2>/dev/null || /bin/true umount $CHROOT_OUTPUT/dev 2>/dev/null || /bin/true + if [ -n "$EXTRACT_ISO_NAME" ] ; then + umount "$EXTRACT_ISO_NAME" 2>/dev/null || /bin/true + fi + # certain FAI versions sadly leave a ramdisk behind, so better safe than sorry if [ -x /usr/lib/fai/mkramdisk ] ; then /usr/lib/fai/mkramdisk -u "$(readlink -f ${CHROOT_OUTPUT}/var/lib/dpkg)" >/dev/null 2>&1 || /bin/true @@ -182,6 +196,11 @@ bailout() { [ -n "${CHROOT_OUTPUT}" -a -d "${CHROOT_OUTPUT}" ] && rm -r "${CHROOT_OUTPUT}" eend 0 fi + + # get rid of automatically generated conffiles + rm -f ${GRML_FAI_CONFIG}/nfsroot.conf + rm -f ${GRML_FAI_CONFIG}/make-fai-nfsroot.conf + if [ -n "$CHOWN_USER" ]; then log "Setting ownership" einfo "Setting ownership" @@ -291,7 +310,7 @@ copy_addon_file() { # }}} # command line parsing {{{ -while getopts "a:C:c:d:D:e:g:i:I:o:r:s:t:U:v:AbBFnNqQuVz" opt; do +while getopts "a:C:c:d:D:e:g:i:I:o:r:s:t:U:v:AbBFhnNqQuVz" opt; do case "$opt" in a) ARCH="$OPTARG" ;; A) CLEAN_ARTIFACTS=1 ;; @@ -303,6 +322,7 @@ while getopts "a:C:c:d:D:e:g:i:I:o:r:s:t:U:v:AbBFnNqQuVz" opt; do D) GRML_FAI_CONFIG="$(readlink -f $OPTARG)" ;; e) EXTRACT_ISO_NAME="$(readlink -f $OPTARG)" ;; g) GRML_NAME="$OPTARG" ;; + h) usage ; bailout 0 ;; i) ISO_NAME="$OPTARG" ;; I) CHROOT_INSTALL="$OPTARG" ;; n) SKIP_MKISOFS=1 ;; @@ -319,10 +339,15 @@ while getopts "a:C:c:d:D:e:g:i:I:o:r:s:t:U:v:AbBFnNqQuVz" opt; do U) CHOWN_USER="$OPTARG" ;; V) VERBOSE="-v" ;; z) SQUASHFS_ZLIB=1 ;; - ?) echo "invalid option -$OPTARG" >&2; bailout 1 ;; + ?) echo "invalid option -$OPTARG" >&2; usage; bailout 1 ;; esac done shift $(($OPTIND - 1)) # set ARGV to the first not parsed commandline parameter + +if [ -n "$1" ] ; then + echo "Error: unknown argument '$1' in options. Exiting to avoid possible data loss." >&2 + bailout 1 +fi # }}} # read local (non-packaged) configuration {{{ @@ -355,18 +380,17 @@ fi [ -n "$BOOT_METHOD" ] || BOOT_METHOD='isolinux' [ -n "$CLASSES" ] || CLASSES="GRMLBASE,GRML_FULL,$(echo ${ARCH} | tr 'a-z' 'A-Z')" [ -n "$DATE" ] || DATE="$(date +%Y-%m-%d)" -[ -n "$DISTRI_INFO" ] || DISTRI_INFO='Grml - Live Linux for system administrators ' +[ -n "$DISTRI_INFO" ] || DISTRI_INFO='Grml - Live Linux for system administrators' [ -n "$DISTRI_NAME" ] || DISTRI_NAME="grml" [ -n "$DISTRI_SPLASH" ] || DISTRI_SPLASH='grml.png' [ -n "$FORCE_ISO_REBUILD" ] || FORCE_ISO_REBUILD="false" [ -n "$GRML_FAI_CONFIG" ] || GRML_FAI_CONFIG='/etc/grml/fai' [ -n "$GRML_NAME" ] || GRML_NAME='grml' [ -n "$HOSTNAME" ] || HOSTNAME='grml' -[ -n "$HYBRID_METHOD" ] || HYBRID_METHOD='manifold' -[ -n "$NFSROOT_CONF" ] || NFSROOT_CONF="${GRML_FAI_CONFIG}/make-fai-nfsroot.conf" +[ -n "$HYBRID_METHOD" ] || HYBRID_METHOD='isohybrid' [ -n "$RELEASENAME" ] || RELEASENAME='grml-live rocks' [ -n "$SQUASHFS_EXCLUDES_FILE" ] || SQUASHFS_EXCLUDES_FILE="${GRML_FAI_CONFIG}/config/grml/squashfs-excludes" -[ -n "$SUITE" ] || SUITE='squeeze' +[ -n "$SUITE" ] || SUITE='testing' [ -n "$TEMPLATE_DIRECTORY" ] || TEMPLATE_DIRECTORY='/usr/share/grml-live/templates' [ -n "$USERNAME" ] || USERNAME='grml' [ -n "$VERSION" ] || VERSION='0.0.1' @@ -453,7 +477,9 @@ if [ -z "$FORCE" ] ; then echo -n "Is this ok for you? [y/N] " read a if ! [ "$a" = 'y' -o "$a" = 'Y' ] ; then - bailout 1 "Exiting as requested." + CLEAN_ARTIFACTS=0 + echo "Exiting as requested." + exit 0 fi echo fi @@ -543,7 +569,20 @@ if [ -n "$EXTRACT_ISO_NAME" ]; then eend 1 bailout 1 fi - unsquashfs -d "${CHROOT_OUTPUT}" "${mountpoint}"/live/*/*.squashfs ; rc=$? + + if ls "${mountpoint}"/live/*/*.squashfs 2>/dev/null | grep -q . ; then # ISOs >=2011.12 + log "Using ${mountpoint}/live/*/*.squashfs for unsquashfs" + unsquashfs -d "${CHROOT_OUTPUT}" "${mountpoint}"/live/*/*.squashfs ; rc=$? + elif ls "${mountpoint}"/live/*.squashfs 2>/dev/null | grep -q . ; then # ISOs before 2011.12 + log "Using ${mountpoint}/live/*.squashfs for unsquashfs" + unsquashfs -d "${CHROOT_OUTPUT}" "${mountpoint}"/live/*.squashfs ; rc=$? + else + log "Error: Could not find any *.squashfs files on the ISO" + eerror "Error: Could not find any *.squashfs files on the ISO" + eend 1 + bailout 1 + fi + umount "$mountpoint" rmdir "$mountpoint" if [ "$rc" != 0 ]; then @@ -558,9 +597,6 @@ extract_iso # }}} # on-the-fly configuration {{{ -if [ -n "$FAI_DEBOOTSTRAP" ] ; then - sed "s#^FAI_DEBOOTSTRAP=.*#FAI_DEBOOTSTRAP=\"$FAI_DEBOOTSTRAP\"#" "$NFSROOT_CONF" | sponge "$NFSROOT_CONF" -fi # does this suck? YES! # /usr/share/debootstrap/scripts/unstable does not exist, instead use 'sid': @@ -570,15 +606,9 @@ case $SUITE in esac export SUITE # make sure it's available in FAI scripts -for file in "$LIVE_CONF" "$LOCAL_CONFIG" "$NFSROOT_CONF" ; do - if [ -n "$file" ] ; then - sed "s|^FAI_DEBOOTSTRAP=\"[a-z]* |FAI_DEBOOTSTRAP=\"$SUITE |" "$file" | sponge "$file" - fi -done - # validate whether the specified architecture class matches the # architecture (option), otherwise installation of kernel will fail -if echo $CLASSES | grep -qi i386 ; then +if echo $CLASSES | grep -qw I386 ; then if ! [[ "$ARCH" == "i386" ]] ; then log "Error: You specified the I386 class but are trying to build something else (AMD64?)." eerror "Error: You specified the I386 class but are trying to build something else (AMD64?)." @@ -596,11 +626,31 @@ elif echo $CLASSES | grep -qi amd64 ; then fi fi -if grep -q -- 'FAI_DEBOOTSTRAP_OPTS.*--arch' "$NFSROOT_CONF" ; then - sed "s/--arch [a-z0-9]* /--arch $ARCH /" "$NFSROOT_CONF" | sponge "$NFSROOT_CONF" -else - sed "s|^FAI_DEBOOTSTRAP_OPTS=\"\(.*\)|FAI_DEBOOTSTRAP_OPTS=\"--arch $ARCH \1|" "$NFSROOT_CONF" | sponge "$NFSROOT_CONF" +# generate nfsroot configuration for FAI on the fly +if [ -z "$FAI_DEBOOTSTRAP" ] ; then + FAI_DEBOOTSTRAP="$SUITE http://cdn.debian.net/debian" +fi + +if [ -z "$FAI_DEBOOTSTRAP_OPTS" ] ; then + FAI_DEBOOTSTRAP_OPTS="--exclude=info,tasksel,tasksel-data --arch $ARCH" +fi + +# create backup of old (not yet automatically generated) config file +if [ -f "${GRML_FAI_CONFIG}/make-fai-nfsroot.conf" ] ; then + if ! grep -q 'This is an automatically generated file by grml-live' "${GRML_FAI_CONFIG}/make-fai-nfsroot.conf" ; then + ewarn "Found old ${GRML_FAI_CONFIG}/make-fai-nfsroot.conf - moving to ${GRML_FAI_CONFIG}/make-fai-nfsroot.conf.outdated" + mv "${GRML_FAI_CONFIG}/make-fai-nfsroot.conf" "${GRML_FAI_CONFIG}/make-fai-nfsroot.conf.outdated" + eend $? + fi fi + +echo "# This is an automatically generated file by grml-live. +# Do NOT edit this file, your changes will be lost. +FAI_DEBOOTSTRAP=\"$FAI_DEBOOTSTRAP\" +FAI_DEBOOTSTRAP_OPTS=\"$FAI_DEBOOTSTRAP_OPTS\" +# EOF " > "${GRML_FAI_CONFIG}/nfsroot.conf" +# support FAI <=3.4.8, versions >=4.0 use nfsroot.conf +( cd ${GRML_FAI_CONFIG} && ln -sf nfsroot.conf make-fai-nfsroot.conf ) # }}} # CHROOT_OUTPUT - execute FAI {{{ @@ -610,12 +660,6 @@ if [ -n "$BUILD_DIRTY" ]; then else [ -n "$CHROOT_OUTPUT" ] || CHROOT_OUTPUT="$OUTPUT/grml_chroot" - # provide inform fai about the ISO we build - [ -d "$CHROOT_OUTPUT/etc/" ] || mkdir -p "$CHROOT_OUTPUT/etc/" - echo '# This file has been generated by grml-live.' > "$CHROOT_OUTPUT/etc/grml_live_version" - [ -n "$GRML_LIVE_VERSION" ] && echo "GRML_LIVE_VERSION=$GRML_LIVE_VERSION" >> "$CHROOT_OUTPUT/etc/grml_live_version" - [ -n "$SUITE" ] && echo "SUITE=$SUITE" >> "$CHROOT_OUTPUT/etc/grml_live_version" - if [ -n "$UPDATE" -o -n "$BUILD_ONLY" ] ; then FAI_ACTION=softupdate else @@ -645,10 +689,6 @@ else mkdir -p "${OUTPUT}/grml_sources/" "${CHROOT_OUTPUT}/grml-live/sources/" mount --bind "${OUTPUT}/grml_sources/" "${CHROOT_OUTPUT}/grml-live/sources/" - # tell dpkg to use "unsafe io" during the build - [ -d "$CHROOT_OUTPUT/etc/dpkg/dpkg.cfg.d" ] || mkdir -p "$CHROOT_OUTPUT/etc/dpkg/dpkg.cfg.d" - echo force-unsafe-io > "$CHROOT_OUTPUT/etc/dpkg/dpkg.cfg.d/unsafe-io" - log "Executed FAI command line:" log "BUILD_ONLY=$BUILD_ONLY BOOTSTRAP_ONLY=$BOOTSTRAP_ONLY GRML_LIVE_CONFIG=$CONFIGDUMP fai $VERBOSE -C $GRML_FAI_CONFIG -s file:///$GRML_FAI_CONFIG/config -c$CLASSES -u $HOSTNAME $FAI_ACTION $CHROOT_OUTPUT $FAI_ARGS" BUILD_ONLY="$BUILD_ONLY" BOOTSTRAP_ONLY="$BOOTSTRAP_ONLY" GRML_LIVE_CONFIG="$CONFIGDUMP" fai $VERBOSE \ @@ -656,7 +696,12 @@ else -u "$HOSTNAME" "$FAI_ACTION" "$CHROOT_OUTPUT" $FAI_ARGS | tee -a $LOGFILE RC="$PIPESTATUS" # notice: bash-only - rm -f "$CHROOT_OUTPUT/etc/dpkg/dpkg.cfg.d/unsafe-io" + # provide inform fai about the ISO we build, needs to be provided + # *after* FAI stage, otherwise FAI skips the debootstrap stage if + # there is not BASEFILE (as it checks for presence of /etc) :( + echo '# This file has been generated by grml-live.' > "$CHROOT_OUTPUT/etc/grml_live_version" + [ -n "$GRML_LIVE_VERSION" ] && echo "GRML_LIVE_VERSION=$GRML_LIVE_VERSION" >> "$CHROOT_OUTPUT/etc/grml_live_version" + [ -n "$SUITE" ] && echo "SUITE=$SUITE" >> "$CHROOT_OUTPUT/etc/grml_live_version" FORCE_ISO_REBUILD=true @@ -670,6 +715,10 @@ else mkdir -p "$LOG_OUTPUT"/fai/ cp -r "$CHROOT_OUTPUT"/var/log/fai/"$HOSTNAME"/last/* "$LOG_OUTPUT"/fai/ rm -rf "$CHROOT_OUTPUT"/var/log/fai + + # store copy of autogenerated configuration file + cp ${GRML_FAI_CONFIG}/nfsroot.conf "$LOG_OUTPUT"/fai/ + # copy fai package list cp "$CHROOT_OUTPUT"/var/log/install_packages.list "$LOG_OUTPUT"/fai/ # fixup owners @@ -752,11 +801,12 @@ else EOF - for package in $(awk '{print $5}' "${CHECKLOG}/package_errors.log" | sed 's/\.$//') ; do + for package in $(awk '{print $1}' "${CHECKLOG}/package_errors.log") ; do + failure_reason="$(awk "/$package/ {print \$2}" "${CHECKLOG}/package_errors.log")" cat >> "${REPORT_MISSING_PACKAGES}" << EOF - -Package $package is missing in chroot + +Package $package is missing in chroot (${failure_reason}) EOF @@ -824,6 +874,17 @@ if [ "$ARCH" = i386 ] || [ "$ARCH" = amd64 ] ; then bailout 11 fi + # EFI boot files + if [ -r "${CHROOT_OUTPUT}/boot/efi.img" -a -r "${CHROOT_OUTPUT}/boot/bootx64.efi" ] ; then + einfo "Moving EFI boot files into ISO path." + log "Moving EFI boot files into ISO path." + RC=$0 + mv "${CHROOT_OUTPUT}/boot/efi.img" "${BUILD_OUTPUT}/boot/" || RC=$? + mkdir -p "${BUILD_OUTPUT}/efi/boot/" || RC=$? + mv "${CHROOT_OUTPUT}/boot/bootx64.efi" "${BUILD_OUTPUT}/efi/boot/bootx64.efi" || RC=$? + eend $? + fi + [ -n "$TEMPLATE_DIRECTORY" ] || TEMPLATE_DIRECTORY='/usr/share/grml-live/templates' if ! [ -d "${TEMPLATE_DIRECTORY}"/boot ] ; then log "Error: ${TEMPLATE_DIRECTORY}/boot does not exist. Exiting." @@ -852,7 +913,7 @@ if [ "$ARCH" = i386 ] || [ "$ARCH" = amd64 ] ; then copy_addon_file ipxe.lkrn /usr/lib/ipxe addons copy_addon_file pci.ids /usr/share/misc addons copy_addon_file memtest86+.bin /boot addons - for file in memdisk chain.c32 hdt.c32 menu.c32; do + for file in memdisk chain.c32 hdt.c32 mboot.c32 menu.c32; do copy_addon_file "${file}" /usr/lib/syslinux addons done @@ -885,12 +946,24 @@ if [ "$ARCH" = i386 ] || [ "$ARCH" = amd64 ] ; then fi cp -a ${TEMPLATE_DIRECTORY}/boot/grub/* "$BUILD_OUTPUT"/boot/grub/ + # generate loopback.cfg config file without depending on grub's regexp module + # which isn't available in Debian/squeeze + echo "## grub2 loopback configuration" > "${BUILD_OUTPUT}"/boot/grub/loopback.cfg + echo "source /boot/grub/header.cfg" >> "${BUILD_OUTPUT}"/boot/grub/loopback.cfg + for config in "${BUILD_OUTPUT}"/boot/grub/*_default.cfg "${BUILD_OUTPUT}"/boot/grub/*_options.cfg ; do + [ -r "$config" ] || continue + echo "source ${config##$BUILD_OUTPUT}" >> "${BUILD_OUTPUT}"/boot/grub/loopback.cfg + done + echo "source /boot/grub/addons.cfg" >> "${BUILD_OUTPUT}"/boot/grub/loopback.cfg + echo "source /boot/grub/footer.cfg" >> "${BUILD_OUTPUT}"/boot/grub/loopback.cfg + # copy grub files from target cp -a "${CHROOT_OUTPUT}"/usr/lib/grub/*-pc/*.mod "${BUILD_OUTPUT}"/boot/grub/ cp -a "${CHROOT_OUTPUT}"/usr/lib/grub/*-pc/*.o "${BUILD_OUTPUT}"/boot/grub/ cp -a "${CHROOT_OUTPUT}"/usr/lib/grub/*-pc/*.lst "${BUILD_OUTPUT}"/boot/grub/ cp -a "${CHROOT_OUTPUT}"/usr/share/grub/ascii.pf2 "${BUILD_OUTPUT}"/boot/grub/ cp -a "${CHROOT_OUTPUT}"/boot/grub/core.img "${BUILD_OUTPUT}"/boot/grub/ + cp -a "${CHROOT_OUTPUT}"/boot/grub/grub.img "${BUILD_OUTPUT}"/boot/grub/ if ! [ -d "${TEMPLATE_DIRECTORY}"/GRML ] ; then log "Error: ${TEMPLATE_DIRECTORY}/GRML does not exist. Exiting." @@ -941,7 +1014,7 @@ if [ "$ARCH" = i386 ] || [ "$ARCH" = amd64 ] ; then sed -i "s/%SHORT_NAME%/$SHORT_NAME/g" "${file}" sed -i "s/%VERSION%/$VERSION/g" "${file}" - [ -n "$DEFAULT_BOOTOPTIONS" ] && sed -i "s/ boot=live/ boot=live $DEFAULT_BOOTOPTIONS/" "${file}" + [ -n "$DEFAULT_BOOTOPTIONS" ] && sed -i "s; boot=live; boot=live $DEFAULT_BOOTOPTIONS;" "${file}" if [ -n "$NO_BOOTID" ] ; then sed -i "s/ bootid=%BOOTID%//g" "${file}" # drop bootid bootoption @@ -1154,7 +1227,7 @@ fi # create md5sum file: if [ -z "$BOOTSTRAP_ONLY" ] ; then ( cd $BUILD_OUTPUT/GRML/"${GRML_NAME}" && - find .. -type f -not -name md5sums -not -name isolinux.bin -exec md5sum {} \; > md5sums ) + find ../.. -type f -not -name md5sums -not -name isolinux.bin -exec md5sum {} \; > md5sums ) fi # }}} @@ -1168,8 +1241,7 @@ elif [ "$BOOT_METHOD" = "grub2" ] ; then BOOT_ARGS="-no-emul-boot -boot-load-size 4 -b boot/grub/toriboot.bin" fi -# Just until http://bts.grml.org/grml/issue945 has been resolved. -# HYBRID_METHOD defaults to manifold, so make sure the default works OOTB. +# Work around http://bts.grml.org/grml/issue945 if [[ $BOOT_METHOD != isolinux && ($HYBRID_METHOD = isohybrid || $HYBRID_METHOD = manifold) ]]; then log "Setting HYBRID_METHOD to grub2 as hybrid mode does not work with isohybrid yet." ewarn "Setting HYBRID_METHOD to grub2 as hybrid mode does not work with isohybrid yet." @@ -1204,47 +1276,28 @@ else bailout fi - case "$ARCH" in - amd64) - # using -eltorito-alt-boot is limited to xorriso for now - case "$MKISOFS" in - xorriso*) - einfo "Using xorriso for ISO generation." ; eend 0 - eindent - - if ! dpkg --compare-versions $(dpkg-query -W -f='${Version}\n' xorriso 2>/dev/null) gt-nl 1.1.6-1 ; then - log "Disabling (U)EFI boot support because xorriso version is too old." - ewarn "Disabling (U)EFI boot support because xorriso version is too old." ; eend 0 - else - if [ -r "${CHROOT_OUTPUT}/boot/efi.img" ] ; then - einfo "Found /boot/efi.img - using for ISO." - log "Found /boot/efi.img - using for ISO." - cp "${CHROOT_OUTPUT}/boot/efi.img" "${BUILD_OUTPUT}/boot/efi.img" - eend $? - fi - - if [ -r "${CHROOT_OUTPUT}/boot/bootx64.efi" ] ; then - einfo "Found /boot/bootx64.efi - using as /efi/boot/bootx64.efi for ISO." - log "Found /boot/bootx64.efi - using as /efi/boot/bootx64.efi for ISO." - mkdir -p "${BUILD_OUTPUT}/efi/boot/" - cp "${CHROOT_OUTPUT}/boot/bootx64.efi" "${BUILD_OUTPUT}/efi/boot/bootx64.efi" - eend $? - fi - - if [ -r "${BUILD_OUTPUT}"/boot/efi.img ] ; then - einfo "/boot/efi.img found and amd64 architecture present, extending boot arguments." - log "/boot/efi.img found and amd64 architecture present, extending boot arguments." - BOOT_ARGS="$BOOT_ARGS -boot-info-table -eltorito-alt-boot -e boot/efi.img -no-emul-boot" - eend $? - else - log "Disabling (U)EFI boot support because /boot/efi.img is missing." - ewarn "Disabling (U)EFI boot support because /boot/efi.img is missing." ; eend 0 - fi - fi + einfo "Using ${MKISOFS} to build ISO." ; eend 0 + case "${ARCH}-${MKISOFS}" in + # using -eltorito-alt-boot is limited to xorriso for now + amd64-xorriso*) + eindent - eoutdent - ;; - esac + if ! dpkg --compare-versions $(dpkg-query -W -f='${Version}\n' xorriso 2>/dev/null) gt-nl 1.1.6-1 ; then + log "Disabling (U)EFI boot support because xorriso version is too old." + ewarn "Disabling (U)EFI boot support because xorriso version is too old." ; eend 0 + else + if [ -r "${BUILD_OUTPUT}"/boot/efi.img ] ; then + einfo "Enabling (U)EFI boot." + log "Enabling (U)EFI boot." + BOOT_ARGS="$BOOT_ARGS -boot-info-table -eltorito-alt-boot -e boot/efi.img -no-emul-boot" + eend $? + else + log "Disabling (U)EFI boot support because /boot/efi.img is missing." + ewarn "Disabling (U)EFI boot support because /boot/efi.img is missing." ; eend 0 + fi + fi + + eoutdent ;; esac @@ -1276,54 +1329,66 @@ else of="${ISO_OUTPUT}/${ISO_NAME}" 2>/dev/null # support disabling hybrid ISO image - if [ "$HYBRID_METHOD" = "disable" ] ; then\ - log "Skipping creation of hybrid ISO file as requested via HYBRID_METHOD=disable" - einfo "Skipping creation of hybrid ISO file as requested via HYBRID_METHOD=disable" - eend 0 - elif [ "$HYBRID_METHOD" = "manifold" ] ; then - # isoinfo is part of both mkisofs and genisoimage so we're good - bootoff=$(isoinfo -l -i "${ISO_OUTPUT}/${ISO_NAME}" | \ - sed -n '/^.*\[ *\([0-9]*\)[] ].* ISOLINUX.BIN[;1]* *$/s//\1/p') - if ! [ -r boot/grub/core.img ] ; then - ewarn "boot/grub/core.img not found, not creating manifold boot ISO file" - elif [ "${bootoff:-0}" -lt 1 ] ; then - ewarn "isolinux.bin not found on the ISO file, disabling manifold boot" - else - log "Creating hybrid ISO file with manifold method" - einfo "Creating hybrid ISO file with manifold method" - if [ "$HYBRID_METHOD" = "grub2" ] ; then - # 512 bytes: MBR, partition table, load GRUB 2 - echo 4 63 | mksh /usr/share/grml-live/scripts/bootgrub.mksh -A -M 4:0x96 -g $cyls:16:32 - else - # read only one but 2048-byte sized (scale: << 2) sector - echo $bootoff $bootoff | \ - mksh /usr/share/grml-live/scripts/bootilnx.mksh -A -M 4:0x96 -g $cyls:16:32 -S 2 - fi | dd of="${ISO_OUTPUT}/${ISO_NAME}" conv=notrunc 2>/dev/null - eend $? - fi - # use isohybrid as default - else - if ! which isohybrid >/dev/null 2>&1 ; then - bailout 12 "isohybrid binary not found - please install syslinux/syslinux-common" - else - log "Creating hybrid ISO file with isohybrid method" - einfo "Creating hybrid ISO file with isohybrid method" - # Notes for consideration: - # "-entry 4 -type 1c" - # * using 4 as the partition number is supposed to help with BIOSes - # that only support USB-Zip boot - # * using 1c (i.e. hidden FAT32 LBA), instead of the default 0x17 - # (hidden NTFS, IIRC), as the partition type is sometimes needed - # to get the BIOS even look at the partition created by isohybrid - if isohybrid --help | grep -q -- --uefi ; then - einfo "Detected uefi support for isohybrid, enabling." - ISOHYBRID_OPTIONS=--uefi - fi + if [ "$HYBRID_METHOD" = "disable" ] ; then + log "Skipping creation of hybrid ISO file as requested via HYBRID_METHOD=disable" + einfo "Skipping creation of hybrid ISO file as requested via HYBRID_METHOD=disable" + eend 0 + elif [ "$HYBRID_METHOD" = "manifold" ] || [ "$HYBRID_METHOD" = "grub2" ] ; then + # isoinfo is part of both mkisofs and genisoimage so we're good + bootoff=$(isoinfo -l -i "${ISO_OUTPUT}/${ISO_NAME}" | \ + sed -n '/^.*\[ *\([0-9]*\)[] ].* ISOLINUX.BIN[;1]* *$/s//\1/p') + + if ! [ -r boot/grub/core.img ] ; then + log "boot/grub/core.img not found, not creating manifold boot ISO file" + ewarn "boot/grub/core.img not found, not creating manifold boot ISO file" + elif [ "${bootoff:-0}" -lt 1 ] ; then + log "isolinux.bin not found on the ISO file, disabling manifold boot" + ewarn "isolinux.bin not found on the ISO file, disabling manifold boot" + else + if [ "$HYBRID_METHOD" = "grub2" ] ; then + log "Creating hybrid ISO file with manifold/grub2 method" + einfo "Creating hybrid ISO file with manifold/grub2 method" + # 512 bytes: MBR, partition table, load GRUB 2 + echo 4 63 | mksh /usr/share/grml-live/scripts/bootgrub.mksh -A -M 4:0x96 -g $cyls:16:32 + else + log "Creating hybrid ISO file with manifold method" + einfo "Creating hybrid ISO file with manifold method" + # read only one but 2048-byte sized (scale: << 2) sector + echo $bootoff $bootoff | \ + mksh /usr/share/grml-live/scripts/bootilnx.mksh -A -M 4:0x96 -g $cyls:16:32 -S 2 + fi | dd of="${ISO_OUTPUT}/${ISO_NAME}" conv=notrunc 2>/dev/null + eend $? + fi + elif [ "$HYBRID_METHOD" = "isohybrid" ] ; then + if ! which isohybrid >/dev/null 2>&1 ; then + bailout 12 "isohybrid binary not found - please install syslinux/syslinux-common" + else + log "Creating hybrid ISO file with isohybrid method" + einfo "Creating hybrid ISO file with isohybrid method" + # Notes for consideration: + # "-entry 4 -type 1c" + # * using 4 as the partition number is supposed to help with BIOSes + # that only support USB-Zip boot + # * using 1c (i.e. hidden FAT32 LBA), instead of the default 0x17 + # (hidden NTFS, IIRC), as the partition type is sometimes needed + # to get the BIOS even look at the partition created by isohybrid + if isohybrid --help | grep -q -- --uefi ; then + if echo $CLASSES | grep -qw I386 ; then + log "Detected uefi support for isohybrid but 32bit systems do not support it, ignoring." + einfo "Detected uefi support for isohybrid but 32bit systems do not support it, ignoring." + else + log "Detected uefi support for isohybrid, enabling" + einfo "Detected uefi support for isohybrid, enabling" + ISOHYBRID_OPTIONS=--uefi + fi + fi - log "isohybrid $ISOHYBRID_OPTIONS ${ISO_OUTPUT}/${ISO_NAME}" - isohybrid $ISOHYBRID_OPTIONS "${ISO_OUTPUT}/${ISO_NAME}" - eend $? - fi + log "isohybrid $ISOHYBRID_OPTIONS ${ISO_OUTPUT}/${ISO_NAME}" + isohybrid $ISOHYBRID_OPTIONS "${ISO_OUTPUT}/${ISO_NAME}" + eend $? + fi + else + bailout 12 "Unknown HYBRID_METHOD [${HYBRID_METHOD}]. Supported values: disable, isohybrid, grub2, manifold" fi # generate md5sum and sha1sum of ISO if we are using class 'RELEASE': @@ -1391,11 +1456,19 @@ create_netbootpackage() { if [ -r "${BUILD_OUTPUT}/boot/isolinux/netboot.cfg" ] ; then cp "${BUILD_OUTPUT}/boot/isolinux/netboot.cfg" "${WORKING_DIR}/pxelinux.cfg/default" else - ewarn "File ${BUILD_OUTPUT}/boot/isolinux/netboot.cfg not found." ; eend 0 + log "File ${BUILD_OUTPUT}/boot/isolinux/netboot.cfg not found." + ewarn "File ${BUILD_OUTPUT}/boot/isolinux/netboot.cfg not found." + eindent + log "Hint: Are you using custom templates which do not provide netboot.cfg?" + ewarn "Hint: Are you using custom templates which do not provide netboot.cfg?" ; eend 0 + eoutdent fi if tar -C "$OUTPUTDIR" -jcf "${OUTPUT_FILE}" "grml_netboot_package_${GRML_NAME}_${VERSION}" ; then - sha1sum "${OUTPUT_FILE}" > "${OUTPUT_FILE}.sha1" + ( + cd $(dirname "${OUTPUT_FILE}") + sha1sum $(basename "${OUTPUT_FILE}") > "${OUTPUT_FILE}.sha1" + ) einfo "Generated netboot package ${OUTPUT_FILE}" ; eend 0 rm -rf "${OUTPUTDIR}" else