X-Git-Url: https://git.grml.org/?a=blobdiff_plain;f=grml-debootstrap;h=19d7a52922195a295226c8789ede2eba267f37bc;hb=9b2cf8303e8e403b1bd9eaa5dbf6f3e795a4f426;hp=126cb418bd07fc81155be9b640405078f596ff7b;hpb=c9ccc3c0277c5a0747a14af360ba7518e6834aca;p=grml-debootstrap.git diff --git a/grml-debootstrap b/grml-debootstrap index 126cb41..19d7a52 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,9 +283,7 @@ cleanup() { einfo "Removing ${STAGES}" ; rmdir "$STAGES" || eend $? fi - if findmnt "${MNTPOINT}"/boot/efi &>/dev/null ; then - umount "${MNTPOINT}"/boot/efi - fi + try_umount 3 "${MNTPOINT}"/boot/efi # Remove temporary mountpoint again if echo "$MNTPOINT" | grep -q '/mnt/debootstrap\.' ; then @@ -282,14 +312,14 @@ cleanup() { done if [ -n "$ISODIR" ] ; then - [ -d "$MNTPOINT/$ISODIR" ] && umount "$MNTPOINT/$ISODIR" >/dev/null 2>&1 || true + 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 @@ -1342,10 +1372,28 @@ mkfs() { # 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 + if ! [ -f "/sys/block/$(basename "${main_device}")/$(basename "${TARGET}")/dev" ] ; then einfo "No underlying block device for $TARGET identified, skipping blockdev --rereadpt." + else + udevadm settle + # ensure we give blockdev up to 30 seconds/retries + local timeout=30 + local success=0 + while [ "$timeout" -gt 0 ] ; do + ((timeout--)) + if blockdev --rereadpt "${main_device}" ; then + success=1 + break + else + ewarn "Failed to reread partition table of ${main_device} [${timeout} retries left]" + sleep 1 + fi + done + + if [ "${success}" = "0" ] ; then + eerror "Error: failed to reread partition table, giving up." + bailout 1 + fi fi fi # give the system 2 seconds, otherwise we might run into @@ -1671,19 +1719,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 findmnt "${MNTPOINT}"/boot/efi &>/dev/null ; then - umount "${MNTPOINT}"/boot/efi - fi + try_umount 3 "${MNTPOINT}"/boot/efi } # }}} @@ -1694,11 +1737,9 @@ umount_target() { return 0 fi - if findmnt "${MNTPOINT}"/boot/efi &>/dev/null ; 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 @@ -1733,16 +1774,6 @@ debootstrap_system() { # shellcheck disable=SC2086 "$DEBOOTSTRAP" $ARCHCMD $DEBOOTSTRAP_OPT "$RELEASE" "$MNTPOINT" "$MIRROR" 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 - } # }}} @@ -2025,28 +2056,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 @@ -2089,22 +2098,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 } # }}}