X-Git-Url: http://git.grml.org/?p=grml-live.git;a=blobdiff_plain;f=grml-live;h=020e48335531896f1d30c13606aabf30fabeef53;hp=27e8e6ae04c1f6f553f9f862a96de9ea4b3abe1f;hb=d501c11085b6c048bf9f4bd186f5ac8d267b9ff6;hpb=a49d9355f0de16c7e14b789839101598983c451b diff --git a/grml-live b/grml-live index 27e8e6a..020e483 100755 --- a/grml-live +++ b/grml-live @@ -23,8 +23,10 @@ fi # disable for now since it seems to cause some problems # set -e +# The line following this line is patched by debian/rules. +GRML_LIVE_VERSION='***UNRELEASED***' + # global variables -GRML_LIVE_VERSION='0.17.0' PN="$(basename $0)" CMDLINE="$0 $@" ADDONS_LIST_FILE='/boot/isolinux/addons_list.cfg' @@ -39,13 +41,14 @@ $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 + -A clean build directories before and after running -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 -C configuration file for grml-live -d use specified date instead of build time as date of release -D use specified configuration directory instead of /etc/grml/fai + -e extract ISO and squashfs contents from iso_name -F force execution without prompting -g set the grml flavour name -h display short usage information and exit @@ -60,7 +63,6 @@ Usage: $PN [options, see as follows] -r release name -s Debian suite; values: etch, lenny, squeeze, sid -t place of the templates - -T unpack chroot tar archive before starting -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 @@ -120,6 +122,8 @@ BUILD_ONLY='' BUILD_DIRTY='' BOOTSTRAP_ONLY='' HOSTNAME='' +USERNAME='' +CONFIGDUMP='' # don't use colors/escape sequences if [ -r /lib/lsb/init-functions ] ; then @@ -146,6 +150,7 @@ LIVE_CONF=/etc/grml/grml-live.conf # umount all directories {{{ 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/sys 2>/dev/null || /bin/true umount $CHROOT_OUTPUT/dev/pts 2>/dev/null || /bin/true @@ -165,11 +170,12 @@ umount_all() { bailout() { rm -f /var/run/fai/fai_softupdate_is_running \ /var/run/fai/FAI_INSTALLATION_IN_PROGRESS + [ -n "$CONFIGDUMP" ] && rm -f "$CONFIGDUMP" [ -n "$SQUASHFS_STDERR" ] && rm -rf "$SQUASHFS_STDERR" umount_all [ -n "$1" ] && EXIT="$1" || EXIT="1" [ -n "$2" ] && eerror "$2">&2 - if [ -n "$PACK_ARTIFACTS" ]; then + if [ -n "$CLEAN_ARTIFACTS" ]; then log "Cleaning up" einfo "Cleaning up" [ -n "${BUILD_OUTPUT}" -a -d "${BUILD_OUTPUT}" ] && rm -r "${BUILD_OUTPUT}" @@ -185,7 +191,6 @@ bailout() { [ -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 "${NETBOOT}" -a -d "${NETBOOT}" ] && chown -R "${CHOWN_USER}:" "${NETBOOT}" - [ -n "${CHROOT_ARCHIVE}" -a -f "${CHROOT_ARCHIVE}" ] && chown -R "${CHOWN_USER}:" "${CHROOT_ARCHIVE}" eend 0 fi log "------------------------------------------------------------------------------" @@ -286,16 +291,17 @@ copy_addon_file() { # }}} # command line parsing {{{ -while getopts "a:C:c:d:D:g:i:I:o:r:s:t:T:U:v:AbBFnNqQuVz" opt; do +while getopts "a:C:c:d:D:e:g:i:I:o:r:s:t:U:v:AbBFnNqQuVz" opt; do case "$opt" in a) ARCH="$OPTARG" ;; - A) PACK_ARTIFACTS=1 ;; + A) CLEAN_ARTIFACTS=1 ;; b) BUILD_ONLY=1 ;; B) BUILD_DIRTY=1 ;; c) CLASSES="$OPTARG" ;; C) LOCAL_CONFIG="$(readlink -f $OPTARG)" ;; d) DATE="$OPTARG" ;; D) GRML_FAI_CONFIG="$(readlink -f $OPTARG)" ;; + e) EXTRACT_ISO_NAME="$(readlink -f $OPTARG)" ;; g) GRML_NAME="$OPTARG" ;; i) ISO_NAME="$OPTARG" ;; I) CHROOT_INSTALL="$OPTARG" ;; @@ -307,7 +313,6 @@ while getopts "a:C:c:d:D:g:i:I:o:r:s:t:T:U:v:AbBFnNqQuVz" opt; do r) RELEASENAME="$OPTARG" ;; s) SUITE="$OPTARG" ;; t) TEMPLATE_DIRECTORY="$OPTARG";; - T) UNPACK_CHROOT="$(readlink -f $OPTARG)" ;; v) VERSION="$OPTARG" ;; F) FORCE=1 ;; u) UPDATE=1 ;; @@ -370,7 +375,6 @@ fi [ -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" [ -n "$REPORTS" ] || REPORTS="${LOG_OUTPUT}/reports/" @@ -411,7 +415,7 @@ if [ -z "$FORCE" ] ; then [ -n "$LOCAL_CONFIG" ] && echo " Configuration: $LOCAL_CONFIG" [ -n "$GRML_FAI_CONFIG" ] && echo " Config directory: $GRML_FAI_CONFIG" echo " main directory: $OUTPUT" - [ -n "$UNPACK_CHROOT" ] && echo " Chroot from: $UNPACK_CHROOT" + [ -n "$EXTRACT_ISO_NAME" ] && echo " Extract ISO: $EXTRACT_ISO_NAME" [ -n "$CHROOT_OUTPUT" ] && echo " Chroot target: $CHROOT_OUTPUT" [ -n "$BUILD_OUTPUT" ] && echo " Build target: $BUILD_OUTPUT" [ -n "$ISO_OUTPUT" ] && echo " ISO target: $ISO_OUTPUT" @@ -434,7 +438,7 @@ if [ -z "$FORCE" ] ; then [ -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 "$CLEAN_ARTIFACTS" ] && echo " Will clean output before and after running." [ -n "$UPDATE" ] && echo " Executing UPDATE instead of fresh installation." if [ -n "$BOOTSTRAP_ONLY" ] ; then echo " Bootstrapping only and not building (files for) ISO." @@ -456,7 +460,7 @@ fi # }}} # clean up before start {{{ -if [ -n "${PACK_ARTIFACTS}" ]; then +if [ -n "${CLEAN_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}" @@ -517,25 +521,40 @@ log "$CMDLINE" einfo "Logging actions to logfile $LOGFILE" # }}} -# unpack chroot {{{ -if [ -n "${UNPACK_CHROOT}" ]; then - log "Unpacking chroot from ${UNPACK_CHROOT}" - einfo "Unpacking chroot from ${UNPACK_CHROOT}" - [ -d "$CHROOT_OUTPUT" ] || mkdir -p "${CHROOT_OUTPUT}" - tar -xf "${UNPACK_CHROOT}" -C "${CHROOT_OUTPUT}/" --strip-components 1 ; RC=$? - if [ "$RC" != 0 ] ; then +# dump config variables into file, for script access {{{ +CONFIGDUMP=$(mktemp) +set | egrep \ + '^(GRML_NAME|RELEASENAME|DATE|VERSION|SUITE|ARCH|DISTRI_NAME|USERNAME|HOSTNAME|APT_PROXY)=' \ + > ${CONFIGDUMP} +# }}} + +# unpack iso/squashfs {{{ +extract_iso() { +if [ -n "$EXTRACT_ISO_NAME" ]; then + log "Unpacking ISO from ${EXTRACT_ISO_NAME}" + einfo "Unpacking ISO from ${EXTRACT_ISO_NAME}" + local mountpoint=$(mktemp -d) + local rc=0 + mount -o loop "${EXTRACT_ISO_NAME}" "$mountpoint" ; rc=$? + if [ "$rc" != 0 ]; then + rmdir "$mountpoint" + log "mount failed" + eerror "mount failed" + eend 1 + bailout 1 + fi + unsquashfs -d "${CHROOT_OUTPUT}" "${mountpoint}"/live/*.squashfs ; rc=$? + umount "$mountpoint" + rmdir "$mountpoint" + if [ "$rc" != 0 ]; then + log "unsquashfs failed" + eerror "unsquashfs failed" eend 1 bailout 1 fi - eend 0 -fi -# }}} - -# cleanup CHROOT_ARCHIVE now {{{ -if [ -n "${PACK_ARTIFACTS}" ]; then - # can't do this earlier, as UNPACK_CHROOT might point to CHROOT_ARCHIVE - [ -n "${CHROOT_ARCHIVE}" -a -f "${CHROOT_ARCHIVE}" ] && rm "${CHROOT_ARCHIVE}" fi +} +extract_iso # }}} # on-the-fly configuration {{{ @@ -631,8 +650,8 @@ else 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_LOCAL_CONFIG=$LOCAL_CONFIG 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_LOCAL_CONFIG="$LOCAL_CONFIG" fai $VERBOSE \ + 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 \ -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 @@ -645,24 +664,6 @@ else 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 - else - einfo "Setting /etc/grml_version to $GRML_NAME $VERSION Release Codename $RELEASENAME [$DATE]" - log "Setting /etc/grml_version to $GRML_NAME $VERSION Release Codename $RELEASENAME [$DATE]" - echo "$GRML_NAME $VERSION Release Codename $RELEASENAME [$DATE]" > $CHROOT_OUTPUT/etc/grml_version - chmod 644 $CHROOT_OUTPUT/etc/grml_version - einfo "Rebuilding initramfs" - # make sure new /etc/grml_version reaches initramfs, iterate over all - # present kernel versions (note: we can't really handle more than one - # kernel version anyway right now) - # chroot $CHROOT_OUTPUT update-initramfs -u -t => might break when using kernel-package :( - for initrd in "$(basename $CHROOT_OUTPUT/boot/vmlinuz-*)" ; do - if ! chroot $CHROOT_OUTPUT update-initramfs -k "${initrd##vmlinuz-}" -c ; then - einfo "Creating fresh initrd did not work, trying update instead:" - log "Creating fresh initrd did not work, trying update instead:" - chroot $CHROOT_OUTPUT update-initramfs -k "${initrd##vmlinuz-}" -u - fi - done - eend $? fi # move fai logs into grml_logs directory @@ -806,7 +807,7 @@ if [ "$ARCH" = i386 ] || [ "$ARCH" = amd64 ] ; then # during build, so check for the file: INITRD="$(ls $CHROOT_OUTPUT/boot/initrd* 2>/dev/null| grep -v '.bak$' | sort -r | head -1)" if [ -n "$INITRD" ] ; then - cp $INITRD "$BUILD_OUTPUT"/boot/"${SHORT_NAME}"/initrd.gz + cp $INITRD "$BUILD_OUTPUT"/boot/"${SHORT_NAME}"/initrd.img find $CHROOT_OUTPUT/boot/ -name initrd\*.bak -exec rm {} \; else log "Error: No initrd found inside $CHROOT_OUTPUT/boot/ - Exiting" @@ -816,7 +817,7 @@ if [ "$ARCH" = i386 ] || [ "$ARCH" = amd64 ] ; then KERNEL_IMAGE="$(ls $CHROOT_OUTPUT/boot/vmlinuz* 2>/dev/null | sort -r | head -1)" if [ -n "$KERNEL_IMAGE" ] ; then - cp "$KERNEL_IMAGE" "$BUILD_OUTPUT"/boot/"${SHORT_NAME}"/linux26 + cp "$KERNEL_IMAGE" "$BUILD_OUTPUT"/boot/"${SHORT_NAME}"/vmlinuz else log "Error: No kernel found inside $CHROOT_OUTPUT/boot/ - Exiting" eerror "Error: No kernel found inside $CHROOT_OUTPUT/boot/ - Exiting" ; eend 1 @@ -882,7 +883,7 @@ if [ "$ARCH" = i386 ] || [ "$ARCH" = amd64 ] ; then if ! [ -d "${BUILD_OUTPUT}/boot/grub" ] ; then mkdir -p "${BUILD_OUTPUT}/boot/grub" fi - cp ${TEMPLATE_DIRECTORY}/boot/grub/* "$BUILD_OUTPUT"/boot/grub/ + cp -a ${TEMPLATE_DIRECTORY}/boot/grub/* "$BUILD_OUTPUT"/boot/grub/ # copy grub files from target cp -a "${CHROOT_OUTPUT}"/usr/lib/grub/*-pc/*.mod "${BUILD_OUTPUT}"/boot/grub/ @@ -950,6 +951,14 @@ if [ "$ARCH" = i386 ] || [ "$ARCH" = amd64 ] ; then fi done + for param in ARCH DATE DISTRI_INFO DISTRI_NAME DISTRI_SPLASH GRML_NAME SQUASHFS_NAME \ + RELEASE_INFO SHORT_NAME VERSION ; do + for file in $(find "${BUILD_OUTPUT}" -name "*%$param%*") ; do + value="$(eval echo '$'"$param")" + mv ${file} ${file/\%${param}\%/$value} + done + done + # adjust bootsplash accordingly but make sure the string has the according lenght SQUASHFS_NAME="$(cut_string 20 "$SQUASHFS_NAME")" SQUASHFS_NAME="$(extend_string_end 20 "$SQUASHFS_NAME")" @@ -1374,20 +1383,19 @@ create_netbootpackage() { mkdir -p "$WORKING_DIR" - cp "${CHROOT_OUTPUT}"/boot/vmlinuz-* "$WORKING_DIR"/linux26 + 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" + mkdir -p "${WORKING_DIR}/pxelinux.cfg" if [ -r "${BUILD_OUTPUT}/boot/isolinux/netboot.cfg" ] ; then - mkdir -p "${WORKING_DIR}/pxelinux.cfg/default" 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 fi - mkdir -p "${WORKING_DIR}/pxelinux.cfg" - if tar -C "$OUTPUTDIR" -jcf "${OUTPUT_FILE}" "grml_netboot_package_${GRML_NAME}_${VERSION}" ; then + sha1sum "${OUTPUT_FILE}" > "${OUTPUT_FILE}.sha1" einfo "Generated netboot package ${OUTPUT_FILE}" ; eend 0 rm -rf "${OUTPUTDIR}" else @@ -1400,16 +1408,6 @@ create_netbootpackage() { create_netbootpackage # }}} -# 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