X-Git-Url: https://git.grml.org/?p=grml-debootstrap.git;a=blobdiff_plain;f=grml-debootstrap;h=97dc26b2b01ba3ede53bac3f6b6b068403157582;hp=364df6c710bda1164970be204d0d6602138d80a1;hb=HEAD;hpb=d911a370375ab59d74e9129b21e76549a1bde63b diff --git a/grml-debootstrap b/grml-debootstrap index 364df6c..97dc26b 100755 --- a/grml-debootstrap +++ b/grml-debootstrap @@ -5,44 +5,40 @@ # Bug-Reports: see https://grml.org/bugs/ # License: This file is licensed under the GPL v2+ ################################################################################ +# shellcheck disable=SC2001,SC2181 # 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! + 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 + 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 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 -E - set -o pipefail - trap "error_handler" ERR - export -f "error_handler" -fi +set -e +set -E +set -o pipefail +trap "error_handler" ERR +export -f "error_handler" # }}} # variables {{{ PN="$(basename "$0")" if [[ -d "$(dirname "$(command -v "$0")")"/.git ]]; then - VERSION="$(git --git-dir $(dirname "$(command -v "$0")")/.git describe | sed 's|^v||')" + VERSION="$(git --git-dir "$(dirname "$(command -v "$0")")"/.git describe | sed 's|^v||')" else VERSION="$(dpkg-query --show --showformat='${Version}' "$PN")" fi @@ -251,23 +247,49 @@ 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 - einfo "Removing ${CHROOT_VARIABLES}" ; rm "$CHROOT_VARIABLES" ; eend $? + einfo "Removing ${CHROOT_VARIABLES}" ; rm "$CHROOT_VARIABLES" || eend $? fi if [ -n "$STAGES" ] ; then - einfo "Removing ${STAGES}" ; rmdir "$STAGES" ; eend $? + 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 - rmdir "$MNTPOINT" 2>/dev/null + if [ -d "$MNTPOINT" ] ; then + rmdir "$MNTPOINT" || true + fi fi # make sure $TARGET is not mounted when exiting grml-debootstrap @@ -280,25 +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 @@ -308,27 +329,28 @@ cleanup() { # remove directory only if we used the default with process id inside the name if echo "$MNTPOINT" | grep -q '/mnt/debootstrap\.' ; then - einfo "Removing directory ${MNTPOINT}" - rmdir "$MNTPOINT" - eend $? + if [ -d "$MNTPOINT" ] ; then + einfo "Removing directory ${MNTPOINT}" + rmdir "$MNTPOINT" || eend $? + fi fi fi fi if [ -n "${ORIG_TARGET}" ] ; then einfo "Removing loopback mount of file ${ORIG_TARGET}." - kpartx -d "${ORIG_TARGET}" + kpartx -d "${ORIG_TARGET}" || eend $? # Workaround for a bug in kpartx which doesn't clean up properly, # see Debian Bug #891077 and Github-PR grml/grml-debootstrap#112 if dmsetup ls | grep -q "^${LOOP_PART} "; then - kpartx -d "/dev/${LOOP_DISK}" >/dev/null + kpartx -d "/dev/${LOOP_DISK}" >/dev/null || eend $? fi - eend $? fi } # we want to exit smoothly and clean: bailout(){ + eend "$1" || true cleanup @@ -354,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 @@ -362,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" @@ -545,11 +567,11 @@ done CONFFILES=$_opt_confdir einfo "Using config files under $CONFFILES/." if ! [ -r "$CONFFILES/config" ] ; then - eerror "Error: config file $CONFFILES/config not found."; eend 1; bailout 1 + eerror "Error: config file $CONFFILES/config not found."; bailout 1 fi # shellcheck disable=SC1091 source=config if ! . "$CONFFILES/config" ; then - eerror "Error reading config file $CONFFILES/config" ; eend 1 ; bailout 1 + eerror "Error reading config file $CONFFILES/config" ; bailout 1 fi # restore the command line parameter value CONFFILES=$_opt_confdir @@ -601,7 +623,7 @@ done [ "$_opt_contrib" ] && COMPONENTS="$COMPONENTS contrib" case "${RELEASE}" in - lenny|squeeze|wheezy|jessie|stretch|buster|bullseye) + jessie|stretch|buster|bullseye) [ "$_opt_non_free" ] && COMPONENTS="$COMPONENTS non-free" ;; *) @@ -618,20 +640,17 @@ fi if [ "$_opt_grub" ] && [ "$_opt_vmfile" ] ; then eerror "The --grub option is incompatible with --vmfile, please drop it from your command line." eerror "The --grub option is unneeded as GRUB will be installed automatically (unless GRUB_INSTALL='no')." - eend 1 bailout 1 fi if [ "${_opt_sshcopyid}" ] && [ "${_opt_sshcopyauth}" ] ; then eerror "The --sshcopyid option is incompatible with --sshcopyauth, please drop either of them from your command line." - eend 1 bailout 1 fi if [ -n "$ISO" ] && [[ "$DEBOOTSTRAP" =~ mmdebstrap$ ]] ; then eerror "The ISO option is incompatible with usage of mmdebstrap for bootstrapping." eerror "Either drop the --iso ... option or use plain debootstrap instead." - eend 1 bailout 1 fi @@ -669,9 +688,10 @@ 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" ; eend 1 ; bailout 1 + eerror "Error reading config file $CONFIGFILE" ; bailout 1 fi fi # }}} @@ -681,14 +701,12 @@ if [ -n "$GROOT" ] ; then eerror "Error: you seem to have \$GROOT configured." eerror "This variable is no longer supported, please visit the" eerror "grml-debootstrap documentation for details." - eend 1 bailout 1 fi if echo "$GRUB" | grep -q '^hd' ; then eerror "Error: this syntax for the grub configuration variable is no longer supported." eerror "Please do not use hd... any longer but /dev/sdX instead." - eend 1 bailout 1 fi # }}} @@ -713,8 +731,7 @@ prompt_for_target() dialog --title "$PN" --trim \ --msgbox "Sorry, no partitions found. Please configure your harddisks (see /proc/partitions) using a tool like fdisk, - cfdisk, gpart, gparted,..." 0 0 - bailout 1 + cfdisk, gpart, gparted,..." 0 0 || bailout 1 fi PARTITION_LIST=$(for i in $AVAILABLE_PARTITIONS ; do @@ -727,8 +744,7 @@ prompt_for_target() # shellcheck disable=SC2086 TARGET=$(dialog --title "$PN" --single-quoted --stdout \ --menu "Please select the target partition:" 0 0 0 \ - $PARTITION_LIST) - [ $? -eq 0 ] || bailout 1 + $PARTITION_LIST) || bailout 1 } # }}} @@ -776,8 +792,7 @@ prompt_for_bootmanager() --menu "Where do you want to install the bootmanager grub?" 0 0 0 \ mbr "install bootmanager into $MBRPART" \ nowhere "do not install bootmanager at all" \ - ${ADDITIONAL_PARAMS}) - [ $? -eq 0 ] || bailout 3 + ${ADDITIONAL_PARAMS}) || bailout 3 IFS="$OIFS" case "$GETMBR" in @@ -812,8 +827,8 @@ prompt_for_release() buster Debian/10 \ bullseye Debian/11 \ bookworm Debian/12 \ - sid Debian/unstable)" - [ $? -eq 0 ] || bailout + sid Debian/unstable)" \ + || bailout } # }}} @@ -822,8 +837,7 @@ prompt_for_hostname() { HOSTNAME="$(dialog --stdout --title "${PN}" --inputbox \ "Please enter the hostname you would like to use for installation:" \ - 0 0 "$HOSTNAME")" - [ $? -eq 0 ] || bailout + 0 0 "$HOSTNAME")" || bailout } # }}} @@ -839,13 +853,11 @@ prompt_for_password() ROOTPW2='PW2' while [ "$ROOTPW1" != "$ROOTPW2" ]; do ROOTPW1=$(dialog --insecure --stdout --title "${PN}" --passwordbox \ - "Please enter the password for the root account:" 10 60) - [ $? -eq 0 ] || bailout + "Please enter the password for the root account:" 10 60) || bailout ROOTPW2=$(dialog --insecure --stdout --title "${PN}" --passwordbox \ "Please enter the password for the root account again for \ - confirmation:" 10 60) - [ $? -eq 0 ] || bailout + confirmation:" 10 60) || bailout if [ "$ROOTPW1" != "$ROOTPW2" ]; then dialog --stdout --title "${PN}" --ok-label \ @@ -866,20 +878,18 @@ prompt_for_mirror() net "install via network (downloading from mirror)" \ local "install from local directory/mirror" ) - [ $? -eq 0 ] || bailout if [ "$CHOOSE_MIRROR" = 'net' ] ; then [ -n "$MIRROR" ] || MIRROR='http://deb.debian.org/debian' MIRROR="$(dialog --stdout --title "${PN}" --inputbox \ "Please enter Debian mirror you would like to use for installing packages." \ - 0 0 $MIRROR)" - [ $? -eq 0 ] || bailout + 0 0 $MIRROR)" || bailout + else # CHOOSE_MIRROR == local [ -n "$ISO" ] || ISO='/mnt/mirror' ISO="$(dialog --stdout --title "${PN}" --inputbox \ "Please enter directory name you would like to use for installing packages." \ - 0 0 $ISO)" - [ $? -eq 0 ] || bailout + 0 0 $ISO)" || bailout fi } # }}} @@ -902,8 +912,7 @@ TARGET=$(dialog --stdout --title "$PN" --default-item /dev/md0 \ --menu "Which device do you want to use for ${RAIDLEVEL}? Notice: activated devices will not be listed for security reasons. Anyway, please make sure the selected device is not in use already!" 0 0 0 \ -$MD_LIST) -[ $? -eq 0 ] || bailout 20 +$MD_LIST) || bailout 20 AVAILABLE_PARTITIONS=$(LANG=C fdisk -l 2>/dev/null | \ sed 's/*//' | \ @@ -917,8 +926,8 @@ PARTITION_LIST=$(for i in $AVAILABLE_PARTITIONS ; do # shellcheck disable=SC2086 dialog --title "$PN" --separate-output \ --checklist "Please select the partitions you would like to use for your $RAIDLEVEL on ${TARGET}:" 0 0 0 \ - $PARTITION_LIST 2>"$TMPFILE" -[ $? -eq 0 ] || bailout + $PARTITION_LIST 2>"$TMPFILE" || bailout + SELECTED_PARTITIONS="$(cat "$TMPFILE")" NUM_PARTITIONS=0 @@ -926,17 +935,13 @@ while IFS= read -r i; do NUM_PARTITIONS=$(( NUM_PARTITIONS + 1 )) done < "$TMPFILE" -# force metadata version 0.90 for lenny so old grub can boot from this array. -METADATA_VERSION="" -if [ "$RELEASE" = "lenny" ]; then - METADATA_VERSION="-e0" -fi - ERRORFILE=$(mktemp) + +local RC=0 # shellcheck disable=SC2086 yes | mdadm --create "${TARGET}" --level="${RAIDLEVEL}" \ - --raid-devices="${NUM_PARTITIONS}" ${METADATA_VERSION} ${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 @@ -994,11 +999,8 @@ 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}." - eend 1 bailout 1 fi fi @@ -1034,14 +1036,16 @@ efi_support() { checkconfiguration() { -if efi_support ; then - if [ -z "$_opt_efi" ] ; then - ewarn "EFI support detected but no --efi option given, please consider enabling it." - fi -else - if [ -n "$_opt_efi" ] ; then - eerror "EFI option used but no EFI support detected." - bailout 1 +if [ -z "$VIRTUAL" ] ; then + if efi_support ; then + if [ -z "$_opt_efi" ] ; then + ewarn "EFI support detected but no --efi option given, please consider enabling it." + fi + else + if [ -n "$_opt_efi" ] ; then + eerror "EFI option used but no EFI support detected." + bailout 1 + fi fi fi @@ -1078,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:" @@ -1126,7 +1129,7 @@ else # if not running automatic installation display configuration and prompt fo einfon "Is this ok for you? [y/N] " read -r a if ! [ "$a" = 'y' ] || [ "$a" = 'Y' ] ; then - eerror "Exiting as requested." ; eend 1 + eerror "Exiting as requested." bailout 1 fi fi @@ -1176,7 +1179,7 @@ fi if [ -z "${ARCH:-}" ] ; then eerror 'Architecture neither set (environment variable ARCH), nor could be automatically identified (using dpkg).' - eerror 'Consider setting the --arch ... option.' ; eend 1 + eerror 'Consider setting the --arch ... option.' bailout 1 fi # }}} @@ -1185,7 +1188,7 @@ fi CURRENT_ARCH="$(uname -m)" if [ "$CURRENT_ARCH" != "x86_64" ] ; then if [ "$ARCH" = "amd64" ] ; then - eerror "It is not possible to build amd64 on $CURRENT_ARCH. Consider installing and booting the 'linux-image-amd64' kernel or using '--arch i386' instead." ; eend 1 + eerror "It is not possible to build amd64 on $CURRENT_ARCH. Consider installing and booting the 'linux-image-amd64' kernel or using '--arch i386' instead." bailout 1 fi fi @@ -1194,7 +1197,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 bullseye or bookworm." ; eend 1 +Please use specific codenames such as bullseye or bookworm." bailout 1 fi # }}} @@ -1206,7 +1209,7 @@ if [ -n "$TARGET" ] ; then SHORT_TARGET="${TARGET##*/}" else eerror "Please adjust $CONFFILES/config or..." - eerror "... use the interactive version for configuration before running ${0}" ; eend 1 + eerror "... use the interactive version for configuration before running ${0}" bailout 1 fi # }}} @@ -1220,7 +1223,7 @@ fi if [ -r "$STAGES"/grml-debootstrap ] ; then if grep -q 'done' "${STAGES}/grml-debootstrap" ; then eerror "Error: grml-debootstrap has been executed already, won't continue therefore." - eerror "If you want to re-execute grml-debootstrap just manually remove ${STAGES}" ; eend 1 + eerror "If you want to re-execute grml-debootstrap just manually remove ${STAGES}" fi fi # }}} @@ -1248,7 +1251,7 @@ else # $TARGET was not detected as block device, but we do not want to create target directory in /dev/ if [[ $TARGET == "/dev/"* ]]; then eerror "Error: Will not create target directory $TARGET in /dev." - eerror " Please check the partition(s) of the blockdevice."; eend 1 + eerror " Please check the partition(s) of the blockdevice." bailout 1 fi set_target_directory @@ -1283,7 +1286,7 @@ mkfs() { fi if grep -q "$TARGET" /proc/mounts ; then - eerror "$TARGET already mounted, exiting to avoid possible damage. (Manually unmount $TARGET)" ; eend 1 + eerror "$TARGET already mounted, exiting to avoid possible damage. (Manually unmount $TARGET)" bailout 1 fi @@ -1303,7 +1306,7 @@ mkfs() { # so disable this feature for older Debian releases where it's known to be unsupported if [ -n "$MKFS" ] && [ "$MKFS" = "mkfs.ext4" ] ; then case "$RELEASE" in - lenny|squeeze|wheezy|jessie) + jessie) # assume a more recent version if we can't identify the version via dpkg-query local e2fsprogs_version e2fsprogs_version="$(dpkg-query --show --showformat='${Version}' e2fsprogs 2>/dev/null || echo 1.44)" @@ -1320,7 +1323,7 @@ mkfs() { # Disable this feature for Debian releases older than bookworm if [ -n "$MKFS" ] && [ "$MKFS" = "mkfs.ext4" ] ; then case "$RELEASE" in - lenny|squeeze|wheezy|jessie|stretch|buster|bullseye) + jessie|stretch|buster|bullseye) local e2fsprogs_version # assume a more recent version if we can't identify the version via dpkg-query e2fsprogs_version="$(dpkg-query --show --showformat='${Version}' e2fsprogs 2>/dev/null || echo 1.47)" @@ -1337,31 +1340,26 @@ mkfs() { if [ -n "${ARM_EFI_TARGET}" ] ; then einfo "Running mkfs.fat $MKFS_OPTS on $ARM_EFI_TARGET" mkfs.fat -n "EFI" "$ARM_EFI_TARGET" - eend $? - MKFS_OPTS="$MKFS_OPTS -L LINUX" fi 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 eerror "Not changing disk uuid for $TARGET because $MKFS doesn't seem to match for ext{2,3,4} file system" - eend 1 bailout 1 else einfo "Changing disk uuid for $TARGET to fixed (non-random) value $DISK_IDENTIFIER using tune2fs" tune2fs "$TARGET" -U "$DISK_IDENTIFIER" /dev/null 2>&1; then - eerror "Error finding usable loop device" ; eend 1 + eerror "Error finding usable loop device" bailout 1 fi # 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." ; eend 1 + eerror "Device-mapper support missing in kernel." bailout 1 fi @@ -1520,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 @@ -1531,7 +1523,6 @@ prepare_vm() { dd if="${TARGET}" of="${MBRTMPFILE}" bs=512 count=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 parted -s "${TARGET}" 'mkpart primary ext4 4MiB 100%' parted -s "${TARGET}" 'set 1 boot on' @@ -1540,7 +1531,7 @@ prepare_vm() { DEVINFO=$(kpartx -asv "$TARGET") # e.g. 'add map loop0p1 (254:5): 0 20477 linear 7:0 3' - will be multi-line for arm64 if [ -z "${DEVINFO}" ] ; then - eerror "Error setting up loopback device." ; eend 1 + eerror "Error setting up loopback device." bailout 1 fi @@ -1564,7 +1555,7 @@ prepare_vm() { export TARGET="/dev/mapper/$LOOP_PART" # '/dev/mapper/loop0p1' if [ -z "$TARGET" ] ; then - eerror "Error: target could not be set to according /dev/mapper/* device." ; eend 1 + eerror "Error: target could not be set to according /dev/mapper/* device." bailout 1 fi } @@ -1581,14 +1572,14 @@ grub_install() { fi if ! mount "${TARGET}" "${MNTPOINT}" ; then - eerror "Error: Mounting ${TARGET} failed, can not continue." ; eend 1 + eerror "Error: Mounting ${TARGET} failed, can not continue." bailout 1 fi if [ -n "${ARM_EFI_TARGET}" ]; 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." ; eend 1 + 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 fi @@ -1615,18 +1606,10 @@ grub_install() { 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 + eerror "Error: grub not installed inside Virtual Machine. Can not install bootloader." bailout 1 fi - - case "$RELEASE" in - lenny|squeeze|wheezy) - cp "${MNTPOINT}"/usr/lib/grub/i386-pc/* "${MNTPOINT}/boot/grub/" - ;; - *) - cp -a "${MNTPOINT}"/usr/lib/grub/i386-pc "${MNTPOINT}/boot/grub/" - ;; - esac + cp -a "${MNTPOINT}"/usr/lib/grub/i386-pc "${MNTPOINT}/boot/grub/" if [ -n "$VMEFI" ]; then @@ -1689,7 +1672,11 @@ grub_install() { einfo "Setting up bind-mount /run/udev" mkdir -p "${MNTPOINT}"/run/udev mount --bind /run/udev "${MNTPOINT}"/run/udev - eend $? + fi + + if [ -n "${BOOT_APPEND}" ] ; then + echo "Adding BOOT_APPEND configuration ['${BOOT_APPEND}'] to /etc/default/grub." + sed -i "/GRUB_CMDLINE_LINUX_DEFAULT/ s#\"\$# ${BOOT_APPEND}\"#" "${MNTPOINT}/etc/default/grub" fi einfo "Updating grub configuration file." @@ -1714,20 +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 - eend $? - 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 } # }}} @@ -1738,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 @@ -1771,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 } # }}} @@ -1802,55 +1768,53 @@ preparechroot() { touch "$CHROOT_VARIABLES" chmod 600 "$CHROOT_VARIABLES" # make sure nobody except root can read it echo "# Configuration of ${PN}" > "$CHROOT_VARIABLES" - # Resorting to sed(1) for escaping since "VAR='${VAR//\'/\'\\\'\'}'" does not work with all versions of Bash, - # e.g. not with 4.2.37(1)-release (a.k.a 4.2+dfsg-0.1+deb7u3) of Debian wheezy - [ -n "$ARCH" ] && echo "ARCH='$(sed "s,','\\\\'',g" <<<"${ARCH}")'" >> "$CHROOT_VARIABLES" - [ -n "$BACKPORTREPOS" ] && echo "BACKPORTREPOS='$(sed "s,','\\\\'',g" <<<"${BACKPORTREPOS}")'" >> "$CHROOT_VARIABLES" - [ -n "$BOOT_APPEND" ] && echo "BOOT_APPEND='$(sed "s,','\\\\'',g" <<<"${BOOT_APPEND}")'" >> "$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" - [ -n "$DEBOOTSTRAP" ] && echo "DEBOOTSTRAP='$(sed "s,','\\\\'',g" <<<"${DEBOOTSTRAP}")'" >> "$CHROOT_VARIABLES" - [ -n "$DEFAULT_LOCALES" ] && echo "DEFAULT_LOCALES='$(sed "s,','\\\\'',g" <<<"${DEFAULT_LOCALES}")'" >> "$CHROOT_VARIABLES" - [ -n "$DEFAULT_LANGUAGE" ] && echo "DEFAULT_LANGUAGE='$(sed "s,','\\\\'',g" <<<"${DEFAULT_LANGUAGE}")'" >> "$CHROOT_VARIABLES" - [ -n "$EXTRAPACKAGES" ] && echo "EXTRAPACKAGES='$(sed "s,','\\\\'',g" <<<"${EXTRAPACKAGES}")'" >> "$CHROOT_VARIABLES" - [ -n "$EFI" ] && echo "EFI='$(sed "s,','\\\\'',g" <<<"${EFI}")'" >> "$CHROOT_VARIABLES" - [ -n "$FALLBACK_MIRROR" ] && echo "FALLBACK_MIRROR='$(sed "s,','\\\\'',g" <<<"${FALLBACK_MIRROR}")'" >> "$CHROOT_VARIABLES" - [ -n "$FILESYSTEM" ] && echo "FILESYSTEM='$(sed "s,','\\\\'',g" <<<"${FILESYSTEM}")'" >> "$CHROOT_VARIABLES" - [ -n "$FORCE" ] && echo "FORCE='$(sed "s,','\\\\'',g" <<<"${FORCE}")'" >> "$CHROOT_VARIABLES" - [ -n "$GRMLREPOS" ] && echo "GRMLREPOS='$(sed "s,','\\\\'',g" <<<"${GRMLREPOS}")'" >> "$CHROOT_VARIABLES" - [ -n "$GRUB" ] && echo "GRUB='$(sed "s,','\\\\'',g" <<<"${GRUB}")'" >> "$CHROOT_VARIABLES" - [ -n "$HOSTNAME" ] && echo "HOSTNAME='$(sed "s,','\\\\'',g" <<<"${HOSTNAME}")'" >> "$CHROOT_VARIABLES" - [ -n "$INITRD" ] && echo "INITRD='$(sed "s,','\\\\'',g" <<<"${INITRD}")'" >> "$CHROOT_VARIABLES" - [ -n "$INITRD_GENERATOR" ] && echo "INITRD_GENERATOR='$(sed "s,','\\\\'',g" <<<"${INITRD_GENERATOR}")'" >> "$CHROOT_VARIABLES" - [ -n "$INITRD_GENERATOR_OPTS" ] && echo "INITRD_GENERATOR_OPTS='$(sed "s,','\\\\'',g" <<<"${INITRD_GENERATOR_OPTS}")'" >> "$CHROOT_VARIABLES" - [ -n "$INSTALL_NOTES" ] && echo "INSTALL_NOTES='$(sed "s,','\\\\'',g" <<<"${INSTALL_NOTES}")'" >> "$CHROOT_VARIABLES" - [ -n "$ISODIR" ] && echo "ISODIR='$(sed "s,','\\\\'',g" <<<"${ISO}")'" >> "$CHROOT_VARIABLES" - [ -n "$ISO" ] && echo "ISO='$(sed "s,','\\\\'',g" <<<"${ISO}")'" >> "$CHROOT_VARIABLES" - [ -n "$KEEP_SRC_LIST" ] && echo "KEEP_SRC_LIST='$(sed "s,','\\\\'',g" <<<"${KEEP_SRC_LIST}")'" >> "$CHROOT_VARIABLES" - [ -n "$LOCALES" ] && echo "LOCALES='$(sed "s,','\\\\'',g" <<<"${LOCALES}")'" >> "$CHROOT_VARIABLES" - [ -n "$MIRROR" ] && echo "MIRROR='$(sed "s,','\\\\'',g" <<<"${MIRROR}")'" >> "$CHROOT_VARIABLES" - [ -n "$MKFS" ] && echo "MKFS='$(sed "s,','\\\\'',g" <<<"${MKFS}")'" >> "$CHROOT_VARIABLES" - [ -n "$NOPASSWORD" ] && echo "NOPASSWORD=\"true\"" >> "$CHROOT_VARIABLES" - [ -n "$NOKERNEL" ] && echo "NOKERNEL=\"true\"" >> "$CHROOT_VARIABLES" - [ -n "$PACKAGES" ] && echo "PACKAGES='$(sed "s,','\\\\'',g" <<<"${PACKAGES}")'" >> "$CHROOT_VARIABLES" - [ -n "$POST_SCRIPTS" ] && echo "POST_SCRIPTS='$(sed "s,','\\\\'',g" <<<"${POST_SCRIPTS}")'" >> "$CHROOT_VARIABLES" - [ -n "$PRE_SCRIPTS" ] && echo "PRE_SCRIPTS='$(sed "s,','\\\\'',g" <<<"${PRE_SCRIPTS}")'" >> "$CHROOT_VARIABLES" - [ -n "$RECONFIGURE" ] && echo "RECONFIGURE='$(sed "s,','\\\\'',g" <<<"${RECONFIGURE}")'" >> "$CHROOT_VARIABLES" - [ -n "$RELEASE" ] && echo "RELEASE='$(sed "s,','\\\\'',g" <<<"${RELEASE}")'" >> "$CHROOT_VARIABLES" - [ -n "$RM_APTCACHE" ] && echo "RM_APTCACHE='$(sed "s,','\\\\'',g" <<<"${RM_APTCACHE}")'" >> "$CHROOT_VARIABLES" - [ -n "$ROOTPASSWORD" ] && echo "ROOTPASSWORD='$(sed "s,','\\\\'',g" <<<"${ROOTPASSWORD}")'" >> "$CHROOT_VARIABLES" - [ -n "$SCRIPTS" ] && echo "SCRIPTS='$(sed "s,','\\\\'',g" <<<"${SCRIPTS}")'" >> "$CHROOT_VARIABLES" - [ -n "$SECURE" ] && echo "SECURE='$(sed "s,','\\\\'',g" <<<"${SECURE}")'" >> "$CHROOT_VARIABLES" - [ -n "$SELECTED_PARTITIONS" ] && echo "SELECTED_PARTITIONS='$(sed "s,','\\\\'',g" <<<"${SELECTED_PARTITIONS}")'" >> "$CHROOT_VARIABLES" - [ -n "$TARGET" ] && echo "TARGET='$(sed "s,','\\\\'',g" <<<"${TARGET}")'" >> "$CHROOT_VARIABLES" - [ -n "$UPGRADE_SYSTEM" ] && echo "UPGRADE_SYSTEM='$(sed "s,','\\\\'',g" <<<"${UPGRADE_SYSTEM}")'" >> "$CHROOT_VARIABLES" - [ -n "$TARGET_UUID" ] && echo "TARGET_UUID='$(sed "s,','\\\\'',g" <<<"${TARGET_UUID}")'" >> "$CHROOT_VARIABLES" - [ -n "$TIMEZONE" ] && echo "TIMEZONE='$(sed "s,','\\\\'',g" <<<"${TIMEZONE}")'" >> "$CHROOT_VARIABLES" - [ -n "$TUNE2FS" ] && echo "TUNE2FS='$(sed "s,','\\\\'',g" <<<"${TUNE2FS}")'" >> "$CHROOT_VARIABLES" - [ -n "$VMSIZE" ] && echo "VMSIZE='$(sed "s,','\\\\'',g" <<<"${VMSIZE}")'" >> "$CHROOT_VARIABLES" + [ -n "$ARCH" ] && echo "ARCH='${ARCH//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" + [ -n "$BACKPORTREPOS" ] && echo "BACKPORTREPOS='${BACKPORTREPOS//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" + [ -n "$BOOT_APPEND" ] && echo "BOOT_APPEND='${BOOT_APPEND//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" + [ -n "$CHROOT_SCRIPTS" ] && echo "CHROOT_SCRIPTS='${CHROOT_SCRIPTS//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" + [ -n "$COMPONENTS" ] && echo "COMPONENTS='${COMPONENTS//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" + [ -n "$CONFFILES" ] && echo "CONFFILES='${CONFFILES//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" + [ -n "$DEBCONF" ] && echo "DEBCONF='${DEBCONF//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" + [ -n "$DEBIAN_FRONTEND" ] && echo "DEBIAN_FRONTEND='${DEBIAN_FRONTEND//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" + [ -n "$DEBOOTSTRAP" ] && echo "DEBOOTSTRAP='${DEBOOTSTRAP//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" + [ -n "$DEFAULT_LOCALES" ] && echo "DEFAULT_LOCALES='${DEFAULT_LOCALES//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" + [ -n "$DEFAULT_LANGUAGE" ] && echo "DEFAULT_LANGUAGE='${DEFAULT_LANGUAGE//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" + [ -n "$EXTRAPACKAGES" ] && echo "EXTRAPACKAGES='${EXTRAPACKAGES//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" + [ -n "$EFI" ] && echo "EFI='${EFI//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" + [ -n "$FALLBACK_MIRROR" ] && echo "FALLBACK_MIRROR='${FALLBACK_MIRROR//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" + [ -n "$FILESYSTEM" ] && echo "FILESYSTEM='${FILESYSTEM//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" + [ -n "$FORCE" ] && echo "FORCE='${FORCE//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" + [ -n "$GRMLREPOS" ] && echo "GRMLREPOS='${GRMLREPOS//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" + [ -n "$GRUB" ] && echo "GRUB='${GRUB//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" + [ -n "$HOSTNAME" ] && echo "HOSTNAME='${HOSTNAME//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" + [ -n "$INITRD" ] && echo "INITRD='${INITRD//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" + [ -n "$INITRD_GENERATOR" ] && echo "INITRD_GENERATOR='${INITRD_GENERATOR//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" + [ -n "$INITRD_GENERATOR_OPTS" ] && echo "INITRD_GENERATOR_OPTS='${INITRD_GENERATOR_OPTS//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" + [ -n "$INSTALL_NOTES" ] && echo "INSTALL_NOTES='${INSTALL_NOTES//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" + [ -n "$ISODIR" ] && echo "ISODIR='${ISO//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" + [ -n "$ISO" ] && echo "ISO='${ISO//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" + [ -n "$KEEP_SRC_LIST" ] && echo "KEEP_SRC_LIST='${KEEP_SRC_LIST//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" + [ -n "$LOCALES" ] && echo "LOCALES='${LOCALES//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" + [ -n "$MIRROR" ] && echo "MIRROR='${MIRROR//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" + [ -n "$MKFS" ] && echo "MKFS='${MKFS//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" + [ -n "$NOPASSWORD" ] && echo "NOPASSWORD=\"true\"" >> "$CHROOT_VARIABLES" + [ -n "$NOKERNEL" ] && echo "NOKERNEL=\"true\"" >> "$CHROOT_VARIABLES" + [ -n "$PACKAGES" ] && echo "PACKAGES='${PACKAGES//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" + [ -n "$POST_SCRIPTS" ] && echo "POST_SCRIPTS='${POST_SCRIPTS//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" + [ -n "$PRE_SCRIPTS" ] && echo "PRE_SCRIPTS='${PRE_SCRIPTS//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" + [ -n "$RECONFIGURE" ] && echo "RECONFIGURE='${RECONFIGURE//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" + [ -n "$RELEASE" ] && echo "RELEASE='${RELEASE//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" + [ -n "$RM_APTCACHE" ] && echo "RM_APTCACHE='${RM_APTCACHE//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" + [ -n "$ROOTPASSWORD" ] && echo "ROOTPASSWORD='${ROOTPASSWORD//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" + [ -n "$SCRIPTS" ] && echo "SCRIPTS='${SCRIPTS//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" + [ -n "$SECURE" ] && echo "SECURE='${SECURE//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" + [ -n "$SELECTED_PARTITIONS" ] && echo "SELECTED_PARTITIONS='${SELECTED_PARTITIONS//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" + [ -n "$TARGET" ] && echo "TARGET='${TARGET//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" + [ -n "$UPGRADE_SYSTEM" ] && echo "UPGRADE_SYSTEM='${UPGRADE_SYSTEM//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" + [ -n "$TARGET_UUID" ] && echo "TARGET_UUID='${TARGET_UUID//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" + [ -n "$TIMEZONE" ] && echo "TIMEZONE='${TIMEZONE//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" + [ -n "$TUNE2FS" ] && echo "TUNE2FS='${TUNE2FS//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" + [ -n "$VMSIZE" ] && echo "VMSIZE='${VMSIZE//\'/\'\\\'\'}'" >> "$CHROOT_VARIABLES" cp $VERBOSE "${CONFFILES}"/chroot-script "${MNTPOINT}"/bin/chroot-script chmod 755 "${MNTPOINT}"/bin/chroot-script @@ -1903,9 +1867,6 @@ preparechroot() { # setup default locales [ -n "$LOCALES" ] && cp $VERBOSE "${CONFFILES}"/locale.gen "${MNTPOINT}"/etc/locale.gen - # MAKEDEV is just a forking bomb crap, let's do it on our own instead :) - ( cd "${MNTPOINT}"/dev && tar zxf /etc/debootstrap/devices.tar.gz ) - # copy any existing files to chroot [ -d "${CONFFILES}"/bin ] && cp $VERBOSE -a -L "${CONFFILES}"/bin/* "${MNTPOINT}"/bin/ [ -d "${CONFFILES}"/boot ] && cp $VERBOSE -a -L "${CONFFILES}"/boot/* "${MNTPOINT}"/boot/ @@ -1961,22 +1922,18 @@ iface ${interface} inet dhcp einfo "Installing default /etc/network/interfaces as requested via --defaultinterfaces options." mkdir -p "${MNTPOINT}/etc/network" echo "$DEFAULT_INTERFACES" > "${MNTPOINT}/etc/network/interfaces" - eend $? elif [ -n "$VIRTUAL" ] ; then einfo "Setting up Virtual Machine, installing default /etc/network/interfaces" mkdir -p "${MNTPOINT}/etc/network" echo "$DEFAULT_INTERFACES" > "${MNTPOINT}/etc/network/interfaces" - eend $? elif [ -r /etc/network/interfaces ] ; then einfo "Copying /etc/network/interfaces from host to target system" mkdir -p "${MNTPOINT}/etc/network" cp $VERBOSE /etc/network/interfaces "${MNTPOINT}/etc/network/interfaces" - eend $? else ewarn "Couldn't read /etc/network/interfaces, installing default /etc/network/interfaces" mkdir -p "${MNTPOINT}/etc/network" echo "$DEFAULT_INTERFACES" > "${MNTPOINT}/etc/network/interfaces" - eend $? fi # install config file providing some example entries @@ -1994,7 +1951,6 @@ iface ${interface} inet dhcp chmod 0700 "${MNTPOINT}"/root/.ssh if ! ssh-add -L >> "${MNTPOINT}"/root/.ssh/authorized_keys ; then eerror "Error: executing 'ssh-add -L' failed." - eend 1 bailout 1 fi elif [ -f "$AUTHORIZED_KEYS_SOURCE" ]; then @@ -2003,12 +1959,10 @@ iface ${interface} inet dhcp chmod 0700 "$AUTHORIZED_KEYS_TARGET" if ! cp "$AUTHORIZED_KEYS_SOURCE" "$AUTHORIZED_KEYS_TARGET" ; then eerror "Error: copying '$AUTHORIZED_KEYS_SOURCE' to '$AUTHORIZED_KEYS_TARGET' failed" - eend 1 bailout 1 fi else eerror "Error: Could not open a connection to your authentication agent or the agent has no identities." - eend 1 bailout 1 fi fi @@ -2018,7 +1972,6 @@ iface ${interface} inet dhcp if ! [ -f "${AUTHORIZED_KEYS_SOURCE}" ]; then eerror "Error: could not read '${AUTHORIZED_KEYS_SOURCE}' for setting up SSH key login." - eend 1 bailout 1 fi @@ -2028,7 +1981,6 @@ iface ${interface} inet dhcp chmod 0700 "${AUTHORIZED_KEYS_TARGET}" if ! cp "${AUTHORIZED_KEYS_SOURCE}" "${AUTHORIZED_KEYS_TARGET}" ; then eerror "Error: copying '${AUTHORIZED_KEYS_SOURCE}' to '${AUTHORIZED_KEYS_TARGET}' failed." - eend 1 bailout 1 fi fi @@ -2037,7 +1989,6 @@ iface ${interface} inet dhcp einfo "Setting up bind-mount /run/udev" mkdir -p "${MNTPOINT}"/run/udev mount --bind /run/udev "${MNTPOINT}"/run/udev - eend $? fi } # }}} @@ -2055,7 +2006,7 @@ execute_pre_scripts() { for script in "${pre_scripts}"/* ; do if [ -x "$script" ] ; then einfo "Executing pre-script $script" - "$script" ; eend $? + "$script" fi done fi @@ -2080,35 +2031,13 @@ execute_post_scripts() { for script in "${post_scripts}"/* ; do if [ -x "$script" ] ; then einfo "Executing post-script $script" - "$script" ; eend $? + "$script" fi done fi } # }}} -# 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 @@ -2123,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 @@ -2137,7 +2065,6 @@ chrootscript() { if grep -q GRML_CHROOT_SCRIPT_MARKER "${MNTPOINT}/bin/chroot-script" ; then einfo "Removing chroot-script again" rm -f "${MNTPOINT}/bin/chroot-script" - eend $? else einfo "Keeping chroot-script as string GRML_CHROOT_SCRIPT_MARKER could not be found" fi @@ -2153,25 +2080,14 @@ umount_chroot() { fi if [ -n "$ISODIR" ] ; then - if grep -q "$ISODIR" /proc/mounts ; then - einfo "Unmount $MNTPOINT/$ISODIR" - umount "$MNTPOINT/$ISODIR" - eend $? - 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 - eend $? - fi + try_umount 3 "${MNTPOINT}"/run/udev - if [ -n "$PARTITION" ] ; then - einfo "Unmount $MNTPOINT" - umount "$MNTPOINT" - eend $? - fi + if [ -n "$PARTITION" ] ; then + try_umount 3 "$MNTPOINT" fi } # }}} @@ -2187,7 +2103,6 @@ fscktool() { [ -n "$FSCKTOOL" ] || FSCKTOOL="fsck.${MKFS#mkfs.}" einfo "Checking filesystem on $TARGET using $FSCKTOOL" "$FSCKTOOL" "$TARGET" - eend $? fi } # }}} @@ -2205,7 +2120,6 @@ remove_configs() { einfo "Removing configuration files from installed system as requested via --remove-configs / REMOVE_CONFIGS." rm -rf "${MNTPOINT}"/etc/debootstrap/ - eend $? } # }}} @@ -2216,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