X-Git-Url: http://git.grml.org/?p=grml-live.git;a=blobdiff_plain;f=grml-live;h=00321211b36dedb705b7ce8a5d6d3e9d4d5769fd;hp=ac8f9cf3d0db688a15c7f0e38f60282859c3dc31;hb=7beda7dae5063c45ab57c061bcfb27e13fd704ea;hpb=a50de9f4017b0b811cc86e3c2a08278bbf2d7a51 diff --git a/grml-live b/grml-live index ac8f9cf..0032121 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 @@ -61,12 +64,15 @@ Usage: $PN [options, see as follows] -q skip mksquashfs -Q skip netboot package build -r release name - -s Debian suite; values: etch, lenny, squeeze, sid + -s Debian suite/release, like: stable, testing, unstable + -S place of scripts (defaults to /usr/share/grml-live/scripts) -t place of the templates -u update existing chroot instead of rebuilding it from scratch -U arrange output to be owned by specified username -v specify version number of the release -V increase verbosity in the build process + -w wayback machine, build system using Debian archives + from specified date -z use ZLIB instead of LZMA/XZ compression Usage examples: @@ -74,7 +80,7 @@ Usage examples: $PN $PN -c GRMLBASE,GRML_FULL,AMD64 -o /dev/shm/grml $PN -c GRMLBASE,GRML_FULL,AMD64 -i grml_0.0-1.iso -v 0.0-1 - $PN -c GRMLBASE,GRML_FULL,AMD64 -s sid -V -r 'grml-live rocks' + $PN -c GRMLBASE,GRML_FULL,AMD64 -s stable -V -r 'grml-ftw' More details: man grml-live + /usr/share/doc/grml-live/grml-live.html http://grml.org/grml-live/ @@ -143,8 +149,14 @@ else fi # source main configuration file: -LIVE_CONF=/etc/grml/grml-live.conf -. $LIVE_CONF +[ -z "$LIVE_CONF" ] && LIVE_CONF='/etc/grml/grml-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 {{{ @@ -157,6 +169,10 @@ umount_all() { 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 @@ -183,6 +199,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" @@ -258,12 +279,12 @@ extend_string_end() { # This is because: # * We assume that the chroot always has a "good" version of # the file. Also it makes sources handling easier. -# * On unstable, we Recommend the Debian packages containing +# * On unstable, we recommend the Debian packages containing # these files. The user can override them by putting his # "better" version into the chroot. -# * On stable, the Debian packages are probably not available, -# or outdated, so we look in TEMPLATE_DIRECTORY/compat first, where -# our grml-live-compat package installs current file versions. +# * With older releases the Debian packages are probably +# not available, so we look in TEMPLATE_DIRECTORY/compat, +# where a (custom) package might install current file versions. copy_addon_file() { DEST="${BUILD_OUTPUT}/boot/$3" if [ ! -d "${DEST}/" ]; then @@ -275,7 +296,7 @@ copy_addon_file() { return $? fi if [ -e "${TEMPLATE_DIRECTORY}/compat/$3/$1" ]; then - log "Copying $1 from grml-live-compat" + log "Copying $1 from ${TEMPLATE_DIRECTORY}/compat" cp "${TEMPLATE_DIRECTORY}/compat/$3/$1" "${DEST}/" return $? fi @@ -292,7 +313,7 @@ copy_addon_file() { # }}} # command line parsing {{{ -while getopts "a:C:c:d:D:e:g:i:I:o:r:s:t:U:v:AbBFhnNqQuVz" opt; do +while getopts "a:C:c:d:D:e:g:i:I:o:r:s:S:t:U:v:w:AbBFhnNqQuVz" opt; do case "$opt" in a) ARCH="$OPTARG" ;; A) CLEAN_ARTIFACTS=1 ;; @@ -314,17 +335,24 @@ while getopts "a:C:c:d:D:e:g:i:I:o:r:s:t:U:v:AbBFhnNqQuVz" opt; do Q) SKIP_NETBOOT=1 ;; r) RELEASENAME="$OPTARG" ;; s) SUITE="$OPTARG" ;; + S) SCRIPTS_DIRECTORY="$OPTARG";; t) TEMPLATE_DIRECTORY="$OPTARG";; v) VERSION="$OPTARG" ;; F) FORCE=1 ;; u) UPDATE=1 ;; U) CHOWN_USER="$OPTARG" ;; V) VERBOSE="-v" ;; + w) export WAYBACK_DATE="$OPTARG" ;; 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 {{{ @@ -365,16 +393,16 @@ fi [ -n "$GRML_NAME" ] || GRML_NAME='grml' [ -n "$HOSTNAME" ] || HOSTNAME='grml' [ -n "$HYBRID_METHOD" ] || HYBRID_METHOD='isohybrid' -[ -n "$NFSROOT_CONF" ] || NFSROOT_CONF="${GRML_FAI_CONFIG}/make-fai-nfsroot.conf" [ -n "$RELEASENAME" ] || RELEASENAME='grml-live rocks' [ -n "$SQUASHFS_EXCLUDES_FILE" ] || SQUASHFS_EXCLUDES_FILE="${GRML_FAI_CONFIG}/config/grml/squashfs-excludes" [ -n "$SUITE" ] || SUITE='testing' [ -n "$TEMPLATE_DIRECTORY" ] || TEMPLATE_DIRECTORY='/usr/share/grml-live/templates' +[ -n "$SCRIPTS_DIRECTORY" ] || SCRIPTS_DIRECTORY='/usr/share/grml-live/scripts' [ -n "$USERNAME" ] || USERNAME='grml' [ -n "$VERSION" ] || VERSION='0.0.1' # output specific stuff, depends on $OUTPUT (iff not set): -[ -n "$OUTPUT" ] || OUTPUT='/grml/grml-live' +[ -n "$OUTPUT" ] || OUTPUT='./grml/' [ -n "$BUILD_OUTPUT" ] || BUILD_OUTPUT="$OUTPUT/grml_cd" [ -n "$CHROOT_OUTPUT" ] || CHROOT_OUTPUT="$OUTPUT/grml_chroot" [ -n "$ISO_OUTPUT" ] || ISO_OUTPUT="$OUTPUT/grml_isos" @@ -455,7 +483,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 @@ -545,7 +575,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 @@ -560,9 +603,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': @@ -572,15 +612,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?)." @@ -598,11 +632,35 @@ 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 + if [ -n "$WAYBACK_DATE" ] ; then + FAI_DEBOOTSTRAP="$SUITE http://snapshot.debian.org/archive/debian/$WAYBACK_DATE/" + else + FAI_DEBOOTSTRAP="$SUITE http://ftp.debian.org/debian" + fi fi + +if [ -z "$FAI_DEBOOTSTRAP_OPTS" ] ; then + FAI_DEBOOTSTRAP_OPTS="--exclude=info,tasksel,tasksel-data --include=aptitude --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 {{{ @@ -612,12 +670,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 @@ -647,31 +699,36 @@ 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" + log "BUILD_ONLY=$BUILD_ONLY BOOTSTRAP_ONLY=$BOOTSTRAP_ONLY GRML_LIVE_CONFIG=$CONFIGDUMP WAYBACK_DATE=$WAYBACK_DATE 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 \ -C "$GRML_FAI_CONFIG" -s "file:///$GRML_FAI_CONFIG/config" -c"$CLASSES" \ -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" - - FORCE_ISO_REBUILD=true - if [ "$RC" != 0 ] ; then log "Error: critical error while executing fai [exit code ${RC}]. Exiting." eerror "Error: critical error while executing fai [exit code ${RC}]. Exiting." ; eend 1 bailout 1 fi + # 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 + # move fai logs into grml_logs directory 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 @@ -696,6 +753,11 @@ else grep 'FAILED with exit code' $CHECKLOG/shell.log >> $LOGFILE && ERROR=6 fi + if [ -r "$CHECKLOG/fai.log" ] ; then + grep 'updatebase.*FAILED with exit code' "$CHECKLOG/fai.log" >> "$LOGFILE" && ERROR=7 + grep 'instsoft.*FAILED with exit code' "$CHECKLOG/fai.log" >> "$LOGFILE" && ERROR=8 + fi + if [ -n "$ERROR" ] ; then log "Error: there was a critical error [${ERROR}] during execution of stage 'fai dirinstall' [$(date)]" eerror "Error: there was a critical error during execution of stage 'fai dirinstall'" @@ -754,11 +816,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" | sed 's;/;\\/;') ; 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 @@ -845,15 +908,26 @@ if [ "$ARCH" = i386 ] || [ "$ARCH" = amd64 ] ; then fi # copy _required_ isolinux files - for file in ifcpu64.c32 isolinux.bin vesamenu.c32; do - copy_addon_file "${file}" /usr/lib/syslinux isolinux - done + if [ -d "${CHROOT_OUTPUT}/usr/lib/ISOLINUX" ] ; then + copy_addon_file isolinux.bin /usr/lib/ISOLINUX isolinux + for file in ${CHROOT_OUTPUT}/usr/lib/syslinux/modules/bios/*.c32 ; do + copy_addon_file "$(basename "$file")" /usr/lib/syslinux/modules/bios/ isolinux + done + else # syslinux versions <= 3:4.05+dfsg-6+deb8u1 + copy_addon_file isolinux.bin /usr/lib/syslinux isolinux + copy_addon_file ifcpu64.c32 /usr/lib/syslinux isolinux + copy_addon_file vesamenu.c32 /usr/lib/syslinux isolinux + fi # *always* copy files to output directory so the variables # get adjusted according to the build. cp ${TEMPLATE_DIRECTORY}/boot/isolinux/* "$BUILD_OUTPUT"/boot/isolinux/ + mkdir -p "${BUILD_OUTPUT}/boot/grub" + cp -a ${TEMPLATE_DIRECTORY}/boot/grub/* "$BUILD_OUTPUT"/boot/grub/ + if [ -n "$NO_ADDONS" ] ; then + rm -f "$BUILD_OUTPUT"/boot/grub/addons.cfg log "Skipping installation of boot addons as requested via \$NO_ADDONS." einfo "Skipping installation of boot addons as requested via \$NO_ADDONS."; eend 0 else @@ -861,14 +935,24 @@ if [ "$ARCH" = i386 ] || [ "$ARCH" = amd64 ] ; then log "Boot addons not found, skipping therefore. (Consider installing package grml-live-addons)" ewarn "Boot addons not found, skipping therefore. (Consider installing package grml-live-addons)" ; eend 0 else - # copy addons from system packages or grml-live-compat + # copy addons from system packages or grml-live-addons 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 - copy_addon_file "${file}" /usr/lib/syslinux addons + + # since syslinux(-common) v3:6.03~pre1+dfsg-4 the files are in a + # different directory :( + if [ -d "${CHROOT_OUTPUT}/usr/lib/syslinux/modules/bios/" ] ; then + syslinux_modules_dir=/usr/lib/syslinux/modules/bios/ + else + syslinux_modules_dir=/usr/lib/syslinux + fi + for file in chain.c32 hdt.c32 mboot.c32 menu.c32; do + copy_addon_file "${file}" "${syslinux_modules_dir}" addons done + copy_addon_file memdisk /usr/lib/syslinux addons + # make memtest filename FAT16/8.3 compatible mv "${BUILD_OUTPUT}/boot/addons/memtest86+.bin" \ "${BUILD_OUTPUT}/boot/addons/memtest" @@ -893,19 +977,32 @@ if [ "$ARCH" = i386 ] || [ "$ARCH" = amd64 ] ; then fi # no "$TEMPLATE_DIRECTORY"/boot/addons fi # NO_ADDONS - if ! [ -d "${BUILD_OUTPUT}/boot/grub" ] ; then - mkdir -p "${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 + if [ -z "$NO_ADDONS" ] ; then + echo "source /boot/grub/addons.cfg" >> "${BUILD_OUTPUT}"/boot/grub/loopback.cfg fi - cp -a ${TEMPLATE_DIRECTORY}/boot/grub/* "$BUILD_OUTPUT"/boot/grub/ + 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/ + mkdir -p "${BUILD_OUTPUT}"/boot/grub/i386-pc/ + cp -a "${CHROOT_OUTPUT}"/usr/lib/grub/*-pc/*.mod "${BUILD_OUTPUT}"/boot/grub/i386-pc/ + cp -a "${CHROOT_OUTPUT}"/usr/lib/grub/*-pc/*.o "${BUILD_OUTPUT}"/boot/grub/i386-pc/ + cp -a "${CHROOT_OUTPUT}"/usr/lib/grub/*-pc/*.lst "${BUILD_OUTPUT}"/boot/grub/i386-pc/ 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/ + # copy modules for UEFI grub + mkdir -p "${BUILD_OUTPUT}"/boot/grub/x86_64-efi/ + cp -a "${CHROOT_OUTPUT}"/usr/lib/grub/x86_64-efi/*.{mod,lst} "${BUILD_OUTPUT}"/boot/grub/x86_64-efi/ + if ! [ -d "${TEMPLATE_DIRECTORY}"/GRML ] ; then log "Error: ${TEMPLATE_DIRECTORY}/GRML does not exist. Exiting." eerror "Error: ${TEMPLATE_DIRECTORY}/GRML does not exist. Exiting." ; eend 1 @@ -955,7 +1052,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 @@ -1002,7 +1099,7 @@ if [ "$ARCH" = i386 ] || [ "$ARCH" = amd64 ] ; then done echo "include options.cfg" >> "${BUILD_OUTPUT}/boot/isolinux/grmlmain.cfg" - if [ ! -n "$NO_ADDONS" ] ; then + if [ -z "$NO_ADDONS" ] ; then echo "include addons.cfg" >> "${BUILD_OUTPUT}/boot/isolinux/grmlmain.cfg" fi echo "include isoprompt.cfg" >> "${BUILD_OUTPUT}/boot/isolinux/grmlmain.cfg" @@ -1020,7 +1117,9 @@ if [ "$ARCH" = i386 ] || [ "$ARCH" = amd64 ] ; then else log "including ${DISTRI_NAME}.cfg in ${BUILD_OUTPUT}/boot/isolinux/distri.cfg" echo "include ${DISTRI_NAME}.cfg" > "${BUILD_OUTPUT}/boot/isolinux/distri.cfg" - [ -n "$NO_ADDONS" ] || echo "include addons.cfg" >> "${BUILD_OUTPUT}/boot/isolinux/distri.cfg" + if [ -z "$NO_ADDONS" ] ; then + echo "include addons.cfg" >> "${BUILD_OUTPUT}/boot/isolinux/distri.cfg" + fi fi fi @@ -1168,7 +1267,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 # }}} @@ -1248,7 +1347,7 @@ else # make a 2048-byte bootsector for El Torito dd if=/dev/zero of=boot/grub/toriboot.bin bs=512 count=4 2>/dev/null # those are in 2048-byte sectors, so 1 16 matches 4 63 below - echo 1 16 | mksh /usr/share/grml-live/scripts/bootgrub.mksh -B 11 | \ + echo 1 16 | mksh "${SCRIPTS_DIRECTORY}/bootgrub.mksh" -B 11 | \ dd of=boot/grub/toriboot.bin conv=notrunc 2>/dev/null fi log "$MKISOFS -V '${GRML_NAME} ${VERSION}' -publisher 'grml-live | grml.org' -l -r -J $BOOT_ARGS -o ${ISO_OUTPUT}/${ISO_NAME} ." @@ -1290,19 +1389,19 @@ else 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 + echo 4 63 | mksh "${SCRIPTS_DIRECTORY}/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 + mksh ${SCRIPTS_DIRECTORY}/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" + bailout 12 "isohybrid binary not found - please install syslinux/syslinux-common/syslinux-utils" else log "Creating hybrid ISO file with isohybrid method" einfo "Creating hybrid ISO file with isohybrid method" @@ -1314,9 +1413,14 @@ else # (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 - log "Detected uefi support for isohybrid, enabling" - einfo "Detected uefi support for isohybrid, enabling" - ISOHYBRID_OPTIONS=--uefi + 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}" @@ -1336,6 +1440,10 @@ else touch -r ${ISO_NAME} ${ISO_NAME}.md5 sha1sum ${ISO_NAME} > ${ISO_NAME}.sha1 && \ touch -r ${ISO_NAME} ${ISO_NAME}.sha1 + sha256sum ${ISO_NAME} > ${ISO_NAME}.sha256 && \ + touch -r ${ISO_NAME} ${ISO_NAME}.sha256 + sha512sum ${ISO_NAME} > ${ISO_NAME}.sha512 && \ + touch -r ${ISO_NAME} ${ISO_NAME}.sha512 fi ) ;; @@ -1371,10 +1479,18 @@ create_netbootpackage() { mkdir -p "$NETBOOT" - if ! [ -r "${CHROOT}/usr/lib/syslinux/pxelinux.0" ] ; then - ewarn "File /usr/lib/syslinux/pxelinux.0 not found in build chroot." ; eend 0 + # since syslinux v3:6.03~pre1+dfsg-4 the pxelinux.0 has been split into a + # separate pxelinux package + if [ -d "${CHROOT_OUTPUT}/usr/lib/PXELINUX/" ] ; then + local pxelinux_dir=/usr/lib/PXELINUX + else + local pxelinux_dir=/usr/lib/syslinux + fi + + if ! [ -r "${CHROOT_OUTPUT}/${pxelinux_dir}/pxelinux.0" ] ; then + ewarn "File ${pxelinux_dir}/pxelinux.0 not found in build chroot." ; eend 0 eindent - einfo "Install syslinux[-common] package in chroot to get a netboot package." + einfo "Install syslinux[-common]/pxelinux package in chroot to get a netboot package." eoutdent return 0 fi @@ -1386,19 +1502,30 @@ create_netbootpackage() { cp "${CHROOT_OUTPUT}"/boot/vmlinuz-* "$WORKING_DIR"/vmlinuz cp "${CHROOT_OUTPUT}"/boot/initrd.img-* "$WORKING_DIR"/initrd.img - cp "${CHROOT_OUTPUT}"/usr/lib/syslinux/pxelinux.0 "${WORKING_DIR}/pxelinux.0" + cp "${CHROOT_OUTPUT}/${pxelinux_dir}/pxelinux.0" "${WORKING_DIR}/pxelinux.0" + + if [ -r "${CHROOT_OUTPUT}"/usr/lib/syslinux/modules/bios/ldlinux.c32 ] ; then + cp "${CHROOT_OUTPUT}"/usr/lib/syslinux/modules/bios/ldlinux.c32 "${WORKING_DIR}"/ + fi mkdir -p "${WORKING_DIR}/pxelinux.cfg" 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 ( cd $(dirname "${OUTPUT_FILE}") sha1sum $(basename "${OUTPUT_FILE}") > "${OUTPUT_FILE}.sha1" + sha256sum $(basename "${OUTPUT_FILE}") > "${OUTPUT_FILE}.sha256" + sha512sum $(basename "${OUTPUT_FILE}") > "${OUTPUT_FILE}.sha512" ) einfo "Generated netboot package ${OUTPUT_FILE}" ; eend 0 rm -rf "${OUTPUTDIR}"