set -e
# global variables
-GRML_LIVE_VERSION='0.10.1'
+GRML_LIVE_VERSION='0.13.1'
PN="$(basename $0)"
CMDLINE="$0 $@"
SOURCES_LIST_FILE='/etc/grml/fai/apt/sources.list'
-u update existing chroot instead of rebuilding it from scratch
-v <version_number> specify version number of the release
-V increase verbosity in the build process
- -z use ZLIB instead of LZMA compression (depends on
- squashfs-tools version)
+ -z use ZLIB instead of LZMA/XZ compression
Usage examples:
[ -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='/etc/grml/fai/make-fai-nfsroot.conf'
[ -n "$RELEASENAME" ] || RELEASENAME='grml-live rocks'
[ -n "$SQUASHFS_EXCLUDES_FILE " ] || SQUASHFS_EXCLUDES_FILE='/etc/grml/fai/squashfs-excludes'
-[ -n "$SUITE" ] || SUITE='lenny'
+[ -n "$SUITE" ] || SUITE='squeeze'
[ -n "$TEMPLATE_DIRECTORY" ] || TEMPLATE_DIRECTORY='/usr/share/grml-live/templates'
[ -n "$USERNAME" ] || USERNAME='grml'
[ -n "$VERSION" ] || VERSION='0.0.1'
[ -n "$SUITE" ] && echo " Debian suite: $SUITE"
[ -n "$ARCH" ] && echo " Architecture: $ARCH"
[ -n "$BOOT_METHOD" ] && echo " Boot method: $BOOT_METHOD"
+ [ -n "$HYBRID_METHOD" ] && echo " Hybrid method: $HYBRID_METHOD"
[ -n "$TEMPLATE_DIRECTORY" ] && echo " Template files: $TEMPLATE_DIRECTORY"
[ -n "$CHROOT_INSTALL" ] && echo " Install files from directory to chroot: $CHROOT_INSTALL"
[ -n "$BOOTID" ] && echo " Boot identifier: $BOOTID"
[ -n "$DEFAULT_BOOTOPTIONS" ] && echo " Adding default bootoptions: \"$DEFAULT_BOOTOPTIONS\""
[ -n "$FAI_ARGS" ] && echo " Additional arguments for FAI: $FAI_ARGS"
[ -n "$LOGFILE" ] && echo " Logging to file: $LOGFILE"
- [ -n "$SQUASHFS_ZLIB" ] && echo " Using ZLIB (instead of LZMA) compression."
+ [ -n "$SQUASHFS_ZLIB" ] && echo " Using ZLIB (instead of LZMA/XZ) compression."
[ -n "$SQUASHFS_OPTIONS" ] && echo " Using SQUASHFS_OPTIONS ${SQUASHFS_OPTIONS}"
[ -n "$VERBOSE" ] && echo " Using VERBOSE mode."
[ -n "$UPDATE" ] && echo " Executing UPDATE instead of fresh installation."
fi
if [ -d "$CHROOT_OUTPUT/bin" -a -z "$UPDATE" -a -z "$BUILD_ONLY" ] ; then
- log "Skiping stage 'fai dirinstall' as $CHROOT_OUTPUT exists already."
- ewarn "Skiping stage 'fai dirinstall' as $CHROOT_OUTPUT exists already." ; eend 0
+ log "Skipping stage 'fai dirinstall' as $CHROOT_OUTPUT exists already."
+ ewarn "Skipping stage 'fai dirinstall' as $CHROOT_OUTPUT exists already." ; eend 0
else
mkdir -p "$CHROOT_OUTPUT" || bailout 5 "Problem with creating $CHROOT_OUTPUT for FAI"
fi
if [ -r "$CHECKLOG/shell.log" ] ; then
- grep 'FAILED with exit code' $CHECKLOG/shell.log >> $LOGFILE && ERROR=2
+ grep 'FAILED with exit code' $CHECKLOG/shell.log >> $LOGFILE && ERROR=6
fi
if [ -n "$ERROR" ] ; then
# generate addon list
rm "${BUILD_OUTPUT}/${ADDONS_LIST_FILE}"
- for name in $(ls "${BUILD_OUTPUT}"/boot/isolinux/addon_*.cfg) ; do
+ for name in "${BUILD_OUTPUT}"/boot/isolinux/addon_*.cfg ; do
include_name=$(basename "$name")
echo "include $include_name" >> "${BUILD_OUTPUT}/${ADDONS_LIST_FILE}"
done
# make sure we don't leave (even an empty) base.tgz:
[ -f "$CHROOT_OUTPUT/base.tgz" ] && rm -f "$CHROOT_OUTPUT/base.tgz"
- # $SQUASHFS_BINARY is specified in the configuration:
- if [ -n "$SQUASHFS_BINARY" ] ; then
- if which "$SQUASHFS_BINARY" >/dev/null 2>&1 ; then
- log "Using specified mksquashfs binary ${SQUASHFS_BINARY}"
- einfo "Using specified mksquashfs binary ${SQUASHFS_BINARY}" ; eend 0
- else
- log "Error: specified mksquashfs binary ($SQUASHFS_BINARY) not found. Exiting."
- eerror "Error: specified mksquashfs binary ($SQUASHFS_BINARY) not found. Exiting." ; eend 1
- bailout
- fi
- # no $SQUASHFS_BINARY configured, let's find the according binary:
- else
- # Note: this is ALL for backward compatibility and yes: it's serious PITA.
- # We'll definitely drop this once people build >=2.6.35-grml* only and
- # the squashfs-tools vs. squashfs-lzma-tools vs. squashfs-lzma-tools4 and
- # zlib/gzip vs. lzma situation is settling with new squashfs file format (v4)
-
- if ls $CHROOT_OUTPUT/boot/vmlinuz* >/dev/null 2>&1 ; then
- KERNEL_IMAGE="$(ls $CHROOT_OUTPUT/boot/vmlinuz* 2>/dev/null | sort -r | head -1)"
- else
- KERNEL_IMAGE="unset"
- fi
-
- case $KERNEL_IMAGE in
- *vmlinuz-2.6.31-grml*|*vmlinuz-2.6.33-grml*)
- SQUASHFS_BINARY='mksquashfs-lzma'
-
- # if using zlib compression kernel 2.6.3{1,3}-grml can be used with
- # mksquashfs as well, therefore try to fall back if mksquashfs-lzma
- # is NOT available
- if ! which $SQUASHFS_BINARY >/dev/null 2>&1 && [ -n "$SQUASHFS_ZLIB" ] ; then
- log "Squashfs binary $SQUASHFS_BINARY not available but building with zlib..."
- log "\`-> trying to fall back to mksquashfs."
- ewarn "Squashfs binary $SQUASHFS_BINARY not available but building with zlib..."
- ewarn "\`-> trying to fall back to mksquashfs."
- SQUASHFS_BINARY='mksquashfs'
- eend 0
- fi
- ;;
-
- *vmlinuz-2.6.35-grml*)
- SQUASHFS_BINARY='mksquashfs-lzma4'
-
- # if using zlib compression kernel 2.6.35-grml can be used with
- # mksquashfs-lzma as well, therefore try to fall back if
- # mksquashfs-lzma4 is NOT available
- if ! which $SQUASHFS_BINARY >/dev/null 2>&1 && [ -n "$SQUASHFS_ZLIB" ] ; then
- log "Squashfs binary $SQUASHFS_BINARY not available but building with zlib..."
- log "\`-> trying to fall back to mksquashfs-lzma."
- ewarn "Squashfs binary $SQUASHFS_BINARY not available but building with zlib..."
- ewarn "\`-> trying to fall back to mksquashfs-lzma."
- SQUASHFS_BINARY='mksquashfs-lzma'
- eend 0
- fi
-
- # squashfs-tools 1:4.0-x work with 2.6.35-grml as well with default
- # options, they just lack proper LZMA compression, so fall back as
- # last option and inform user
- if ! which $SQUASHFS_BINARY >/dev/null 2>&1 ; then
- log "Squashfs binary $SQUASHFS_BINARY not available either..."
- log "\`-> trying to fall back to mksquashfs, WARNING: very probably lacks LZMA compression."
- ewarn "Squashfs binary $SQUASHFS_BINARY not available either..."
- ewarn "\`-> trying to fall back to mksquashfs, WARNING: very probably lacks LZMA compression."
- SQUASHFS_BINARY='mksquashfs'
- eend 0
- fi
- ;;
-
- *vmlinuz-2.6.23-grml*|*vmlinuz-2.6.26-grml*|*vmlinuz-2.6.28-grml*)
- log "Strongly outdated kernel version detected: $KERNEL_IMAGE"
- eerror "Strongly outdated kernel version detected: $KERNEL_IMAGE"
- eerror "|-> please update kernel version of live system to at *least* 2.6.31-grml[64]..."
- eerror "\`-> or otherwise (not recommended though) set SQUASHFS_BINARY accordingly."
- eend 1
- bailout
- ;;
-
- *)
- SQUASHFS_BINARY='mksquashfs'
- log "Could not detect grml kernel version and SQUASHFS_BINARY is unset."
- ewarn "Could not detect grml kernel version and SQUASHFS_BINARY is unset."
- ewarn "\`-> Assuming you want to use mksquashfs binary, if it fails please override with \$SQUASHFS_BINARY."
- eend 0
- ;;
- esac
-
- # check whether we have the according binary available:
- if ! which $SQUASHFS_BINARY >/dev/null 2>&1 ; then
- log "Error: required mksquashfs binary (${SQUASHFS_BINARY}) could not be found. Exiting."
- eerror "Error: required mksquashfs binary (${SQUASHFS_BINARY}) could not be found. Exiting."
- eerror "|-> Make sure to install squashfs-tool, squashfs-lzma-tools and/or squashfs-lzma-tools4..."
- eerror "|-> ... and set \$SQUASHFS_BINARY accordingly to the kernel version."
- eerror "\`-> Visit http://grml.org/grml-live/#current_state for further details."
- eend 1
- bailout
- fi
+ # if unconfigured default to squashfs-tools' mksquashfs binary
+ if [ -z "$SQUASHFS_BINARY" ] ; then
+ SQUASHFS_BINARY='mksquashfs'
+ fi
- fi # end of SQUASHFS_BINARY handling
+ if which "$SQUASHFS_BINARY" >/dev/null 2>&1 ; then
+ log "Using mksquashfs binary ${SQUASHFS_BINARY}"
+ einfo "Using mksquashfs binary ${SQUASHFS_BINARY}" ; eend 0
+ else
+ log "Error: mksquashfs binary ($SQUASHFS_BINARY) not found. Exiting."
+ eerror "Error: mksquashfs binary ($SQUASHFS_BINARY) not found. Exiting." ; eend 1
+ bailout
+ fi
# use sane defaults if $SQUASHFS_OPTIONS isn't set
if [ -z "$SQUASHFS_OPTIONS" ] ; then
# use blocksize 256k as this gives best result with regards to time + compression
- [[ "$SQUASHFS_BINARY" == mksquashfs-lzma* ]] && SQUASHFS_OPTIONS="-b 256k"
+ SQUASHFS_OPTIONS="-b 256k"
- # set lzma compression by default, unless -z option has been specified on command line
+ # set lzma/xz compression by default, unless -z option has been specified on command line
if [ -z "$SQUASHFS_ZLIB" ] ; then
- case "$SQUASHFS_BINARY" in
- mksquashfs-lzma) SQUASHFS_OPTIONS="$SQUASHFS_OPTIONS -lzma";;
- mksquashfs-lzma4) SQUASHFS_OPTIONS="$SQUASHFS_OPTIONS -comp lzma";;
- esac
+ SQUASHFS_OPTIONS="$SQUASHFS_OPTIONS -comp xz"
fi
-
fi
# support exclusion of files via exclude-file:
SQUASHFS_OPTIONS="$SQUASHFS_OPTIONS -e initrd.img* vmlinuz*"
fi
- # be backwards compatible, for squashfs-tools 1:3.2r2-9exp1 and squashfs-lzma-tools 3.3-1,
- # make sure to drop the -nolzma option if it's not available:
- if echo "$SQUASHFS_OPTIONS" | grep -q -- "-nolzma" ; then
- if ! $SQUASHFS_BINARY --help 2>&1 | grep -q -- '-nolzma' ; then
- log "The $SQUASHFS_BINARY binary does NOT support the nolzma option, dropping it and using default mode."
- ewarn "The $SQUASHFS_BINARY binary does NOT support the nolzma option, dropping it and using default mode."
- SQUASHFS_OPTIONS="$(echo $SQUASHFS_OPTIONS | sed 's/-nolzma//g')"
- eend 0
- fi
- fi
-
- # if user doesn't want to use LZMA (e.g. running grml-live -z ...):
- if [ -n "$SQUASHFS_ZLIB" ] ; then
- if $SQUASHFS_BINARY --help 2>&1 | grep -q -- "-nolzma" ; then
- SQUASHFS_OPTIONS="$SQUASHFS_OPTIONS -nolzma"
- fi
- fi
-
# log stuff
SQUASHFS_STDERR="$(mktemp -t grml-live.XXXXXX)"
[ -n "$ISO_NAME" ] || ISO_NAME="${GRML_NAME}_${VERSION}.iso"
if [ "$BOOT_METHOD" = "isolinux" ] ; then
- BOOT_FILE="boot/isolinux/isolinux.bin -c boot/isolinux/boot.cat"
+ BOOT_ARGS="-no-emul-boot -boot-load-size 4 -boot-info-table -b boot/isolinux/isolinux.bin -c boot/isolinux/boot.cat"
elif [ "$BOOT_METHOD" = "grub" ] ; then
- BOOT_FILE="boot/grub/stage2"
+ BOOT_ARGS="-no-emul-boot -boot-load-size 4 -boot-info-table -b boot/grub/stage2"
+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.
+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."
+ HYBRID_METHOD='grub2'
+ eend 0
fi
if [ -f "${ISO_OUTPUT}/${ISO_NAME}" -a -z "$UPDATE" -a -z "$BUILD_ONLY" -a -z "$BUILD_DIRTY" -a "$FORCE_ISO_REBUILD" = "false" ] ; then
CURRENT_DIR=$(pwd)
if cd "$BUILD_OUTPUT" ; then
- log "$MKISOFS -V '${GRML_NAME} ${VERSION}' -publisher 'grml-live | grml.org' -l -r -J -no-emul-boot -boot-load-size 4 -boot-info-table -b $BOOT_FILE -o ${ISO_OUTPUT}/${ISO_NAME} ."
+ if [ "$BOOT_METHOD" = "grub2" ]; then
+ # 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 | \
+ 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} ."
"$MKISOFS" -V "${GRML_NAME} ${VERSION}" -publisher 'grml-live | grml.org' \
- -l -r -J -no-emul-boot -boot-load-size 4 -boot-info-table \
- -b $BOOT_FILE -no-pad \
+ -l -r -J $BOOT_ARGS -no-pad \
-o "${ISO_OUTPUT}/${ISO_NAME}" . ; RC=$?
+ # both of these need core.img there, so it’s easier to write it here
+ if [ "$BOOT_METHOD" = "grub2" ] || [ "$HYBRID_METHOD" = "grub2" ]; then
+ # must be <= 30720 bytes
+ dd if=boot/grub/core.img of="${ISO_OUTPUT}/${ISO_NAME}" \
+ conv=notrunc bs=512 seek=4 2>/dev/null
+ fi
# pad the output ISO to multiples of 256 KiB for partition table support
siz=$($getfilesize "${ISO_OUTPUT}/${ISO_NAME}")
fi
# by default use our manifold boot method:
else
+ # 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
- # pad to a whole of 2048 bytes (one CD sector)
- dd if=/dev/zero bs=512 count=3 2>/dev/null
- # append GRUB 2 (must be <=30720 bytes)
- cat boot/grub/core.img
- ) | dd of="${ISO_OUTPUT}/${ISO_NAME}" conv=notrunc 2>/dev/null
+ 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
fi
;;
esac
- cd $CURRENT_DIR
+ cd "$CURRENT_DIR"
fi
if [ "$RC" = 0 ] ; then