X-Git-Url: https://git.grml.org/?p=grml-live.git;a=blobdiff_plain;f=grml-live;h=362f88cb0cb8e6766d3f62002081f146905f8282;hp=9e35a3db574208be12950b2a4c9e419642ec9975;hb=b63a5f16ac3f03eb93220fd26ab188e50314f5d0;hpb=990cf8d17f517f619e9c3887e60a4e3d19f70583 diff --git a/grml-live b/grml-live index 9e35a3d..362f88c 100755 --- a/grml-live +++ b/grml-live @@ -24,7 +24,7 @@ fi # set -e # global variables -GRML_LIVE_VERSION='0.15.0' +GRML_LIVE_VERSION='0.16.1' PN="$(basename $0)" CMDLINE="$0 $@" ADDONS_LIST_FILE='/boot/isolinux/addons_list.cfg' @@ -39,6 +39,7 @@ $PN - build process script for generating a (grml based) Linux Live-ISO Usage: $PN [options, see as follows] -a architecture; available values: i386 and amd64 + -A ensure clean build and pack artifacts -b build the ISO without updating the chroot via FAI -B build the ISO without touching the chroot (skips cleanup) -c classes to be used for building the ISO via FAI @@ -59,6 +60,7 @@ Usage: $PN [options, see as follows] -s Debian suite; values: etch, lenny, squeeze, sid -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 -z use ZLIB instead of LZMA/XZ compression @@ -118,6 +120,12 @@ BUILD_DIRTY='' BOOTSTRAP_ONLY='' HOSTNAME='' +# don't use colors/escape sequences +if [ -r /lib/lsb/init-functions ] ; then + . /lib/lsb/init-functions + ! log_use_fancy_output && NOCOLORS=true +fi + if [ -r /etc/grml/lsb-functions ] ; then . /etc/grml/lsb-functions else @@ -153,6 +161,24 @@ bailout() { umount_all [ -n "$1" ] && EXIT="$1" || EXIT="1" [ -n "$2" ] && eerror "$2">&2 + if [ -n "$PACK_ARTIFACTS" ]; then + log "Cleaning up" + einfo "Cleaning up" + [ -n "${BUILD_OUTPUT}" -a -d "${BUILD_OUTPUT}" ] && rm -r "${BUILD_OUTPUT}" + [ -n "${CHROOT_OUTPUT}" -a -d "${CHROOT_OUTPUT}" ] && rm -r "${CHROOT_OUTPUT}" + eend 0 + fi + if [ -n "$CHOWN_USER" ]; then + log "Setting ownership" + einfo "Setting ownership" + [ -n "${OUTPUT}" -a -d "${OUTPUT}" ] && chown -R "${CHOWN_USER}:" "${OUTPUT}" + [ -n "${BUILD_OUTPUT}" -a -d "${BUILD_OUTPUT}" ] && chown -R "${CHOWN_USER}:" "${BUILD_OUTPUT}" + [ -n "${CHROOT_OUTPUT}" -a -d "${CHROOT_OUTPUT}" ] && chown -R "${CHOWN_USER}:" "${CHROOT_OUTPUT}" + [ -n "${ISO_OUTPUT}" -a -d "${ISO_OUTPUT}" ] && chown -R "${CHOWN_USER}:" "${ISO_OUTPUT}" + [ -n "${LOG_OUTPUT}" -a -d "${LOG_OUTPUT}" ] && chown -R "${CHOWN_USER}:" "${LOG_OUTPUT}" + [ -n "${CHROOT_ARCHIVE}" -a -f "${CHROOT_ARCHIVE}" ] && chown -R "${CHOWN_USER}:" "${CHROOT_ARCHIVE}" + eend 0 + fi log "------------------------------------------------------------------------------" exit "$EXIT" } @@ -160,13 +186,6 @@ trap bailout 1 2 3 3 6 9 14 15 trap umount_all EXIT # }}} -# log file stuff {{{ -[ -n "$LOGFILE" ] || LOGFILE=/var/log/grml-live.log -touch $LOGFILE -chown root:adm $LOGFILE -chmod 664 $LOGFILE -# }}} - # some important functions {{{ # log output: @@ -214,23 +233,63 @@ extend_string_end() { done echo -ne "\n" } + +# Copy addonfile $1 from either +# * the chroot (via $2, the system path), +# * or from TEMPLATE_DIRECTORY/compat (if exists), +# * or from the host system (again, using $2), +# or warn about the missing file. +# +# 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 +# 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. +copy_addon_file() { + DEST="${BUILD_OUTPUT}/boot/$3" + if [ ! -d "${DEST}/" ]; then + mkdir -p "${DEST}" + fi + if [ -e "$CHROOT_OUTPUT/$2/$1" ]; then + log "Copying $1 from chroot" + cp "$CHROOT_OUTPUT/$2/$1" "${DEST}/" + return $? + fi + if [ -e "${TEMPLATE_DIRECTORY}/compat/$3/$1" ]; then + log "Copying $1 from grml-live-compat" + cp "${TEMPLATE_DIRECTORY}/compat/$3/$1" "${DEST}/" + return $? + fi + if [ -e "$2/$1" ]; then + log "Copying $1 from system" + cp "$2/$1" "${DEST}/" + return $? + fi + + msg="Missing addon file: \"$1\"" + ewarn "$msg" ; eend 1 + log "copy_addon_file: $msg" +} # }}} # read local (non-packaged) configuration {{{ LOCAL_CONFIG=/etc/grml/grml-live.local if [ -r "$LOCAL_CONFIG" ] ; then - log "Sourcing $LOCAL_CONFIG" . $LOCAL_CONFIG else - log "No $LOCAL_CONFIG found, not sourcing it" LOCAL_CONFIG='' fi # }}} # command line parsing {{{ -while getopts "a:C:c:d:D:g:i:I:o:r:s:t:v:bBFnNquVz" opt; do +while getopts "a:C:c:d:D:g:i:I:o:r:s:t:U:v:AbBFnNquVz" opt; do case "$opt" in a) ARCH="$OPTARG" ;; + A) PACK_ARTIFACTS=1 ;; b) BUILD_ONLY=1 ;; B) BUILD_DIRTY=1 ;; c) CLASSES="$OPTARG" ;; @@ -250,6 +309,7 @@ while getopts "a:C:c:d:D:g:i:I:o:r:s:t:v:bBFnNquVz" opt; do v) VERSION="$OPTARG" ;; F) FORCE=1 ;; u) UPDATE=1 ;; + U) CHOWN_USER="$OPTARG" ;; V) VERBOSE="-v" ;; z) SQUASHFS_ZLIB=1 ;; ?) echo "invalid option -$OPTARG" >&2; bailout 1 ;; @@ -284,7 +344,9 @@ shift $(($OPTIND - 1)) # set ARGV to the first not parsed commandline parameter [ -n "$OUTPUT" ] || OUTPUT='/grml/grml-live' [ -n "$BUILD_OUTPUT" ] || BUILD_OUTPUT="$OUTPUT/grml_cd" [ -n "$CHROOT_OUTPUT" ] || CHROOT_OUTPUT="$OUTPUT/grml_chroot" +[ -n "$CHROOT_ARCHIVE" ] || CHROOT_ARCHIVE="$OUTPUT/$(basename $CHROOT_OUTPUT).tgz" [ -n "$ISO_OUTPUT" ] || ISO_OUTPUT="$OUTPUT/grml_isos" +[ -n "$LOG_OUTPUT" ] || LOG_OUTPUT="$OUTPUT/grml_logs" # }}} # some misc checks before executing FAI {{{ @@ -337,12 +399,14 @@ if [ -z "$FORCE" ] ; then [ -n "$CHROOT_INSTALL" ] && echo " Install files from directory to chroot: $CHROOT_INSTALL" [ -n "$BOOTID" ] && echo " Boot identifier: $BOOTID" [ -n "$NO_BOOTID" ] && echo " Skipping bootid feature." + [ -n "$CHOWN_USER" ] && echo " Output owner: $CHOWN_USER" [ -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/XZ) compression." [ -n "$SQUASHFS_OPTIONS" ] && echo " Using SQUASHFS_OPTIONS ${SQUASHFS_OPTIONS}" [ -n "$VERBOSE" ] && echo " Using VERBOSE mode." + [ -n "$PACK_ARTIFACTS" ] && echo " Will prepare packed artifacts and ensure clean build." [ -n "$UPDATE" ] && echo " Executing UPDATE instead of fresh installation." if [ -n "$BOOTSTRAP_ONLY" ] ; then echo " Bootstrapping only and not building (files for) ISO." @@ -362,6 +426,25 @@ if [ -z "$FORCE" ] ; then fi # }}} +# clean up before start {{{ +if [ -n "${PACK_ARTIFACTS}" ]; then + echo "Wiping old artifacts" + [ -n "${CHROOT_OUTPUT}" -a -d "${CHROOT_OUTPUT}" ] && rm -r "${CHROOT_OUTPUT}" + [ -n "${BUILD_OUTPUT}" -a -d "${BUILD_OUTPUT}" ] && rm -r "${BUILD_OUTPUT}" + [ -n "${ISO_OUTPUT}" -a -d "${ISO_OUTPUT}" ] && rm -r "${ISO_OUTPUT}" + [ -n "${LOG_OUTPUT}" -a -d "${LOG_OUTPUT}" ] && rm -r "${LOG_OUTPUT}" + [ -n "${CHROOT_ARCHIVE}" -a -f "${CHROOT_ARCHIVE}" ] && rm "${CHROOT_ARCHIVE}" +fi +# }}} + +# create log file {{{ +[ -n "$LOGFILE" ] || LOGFILE=${LOG_OUTPUT}/grml-live.log +mkdir -p $(dirname "${LOGFILE}") +touch $LOGFILE +chown root:adm $LOGFILE +chmod 664 $LOGFILE +# }}} + # clean/zero/remove logfiles {{{ if [ -n "$PRESERVE_LOGFILE" ] ; then @@ -398,6 +481,9 @@ fi start_seconds=$(cut -d . -f 1 /proc/uptime) log "------------------------------------------------------------------------------" log "Starting grml-live [${GRML_LIVE_VERSION}] run on $(date)" +if [ -n "$LOCAL_CONFIG" ]; then + log "Using local config file: $LOCAL_CONFIG" +fi log "Executed grml-live command line:" log "$CMDLINE" @@ -579,11 +665,15 @@ else eend $? fi + # move fai logs into grml_logs directory + mkdir -p "$LOG_OUTPUT"/fai/ + cp -r "$CHROOT_OUTPUT"/var/log/fai/"$HOSTNAME"/last/* "$LOG_OUTPUT"/fai/ + chown root:adm "$LOG_OUTPUT"/fai/* + chmod 664 "$LOG_OUTPUT"/fai/* + rm -rf "$CHROOT_OUTPUT"/var/log/fai + # Remove all FAI logs from chroot if class RELEASE is used: - if [ -f "$CHROOT_OUTPUT"/etc/grml_fai_release ] ; then - rm -rf "$CHROOT_OUTPUT"/var/log/fai/* - rm -f "$CHROOT_OUTPUT"/var/log/install_packages.list - fi + rm -f "$CHROOT_OUTPUT"/var/log/install_packages.list umount_all @@ -658,21 +748,6 @@ if [ "$ARCH" = i386 ] || [ "$ARCH" = amd64 ] ; then [ -d "$BUILD_OUTPUT"/boot/isolinux ] || mkdir -p "$BUILD_OUTPUT"/boot/isolinux [ -d "$BUILD_OUTPUT"/boot/"${SHORT_NAME}" ] || mkdir -p "$BUILD_OUTPUT"/boot/"${SHORT_NAME}" - if [ -z "$NO_ADDONS" ] ; then - [ -d "$BUILD_OUTPUT"/boot/addons ] || mkdir -p "$BUILD_OUTPUT"/boot/addons - if [ -r "$TEMPLATE_DIRECTORY"/boot/addons/memtest ] ; then - log "Installing $TEMPLATE_DIRECTORY/boot/addons/memtest" - cp "$TEMPLATE_DIRECTORY"/boot/addons/memtest "$BUILD_OUTPUT"/boot/addons/memtest - elif [ -r /boot/memtest86+.bin ] ; then - log "Installing /boot/memtest86+.bin" - cp /boot/memtest86+.bin "$BUILD_OUTPUT"/boot/addons/memtest - else - ewarn "No memtest binary found (either install package grml-live-addons or memtest86+), skipping." - log "No memtest binary found (either install package grml-live-addons or memtest86+), skipping." - eend 0 - fi - fi - # if we don't have an initrd we a) can't boot and b) there was an error # during build, so check for the file: INITRD="$(ls $CHROOT_OUTPUT/boot/initrd* 2>/dev/null| grep -v '.bak$' | sort -r | head -1)" @@ -701,8 +776,13 @@ if [ "$ARCH" = i386 ] || [ "$ARCH" = amd64 ] ; then bailout 8 fi + # copy _required_ isolinux files + for file in ifcpu64.c32 isolinux.bin vesamenu.c32; do + copy_addon_file "${file}" /usr/lib/syslinux isolinux + done + # *always* copy files to output directory so the variables - # get adjusted according to the build + # get adjusted according to the build. cp ${TEMPLATE_DIRECTORY}/boot/isolinux/* "$BUILD_OUTPUT"/boot/isolinux/ if [ -n "$NO_ADDONS" ] ; then @@ -713,6 +793,18 @@ 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_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 + done + + # make memtest filename FAT16/8.3 compatible + mv "${BUILD_OUTPUT}/boot/addons/memtest86+.bin" \ + "${BUILD_OUTPUT}/boot/addons/memtest" + # copy only files so we can handle bsd4grml on its own for file in ${TEMPLATE_DIRECTORY}/boot/addons/* ; do test -f $file && cp $file "$BUILD_OUTPUT"/boot/addons/ @@ -725,25 +817,39 @@ if [ "$ARCH" = i386 ] || [ "$ARCH" = amd64 ] ; then if [ -d "$TEMPLATE_DIRECTORY"/boot/addons/bsd4grml ] ; then cp -a ${TEMPLATE_DIRECTORY}/boot/addons/bsd4grml "$BUILD_OUTPUT"/boot/addons/ else - log "bsd4grml addon not found, skipping therefore." - ewarn "bsd4grml addon not found, skipping therefore." ; eend 0 + log "Missing addon file: bsd4grml" + ewarn "Missing addon file: bsd4grml" ; eend 0 fi fi fi # no "$TEMPLATE_DIRECTORY"/boot/addons fi # NO_ADDONS - if ! [ -d ${TEMPLATE_DIRECTORY}/boot/grub ] ; then - log "grub templates do not exist, skipping therefore." - ewarn "grub templates do not exist, skipping therefore." ; eend 0 - else - if ! [ -d "${BUILD_OUTPUT}/boot/grub" ] ; then - cp -a ${TEMPLATE_DIRECTORY}/boot/grub "$BUILD_OUTPUT"/boot/ - fi + if ! [ -d "${BUILD_OUTPUT}/boot/grub" ] ; then + mkdir -p "${BUILD_OUTPUT}/boot/grub" + fi + cp ${TEMPLATE_DIRECTORY}/boot/grub/* "$BUILD_OUTPUT"/boot/grub/ - # make sure we have recent template files available, otherwise updating - # the strings like $GRML_NAME and $VERSION might be out of date - cp ${TEMPLATE_DIRECTORY}/boot/grub/* "$BUILD_OUTPUT"/boot/grub/ + if [ -e ${TEMPLATE_DIRECTORY}/compat/grub/linux.mod ]; then + cp "${TEMPLATE_DIRECTORY}"/compat/grub/* "${BUILD_OUTPUT}"/boot/grub/ + else + if ! which "grub-mkimage" >/dev/null 2>&1 ; then + log "grub-mkimage not found, skipping Grub step therefore." ; eend 0 + ewarn "grub-mkimage not found, skipping Grub step therefore." + ewarn "Please install grub-pc-bin or grub-common >= 1.98+20100804-14." ; eend 0 + elif ! grub-mkimage --help | grep -q -- --format ; then + log "grub-mkimage does not support --format=i386-pc, skipping Grub step therefore." ; eend 0 + ewarn "grub-mkimage does not support --format=i386-pc, skipping Grub step therefore." + ewarn "Please install grub-common >= 1.98+20100804-14 or grub-pc-bin." ; eend 0 + else + # copy system grub files if grml-live-compat is not installed + cp -a /usr/lib/grub/*-pc/*.mod "${BUILD_OUTPUT}"/boot/grub/ + cp -a /usr/lib/grub/*-pc/*.o "${BUILD_OUTPUT}"/boot/grub/ + cp -a /usr/lib/grub/*-pc/*.lst "${BUILD_OUTPUT}"/boot/grub/ + cp -a /usr/share/grub/ascii.pf2 "${BUILD_OUTPUT}"/boot/grub/ + grub-mkimage -d /usr/lib/grub/*-pc -o \ + "${BUILD_OUTPUT}/boot/grub/core.img" biosdisk iso9660 --format=i386-pc + fi fi if ! [ -d "${TEMPLATE_DIRECTORY}"/GRML ] ; then @@ -861,7 +967,7 @@ if [ "$ARCH" = i386 ] || [ "$ARCH" = amd64 ] ; then log 'Using console based isolinux method as requested via $ISOLINUX_METHOD.' einfo 'Using console based isolinux method as requested via $ISOLINUX_METHOD.' if grep -q '^include console.cfg' "${BUILD_OUTPUT}/boot/isolinux/distri.cfg" ; then - einfo "include for console.cfg already foud, nothing to do." + einfo "include for console.cfg already found, nothing to do." eend 0 else log "including console.cfg in ${BUILD_OUTPUT}/boot/isolinux/isolinux.cfg" @@ -872,45 +978,17 @@ if [ "$ARCH" = i386 ] || [ "$ARCH" = amd64 ] ; then else log 'Using graphical boot menu.' if grep -q '^include vesamenu.cfg' "${BUILD_OUTPUT}/boot/isolinux/isolinux.cfg" ; then - log "include for vesamenu.cfg already foud, nothing to do." + log "include for vesamenu.cfg already found, nothing to do." else log "including vesamenu.cfg in ${BUILD_OUTPUT}/boot/isolinux/isolinux.cfg" echo "include vesamenu.cfg" >> "${BUILD_OUTPUT}/boot/isolinux/isolinux.cfg" fi fi - # jump back to grub from bsd4grml (/boot/grub/stage2): - GRUB_LEGACY=stage2 - if [ -e "$BUILD_OUTPUT"/boot/addons/bsd4grml/boot.6 ]; then - if [ -e "$BUILD_OUTPUT"/boot/grub/core.img ]; then - GRUB_VERSION=2 - else - GRUB_VERSION=1 - fi - - for file in "$BUILD_OUTPUT"/boot/addons/bsd4grml/boot.6 \ - "$BUILD_OUTPUT"/boot/addons/bsd4grml/boot.cfg \ - "$BUILD_OUTPUT"/boot/isolinux/*.cfg \ - "$BUILD_OUTPUT"/boot/grub/grub.cfg \ - "$BUILD_OUTPUT"/boot/grub/menu.lst ; do - if [ -e "$file" ] ; then - sed -i -e "s!%GRUB_VERSION%!$GRUB_VERSION!g" \ - -e "s!%GRUB_LEGACY%!$GRUB_LEGACY!g" "$file" - fi - done - sed -i "s/%RELEASE_INFO%/$GRML_NAME $VERSION - $RELEASENAME/" "$BUILD_OUTPUT"/boot/addons/bsd4grml/boot.6 fi - if [ -e "$BUILD_OUTPUT"/boot/grub/$GRUB_LEGACY ]; then - sed -i "s/%GRUB_LEGACY%/$GRUB_LEGACY/g" "$BUILD_OUTPUT"/boot/grub/menu.lst - sed -i "s/%GRUB_LEGACY%/$GRUB_LEGACY/g" "$BUILD_OUTPUT"/boot/grub/grub.cfg - elif [ -e "$BUILD_OUTPUT"/boot/grub/menu.lst -a -e "$BUILD_OUTPUT"/boot/grub/grub.cfg ] ; then - sed -i "/%GRUB_LEGACY%/d" "$BUILD_OUTPUT"/boot/grub/menu.lst - sed -i "/%GRUB_LEGACY%/d" "$BUILD_OUTPUT"/boot/grub/grub.cfg - fi - DPKG_LIST="/var/log/fai/$HOSTNAME/last/dpkg.list" # the dpkg --list output of the chroot if ! [ -r "$DPKG_LIST" ] ; then ewarn "$DPKG_LIST could not be read, ignoring to store package information on ISO therefore." @@ -1038,8 +1116,6 @@ fi if [ "$BOOT_METHOD" = "isolinux" ] ; then 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_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 @@ -1179,6 +1255,16 @@ else fi # }}} +# pack artifacts {{{ +if [ -n "$PACK_ARTIFACTS" ]; then + log "Packing artifcats" + einfo "Packing artifacts" + [ -f "${CHROOT_ARCHIVE}" ] && rm -r "${CHROOT_ARCHIVE}" + tar -c -a -f ${CHROOT_ARCHIVE} --preserve-permissions -C "$(dirname ${CHROOT_OUTPUT})" "$(basename ${CHROOT_OUTPUT})" + eend 0 +fi +# }}} + # log build information to database if grml-live-db is installed and enabled {{{ dpkg_to_db() { if [ -d /usr/share/grml-live-db ] ; then