X-Git-Url: https://git.grml.org/?p=grml-debootstrap.git;a=blobdiff_plain;f=grml-debootstrap;h=97dc26b2b01ba3ede53bac3f6b6b068403157582;hp=17a8b1ceea8e44b046ab487c05895e6432c22c12;hb=HEAD;hpb=105ae6f490e3585802ab02bf0a9cfb447500ed75 diff --git a/grml-debootstrap b/grml-debootstrap index 17a8b1c..97dc26b 100755 --- a/grml-debootstrap +++ b/grml-debootstrap @@ -13,6 +13,12 @@ error_handler() { last_bash_command="$BASH_COMMAND" echo "Unexpected non-zero exit code $last_exit_code in ${BASH_SOURCE[*]} at line ${BASH_LINENO[*]} detected! last bash command: $last_bash_command" + if [ -r "$MNTPOINT/debootstrap/debootstrap.log" ] && \ + [ -s "$MNTPOINT/debootstrap/debootstrap.log" ] ; then + einfo "Presenting last ten lines of debootstrap.log:" + tail -10 "${MNTPOINT}"/debootstrap/debootstrap.log + einfo "End of debootstrap.log" + fi ## Check if "bailout" function is available. ## This is not the case in chroot-script. if command -v bailout >/dev/null 2>&1; then @@ -241,6 +247,32 @@ check4progs(){ } # }}} +# unmount mountpoint {{{ +try_umount() { + local tries=$1 + local mountpoint="$2" + + if ! mountpoint "$mountpoint" &>/dev/null ; then + return 0 + fi + + for (( try=1; try<=tries; try++ )); do + if [[ ${try} -eq ${tries} ]]; then + # Last time, show errors this time + umount "${mountpoint}" && return 0 + else + # Not last time, hide errors until fatal + if umount "${mountpoint}" 2>/dev/null ; then + return 0 + else + sleep 1 + fi + fi + done + return 1 # Tried enough +} +# }}} + # helper functions {{{ cleanup() { if [ -n "$CHROOT_VARIABLES" ] ; then @@ -251,14 +283,12 @@ cleanup() { einfo "Removing ${STAGES}" ; rmdir "$STAGES" || eend $? fi - if [ -n "$ARM_EFI_TARGET" ]; then - umount "${MNTPOINT}/boot/efi" >/dev/null 2>&1 - fi + try_umount 3 "${MNTPOINT}"/boot/efi # Remove temporary mountpoint again if echo "$MNTPOINT" | grep -q '/mnt/debootstrap\.' ; then if [ -d "$MNTPOINT" ] ; then - rmdir "$MNTPOINT" + rmdir "$MNTPOINT" || true fi fi @@ -272,24 +302,24 @@ cleanup() { fi done - [ -x "$MNTPOINT"/bin/umount ] && chroot "$MNTPOINT" umount -a >/dev/null 2>&1 + [ -x "$MNTPOINT"/bin/umount ] && chroot "$MNTPOINT" umount -a >/dev/null 2>&1 || true # 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 /run/udev /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 + [ -x "$MNTPOINT"/bin/umount ] && chroot "$MNTPOINT" umount $ARG >/dev/null 2>&1 || true + umount "$MNTPOINT"/$ARG >/dev/null 2>&1 || true done if [ -n "$ISODIR" ] ; then - [ -d "$MNTPOINT/$ISODIR" ] && umount "$MNTPOINT/$ISODIR" >/dev/null 2>&1 + try_umount 3 "$MNTPOINT/$ISODIR" >/dev/null 2>&1 || true fi if [ -n "$DIRECTORY" ] ; then einfo "Not unmounting $MNTPOINT as you requested me to install into a directory of your own choice." else einfo "Unmounting $MNTPOINT" - umount "$MNTPOINT" || eend $? + try_umount 3 "$MNTPOINT" fi if [ -n "$STAGES" ] ; then @@ -299,7 +329,7 @@ cleanup() { # remove directory only if we used the default with process id inside the name if echo "$MNTPOINT" | grep -q '/mnt/debootstrap\.' ; then - if test -d "$MNTPOINT" ; then + if [ -d "$MNTPOINT" ] ; then einfo "Removing directory ${MNTPOINT}" rmdir "$MNTPOINT" || eend $? fi @@ -346,6 +376,7 @@ stage() { # source main configuration file {{{ if [ -r /etc/debootstrap/config ] ; then + bash -n /etc/debootstrap/config # shellcheck disable=SC1091 . /etc/debootstrap/config fi @@ -354,11 +385,10 @@ fi # cmdline handling {{{ CMDLINE_OPTS=mirror:,iso:,release:,target:,mntpoint:,debopt:,defaultinterfaces,interactive,nodebootstrap,nointerfaces,nokernel,nopackages,filesystem:,config:,confdir:,packages:,chroot-scripts:,scripts:,post-scripts:,pre-scripts:,debconf:,vm,vmfile,vmsize:,vmefi,keep_src_list,hostname:,password:,nopassword,grmlrepos,backportrepos,bootappend:,grub:,efi:,arch:,insecure,verbose,help,version,force,debug,contrib,non-free,remove-configs,sshcopyid,sshcopyauth -_opt_temp=$(getopt --name grml-debootstrap -o +m:i:r:t:p:c:d:vhV --long \ - $CMDLINE_OPTS -- "$@") - -if [ $? != 0 ]; then - eerror "Try 'grml-debootstrap --help' for more information."; eend 1; exit 1 +if ! _opt_temp=$(getopt --name grml-debootstrap -o +m:i:r:t:p:c:d:vhV --long \ + $CMDLINE_OPTS -- "$@"); then + eerror "Try 'grml-debootstrap --help' for more information." + bailout 1 fi eval set -- "$_opt_temp" @@ -658,6 +688,7 @@ fi # source specified configuration file {{{ if [ -n "$CONFIGFILE" ] ; then einfo "Reading specified config file $CONFIGFILE." + bash -n "$CONFIGFILE" # shellcheck disable=SC1091 source=config if ! . "$CONFIGFILE" ; then eerror "Error reading config file $CONFIGFILE" ; bailout 1 @@ -905,10 +936,12 @@ while IFS= read -r i; do done < "$TMPFILE" ERRORFILE=$(mktemp) + +local RC=0 # shellcheck disable=SC2086 yes | mdadm --create "${TARGET}" --level="${RAIDLEVEL}" \ - --raid-devices="${NUM_PARTITIONS}" ${SELECTED_PARTITIONS} >/dev/null 2>$ERRORFILE -RC=$? + --raid-devices="${NUM_PARTITIONS}" ${SELECTED_PARTITIONS} >/dev/null 2>$ERRORFILE || RC=$? + if [ "$RC" = 0 ] ; then dialog --title "$PN" --msgbox \ "Creating $TARGET was successful." 0 0 @@ -966,9 +999,7 @@ format_efi_partition() { einfo "EFI partition $EFI seems to have a FAT filesystem, not modifying." else einfo "EFI partition $EFI doesn't seem to be formatted, creating filesystem." - mkfs.fat -F32 -n "EFI" "$EFI" - RC=$? - if [ ! $RC -eq 0 ] ; then + if ! mkfs.fat -F32 -n "EFI" "$EFI" ; then eerror "Error while creating filesystem on ${EFI}." bailout 1 fi @@ -1051,8 +1082,7 @@ elif [ -n "$INTERACTIVE" ] ; then Is this ok for you? Notice: selecting 'No' will exit ${PN}." dialog --title "$PN" --no-collapse \ - --yesno "$INFOTEXT" 0 0 - [ $? -eq 0 ] || bailout 0 + --yesno "$INFOTEXT" 0 0 || bailout 0 else # if not running automatic installation display configuration and prompt for execution: einfo "$PN [${VERSION}] - Please recheck configuration before execution:" @@ -1315,7 +1345,7 @@ mkfs() { einfo "Running $MKFS $MKFS_OPTS on $TARGET" # shellcheck disable=SC2086 - "$MKFS" $MKFS_OPTS "$TARGET" ; RC=$? + "$MKFS" $MKFS_OPTS "$TARGET" if [ "$FIXED_DISK_IDENTIFIERS" = "yes" ] ; then if ! echo "$MKFS" | grep -q "mkfs.ext" ; then @@ -1352,7 +1382,6 @@ mkfs() { # race conditions :-/ sleep 2 - eend $RC fi } # }}} @@ -1451,7 +1480,7 @@ prepare_vm() { fi # make sure loop module is present and a usable loop device exists - modprobe -q loop + modprobe loop || true if ! losetup -f >/dev/null 2>&1; then eerror "Error finding usable loop device" bailout 1 @@ -1459,7 +1488,7 @@ prepare_vm() { # if dm-mod isn't available then kpartx will fail with # "Is device-mapper driver missing from kernel? [...]" - modprobe -q dm-mod + modprobe dm-mod || true if ! grep -q 'device-mapper' /proc/misc >/dev/null 2>&1 ; then eerror "Device-mapper support missing in kernel." bailout 1 @@ -1483,7 +1512,7 @@ prepare_vm() { if [ "$ARCH" = 'arm64' ]; then einfo "Setting up GPT partitions for arm64" parted -s "${TARGET}" 'mklabel gpt' - parted -s "${TARGET}" 'mkpart EFI fat32 1MiB 10MiB' + parted -s "${TARGET}" 'mkpart ESP fat32 1MiB 10MiB' parted -s "${TARGET}" 'set 1 boot on' parted -s "${TARGET}" 'mkpart LINUX ext4 10MiB 100%' else @@ -1548,8 +1577,8 @@ grub_install() { fi if [ -n "${ARM_EFI_TARGET}" ]; then - mkdir -p "${MNTPOINT}/boot/efi" - if ! mount "${ARM_EFI_TARGET}" "${MNTPOINT}/boot/efi" ; then + mkdir -p "${MNTPOINT}"/boot/efi + if ! mount "${ARM_EFI_TARGET}" "${MNTPOINT}"/boot/efi ; then eerror "Error: Mounting ${ARM_EFI_TARGET} failed, can not continue." bailout 1 fi @@ -1672,19 +1701,14 @@ grub_install() { # workaround for Debian bug #918590 with lvm + udev: # WARNING: Device /dev/... not initialized in udev database even after waiting 10000000 microseconds - if mountpoint "${MNTPOINT}"/run/udev &>/dev/null ; then - einfo "Unmounting bind-mount /run/udev" - umount "${MNTPOINT}"/run/udev - fi + try_umount 3 "${MNTPOINT}"/run/udev - umount "${MNTPOINT}"/proc - umount "${MNTPOINT}"/sys - umount "${MNTPOINT}"/dev/pts + try_umount 3 "${MNTPOINT}"/proc + try_umount 3 "${MNTPOINT}"/sys + try_umount 3 "${MNTPOINT}"/dev/pts try_umount 3 "${MNTPOINT}"/dev - if [ -n "$VMEFI" ]; then - umount "${MNTPOINT}"/boot/efi - fi + try_umount 3 "${MNTPOINT}"/boot/efi } # }}} @@ -1695,11 +1719,9 @@ umount_target() { return 0 fi - if [ -n "${ARM_EFI_TARGET}" ]; then - umount "${MNTPOINT}/boot/efi" - fi + try_umount 3 "${MNTPOINT}"/boot/efi - umount "${MNTPOINT}" + try_umount 3 "${MNTPOINT}" kpartx -d "${ORIG_TARGET}" >/dev/null # Workaround for a bug in kpartx which doesn't clean up properly, # see Debian Bug #891077 and Github-PR grml/grml-debootstrap#112 @@ -1728,25 +1750,12 @@ debootstrap_system() { einfo "Executing: $DEBOOTSTRAP $ARCHCMD $DEBOOTSTRAP_OPT $RELEASE $MNTPOINT $ISO" # shellcheck disable=SC2086 "$DEBOOTSTRAP" $ARCHCMD $DEBOOTSTRAP_OPT "$RELEASE" "$MNTPOINT" "$ISO" - RC=$? else einfo "Running $DEBOOTSTRAP $DEBOOTSTRAP_OPT for release ${RELEASE}${ARCHINFO} using ${MIRROR}" einfo "Executing: $DEBOOTSTRAP $ARCHCMD $DEBOOTSTRAP_OPT $RELEASE $MNTPOINT $MIRROR" # shellcheck disable=SC2086 "$DEBOOTSTRAP" $ARCHCMD $DEBOOTSTRAP_OPT "$RELEASE" "$MNTPOINT" "$MIRROR" - RC=$? fi - - if [ $RC -ne 0 ] ; then - if [ -r "$MNTPOINT/debootstrap/debootstrap.log" ] && \ - [ -s "$MNTPOINT/debootstrap/debootstrap.log" ] ; then - einfo "Presenting last ten lines of debootstrap.log:" - tail -10 "${MNTPOINT}"/debootstrap/debootstrap.log - einfo "End of debootstrap.log" - fi - fi - - eend $RC } # }}} @@ -2029,28 +2038,6 @@ execute_post_scripts() { } # }}} -# unmount mountpoint {{{ -try_umount() { - local tries=$1 - local mountpoint="$2" - - for (( try=1; try<=tries; try++ )); do - if [[ ${try} -eq ${tries} ]]; then - # Last time, show errors this time - umount "${mountpoint}" && return 0 - else - # Not last time, hide errors until fatal - if umount "${mountpoint}" 2>/dev/null ; then - return 0 - else - sleep 1 - fi - fi - done - return 1 # Tried enough -} -# }}} - # execute chroot-script {{{ chrootscript() { if ! [ -r "$MNTPOINT/bin/chroot-script" ] ; then @@ -2065,13 +2052,12 @@ chrootscript() { mount -t devtmpfs udev "${MNTPOINT}"/dev mount -t devpts devpts "${MNTPOINT}"/dev/pts if [ "$DEBUG" = "true" ] ; then - chroot "$MNTPOINT" /bin/bash -x /bin/chroot-script ; RC=$? + chroot "$MNTPOINT" /bin/bash -x /bin/chroot-script else - chroot "$MNTPOINT" /bin/chroot-script ; RC=$? + chroot "$MNTPOINT" /bin/chroot-script fi try_umount 3 "$MNTPOINT"/dev/pts try_umount 3 "$MNTPOINT"/dev - eend $RC fi # finally get rid of chroot-script again, there's no good reason to @@ -2094,22 +2080,14 @@ umount_chroot() { fi if [ -n "$ISODIR" ] ; then - if grep -q "$ISODIR" /proc/mounts ; then - einfo "Unmount $MNTPOINT/$ISODIR" - umount "$MNTPOINT/$ISODIR" - fi + einfo "Unmount $MNTPOINT/$ISODIR" + try_umount 3 "$MNTPOINT/$ISODIR" fi - if grep -q "$MNTPOINT" /proc/mounts ; then - if mountpoint "${MNTPOINT}"/run/udev &>/dev/null ; then - einfo "Unmounting bind-mount /run/udev" - umount "${MNTPOINT}"/run/udev - fi + try_umount 3 "${MNTPOINT}"/run/udev - if [ -n "$PARTITION" ] ; then - einfo "Unmount $MNTPOINT" - umount "$MNTPOINT" - fi + if [ -n "$PARTITION" ] ; then + try_umount 3 "$MNTPOINT" fi } # }}} @@ -2152,11 +2130,8 @@ for i in format_efi_partition prepare_vm mkfs tunefs \ remove_configs umount_chroot grub_install umount_target fscktool ; do if stage "${i}" ; then "$i" - if [ $? -eq 0 ]; then - stage "${i}" 'done' && rm -f "${STAGES}/${i}" - else - bailout 2 "$i" - fi + stage "${i}" 'done' + rm -f "${STAGES}/${i}" fi done