X-Git-Url: https://git.grml.org/?p=grml-debootstrap.git;a=blobdiff_plain;f=grml-debootstrap;h=dba64341c500f8c10c6b302b70d2cc3b9eb3996f;hp=cf9d00b15b8d1f1793f71cee9bff1fb7e4978a79;hb=0de1bb148af138894da4b535852157bbbb2b056a;hpb=d59e47cba3c8c775ebedf7a1ff3b2e3e2dee63b8 diff --git a/grml-debootstrap b/grml-debootstrap index cf9d00b..dba6434 100755 --- a/grml-debootstrap +++ b/grml-debootstrap @@ -6,6 +6,38 @@ # License: This file is licensed under the GPL v2+ ################################################################################ +# error_handler {{{ +[ -n "$REPORT_TRAP_ERR" ] || REPORT_TRAP_ERR='no' +[ -n "$FAIL_TRAP_ERR" ] || FAIL_TRAP_ERR='no' + +error_handler() { + last_exit_code="$?" + last_bash_command="$BASH_COMMAND" + if [ "$REPORT_TRAP_ERR" = "yes" ]; then + echo "Unexpected non-zero exit code $last_exit_code in $BASH_SOURCE at line $BASH_LINENO detected! +last bash command: $last_bash_command" + fi + if [ ! "$FAIL_TRAP_ERR" = "yes" ]; then + return + fi + ## Check if "bailout" function is available. + ## This is not the case in chroot-script. + if command -v bailout >/dev/null 2>&1; then + bailout 1 + else + echo 'FAIL_TRAP_ERR is set to "yes", exit 1.' + exit 1 + fi +} + +if [ "$REPORT_TRAP_ERR" = "yes" ] || [ "$FAIL_TRAP_ERR" = "yes" ]; then + set -E + set -o pipefail + trap "error_handler" ERR + export -f "error_handler" +fi +# }}} + # variables {{{ PN="$(basename "$0")" if [[ -d "$(dirname "$(which "$0")")"/.git ]]; then @@ -112,6 +144,8 @@ Configuration options: --grmlrepos Enable Grml's Debian repository (deb.grml.org). --backportrepos Enable Debian's backports repository (backports.debian.org). --keep_src_list Do not overwrite user provided apt sources.list. + --contrib Enable 'contrib' in COMPONENTS (defaults to 'main' only). + --non-free Enable non-free in COMPONENTS (defaults to 'main' only). --hostname Hostname of Debian system. --nopassword Do not prompt for the root password. --password Use specified password as password for user root. @@ -225,7 +259,7 @@ cleanup() { # ugly, but make sure we really don't leave anything (/proc /proc and # /dev /dev are intended, trying to work around timing issues, see #657023) - for ARG in /sys /proc /proc /dev /dev ; do + for ARG in /sys /proc /proc /dev/pts /dev/pts /dev /dev ; do [ -x "$MNTPOINT"/bin/umount ] && chroot "$MNTPOINT" umount $ARG >/dev/null 2>&1 umount "$MNTPOINT"/$ARG >/dev/null 2>&1 done @@ -362,6 +396,11 @@ fi [ "$_opt_verbose" ] && VERBOSE="-v" [ "$_opt_debug" ] && DEBUG="true" +# make sure main is always included +[ -z "$COMPONENTS" ] && COMPONENTS="main" +[ "$_opt_contrib" ] && COMPONENTS="$COMPONENTS contrib" +[ "$_opt_non_free" ] && COMPONENTS="$COMPONENTS non-free" + if [ "$DEBUG" = "true" ] ; then set -x fi @@ -389,7 +428,7 @@ fi # make sure we have what we need {{{ if [ -n "$VIRTUAL" ] ; then - check4progs grub-mkimage kpartx mksh parted qemu-img || bailout 1 + check4progs kpartx mksh parted qemu-img || bailout 1 fi # }}} @@ -535,6 +574,7 @@ prompt_for_release() squeeze Debian/6.0 \ wheezy Debian/7.0 \ jessie Debian/8.0 \ + stretch Debian/9.0 \ sid Debian/unstable)" [ $? -eq 0 ] || bailout } @@ -838,7 +878,7 @@ fi # Support for generic release codenames is unavailable. {{{ if [ "$RELEASE" = "stable" ] || [ "$RELEASE" = "testing" ] ; then eerror "Generic release codenames (stable, testing) are unsupported. \ -Please use specific codenames such as lenny, squeeze, wheezy or jessie." ; eend 1 +Please use specific codenames such as lenny, squeeze, wheezy, jessie or stretch." ; eend 1 bailout 1 fi # }}} @@ -955,10 +995,19 @@ mkfs() { # make sure /dev/disk/by-uuid/... is up2date, otherwise grub # will fail to detect the uuid in the chroot - if echo "$TARGET" | grep -q "/dev/md" ; then + if [ -n "$VIRTUAL" ] ; then + einfo "Virtual environment doesn't require blockdev --rereadpt, skipping therefore" + elif echo "$TARGET" | grep -q "/dev/md" ; then blockdev --rereadpt "${TARGET}" - elif ! [ -n "$VIRTUAL" ] ; then - blockdev --rereadpt "${TARGET%%[0-9]*}" + else + # if we deploy to /dev/sdX# then let's see if /dev/sdX exists + local main_device="${TARGET%%[0-9]*}" + # sanity check to not try to e.g. access /dev/loop if we get /dev/loop0 + if [ -f "/sys/block/$(basename ${main_device})/$(basename ${TARGET})/dev" ] ; then + blockdev --rereadpt "$main_device" + else + einfo "No underlying block device for $TARGET identified, skipping blockdev --rereadpt." + fi fi # give the system 2 seconds, otherwise we might run into # race conditions :-/ @@ -1036,7 +1085,7 @@ prepare_vm() { einfo "Adjusting disk signature to a fixed (non-random) value" MBRTMPFILE=$(mktemp) dd if="${TARGET}" of="${MBRTMPFILE}" bs=512 count=1 - echo -en "\x41\x41\x41\x41\x41" | dd of="${MBRTMPFILE}" conv=notrunc seek=440 bs=1 + echo -en "\x41\x41\x41\x41" | dd of="${MBRTMPFILE}" conv=notrunc seek=440 bs=1 dd if="${MBRTMPFILE}" of="${TARGET}" conv=notrunc eend $? fi @@ -1092,11 +1141,15 @@ finalize_vm() { bailout 1 fi - einfo "Installing Grub as bootloader." mount -t proc none "${MNTPOINT}"/proc mount -t sysfs none "${MNTPOINT}"/sys mount --bind /dev "${MNTPOINT}"/dev + mount --bind /dev/pts "${MNTPOINT}"/dev/pts +# Has chroot-script installed GRUB to MBR using grub-install (successfully), already? +# chroot-script skips installation for unset ${GRUB} +if [[ -z "${GRUB}" ]] || ! dd if="${GRUB}" bs=512 count=1 2>/dev/null | cat -v | fgrep -q GRUB; then + einfo "Installing Grub as bootloader." mkdir -p "${MNTPOINT}/boot/grub" if ! [ -d "${MNTPOINT}"/usr/lib/grub/i386-pc/ ] ; then eerror "Error: grub not installed inside Virtual Machine. Can not install bootloader." ; eend 1 @@ -1114,6 +1167,7 @@ finalize_vm() { chroot "${MNTPOINT}" grub-mkimage -O i386-pc -p "(hd0,msdos1)/boot/grub" -o /tmp/core.img biosdisk part_msdos ext2 dd if="${MNTPOINT}/tmp/core.img" of="${ORIG_TARGET}" conv=notrunc seek=4 rm -f "${MNTPOINT}/tmp/core.img" +fi einfo "Updating grub configuration file." if [ -n "$BOOT_APPEND" ] ; then @@ -1122,6 +1176,14 @@ finalize_vm() { chroot "${MNTPOINT}" update-grub case "$RELEASE" in + jessie) + einfo "Applying workaround for GRUB font path bug in jessie (Debian #787685)." + mkdir -p "${MNTPOINT}/boot/grub/fonts/" + cp "${MNTPOINT}/usr/share/grub/unicode.pf2" "${MNTPOINT}/boot/grub/fonts/" + ;; + esac + + case "$RELEASE" in lenny|squeeze|wheezy) einfo "Adjusting grub.cfg for successful boot sequence." sed -i "s;root=[^ ]\+;root=UUID=$TARGET_UUID;" "${MNTPOINT}"/boot/grub/grub.cfg @@ -1130,6 +1192,7 @@ finalize_vm() { umount "${MNTPOINT}"/proc umount "${MNTPOINT}"/sys + umount "${MNTPOINT}"/dev/pts try_umount 3 "${MNTPOINT}"/dev umount "${MNTPOINT}" kpartx -d "${ORIG_TARGET}" >/dev/null @@ -1189,6 +1252,7 @@ preparechroot() { [ -n "$ARCH" ] && echo "ARCH='$(sed "s,','\\\\'',g" <<<"${ARCH}")'" >> "$CHROOT_VARIABLES" [ -n "$BACKPORTREPOS" ] && echo "BACKPORTREPOS='$(sed "s,','\\\\'',g" <<<"${BACKPORTREPOS}")'" >> "$CHROOT_VARIABLES" [ -n "$CHROOT_SCRIPTS" ] && echo "CHROOT_SCRIPTS='$(sed "s,','\\\\'',g" <<<"${CHROOT_SCRIPTS}")'" >> "$CHROOT_VARIABLES" + [ -n "$COMPONENTS" ] && echo "COMPONENTS='$(sed "s,','\\\\'',g" <<<"${COMPONENTS}")'" >> "$CHROOT_VARIABLES" [ -n "$CONFFILES" ] && echo "CONFFILES='$(sed "s,','\\\\'',g" <<<"${CONFFILES}")'" >> "$CHROOT_VARIABLES" [ -n "$DEBCONF" ] && echo "DEBCONF='$(sed "s,','\\\\'',g" <<<"${DEBCONF}")'" >> "$CHROOT_VARIABLES" [ -n "$DEBIAN_FRONTEND" ] && echo "DEBIAN_FRONTEND='$(sed "s,','\\\\'',g" <<<"${DEBIAN_FRONTEND}")'" >> "$CHROOT_VARIABLES" @@ -1394,11 +1458,13 @@ chrootscript() { else einfo "Executing chroot-script now" mount --bind /dev "$MNTPOINT"/dev + mount --bind /dev/pts "$MNTPOINT"/dev/pts if [ "$DEBUG" = "true" ] ; then - chroot "$MNTPOINT" /bin/sh -x /bin/chroot-script ; RC=$? + chroot "$MNTPOINT" /bin/bash -x /bin/chroot-script ; RC=$? else chroot "$MNTPOINT" /bin/chroot-script ; RC=$? fi + try_umount 3 "$MNTPOINT"/dev/pts try_umount 3 "$MNTPOINT"/dev eend $RC fi