X-Git-Url: https://git.grml.org/?a=blobdiff_plain;f=grml-debootstrap;h=513c27bef9cd010f5e54926006d0432a504dcabf;hb=94b63adbec9c06ba30e6e898871462e251ca1823;hp=87a2cddf9275bdd99ac67d9bf660fbcb85922c43;hpb=d74ab1505d4898afa149df8ffaf8c4f14b11d49f;p=grml-debootstrap.git diff --git a/grml-debootstrap b/grml-debootstrap index 87a2cdd..513c27b 100755 --- a/grml-debootstrap +++ b/grml-debootstrap @@ -31,6 +31,7 @@ last bash command: $last_bash_command" } if [ "$REPORT_TRAP_ERR" = "yes" ] || [ "$FAIL_TRAP_ERR" = "yes" ]; then + set -e set -E set -o pipefail trap "error_handler" ERR @@ -260,6 +261,10 @@ cleanup() { einfo "Removing ${STAGES}" ; rmdir "$STAGES" ; eend $? fi + if [ -n "$ARM_EFI_TARGET" ]; then + umount "${MNTPOINT}/boot/efi" >/dev/null 2>&1 + fi + # Remove temporary mountpoint again if echo "$MNTPOINT" | grep -q '/mnt/debootstrap\.' ; then rmdir "$MNTPOINT" 2>/dev/null @@ -289,7 +294,7 @@ cleanup() { fi if [ -n "$DIRECTORY" ] ; then - einfo "Not unmounting $MNTPOINT as you requested me to install into a directory of your own choice." ; eend 0 + einfo "Not unmounting $MNTPOINT as you requested me to install into a directory of your own choice." else einfo "Unmounting $MNTPOINT" umount "$MNTPOINT" @@ -340,8 +345,8 @@ stage() { echo "$2" > "${STAGES}/${1}" return 0 elif grep -q 'done' "${STAGES}/${1}" 2>/dev/null ; then - ewarn "Notice: stage $1 has been executed already, skipping execution therefore." ; eend 0 - ewarn " To reexecute it clean up the according directory inside $STAGES" ; eend 0 + ewarn "Notice: stage $1 has been executed already, skipping execution therefore." + ewarn " To reexecute it clean up the according directory inside $STAGES" return 1 fi } @@ -612,7 +617,7 @@ 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." + eerror "The --grub option is unneeded as GRUB will be installed automatically (unless GRUB_INSTALL='no')." eend 1 bailout 1 fi @@ -635,15 +640,13 @@ if [ "$DEBUG" = "true" ] ; then fi [ "$_opt_help" ] && { - usage ; eend 0 - eend 0 + usage exit 0 } [ "$_opt_version" ] && { einfo "$PN - version $VERSION" einfo "Report bugs via https://github.com/grml/grml-debootstrap/ or https://grml.org/bugs/" - eend 0 exit 0 } # }}} @@ -988,14 +991,12 @@ format_efi_partition() { fi if fsck.vfat -bn "$EFI" >/dev/null; then - einfo "EFI partition $EFI seems to have a FAT filesystem, not modifying." ; eend 0 + 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 - eend 0 - else + if [ ! $RC -eq 0 ] ; then eerror "Error while creating filesystem on ${EFI}." eend 1 bailout 1 @@ -1017,7 +1018,7 @@ efi_support() { fi if [ -d /sys/firmware/efi ] ; then - einfo "EFI support detected." ; eend 0 + einfo "EFI support detected." return 0 fi @@ -1035,18 +1036,18 @@ checkconfiguration() if efi_support ; then if [ -z "$_opt_efi" ] ; then - ewarn "EFI support detected but no --efi option given, please consider enabling it." ; eend 0 + 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." ; eend 0 + eerror "EFI option used but no EFI support detected." bailout 1 fi fi if [ -n "$AUTOINSTALL" ] ; then if checkforrun ; then - eerror "Exiting as requested" ; eend 0 + eerror "Exiting as requested" bailout 1 fi elif [ -n "$INTERACTIVE" ] ; then @@ -1088,7 +1089,7 @@ else # if not running automatic installation display configuration and prompt fo # do not display if MNTPOINT is the default one case "$MNTPOINT" in /mnt/debootstrap*) ;; *) echo " Mount point: $MNTPOINT" ;; esac - if [ -n "$VIRTUAL" ] ; then + if [ -n "$VIRTUAL" ] && [ "$GRUB_INSTALL" = 'yes' ] ; then echo " Install grub: yes" [ -n "$VMEFI" ] && echo " Install efi: yes" || echo " Install efi: no" else @@ -1293,8 +1294,6 @@ mkfs() { mkfs.ext*) einfo "Enabling force option (-F) for mkfs.ext* tool as requested via --force switch." MKFS_OPTS="$MKFS_OPTS -F" - eend 0 - ;; esac fi @@ -1311,7 +1310,6 @@ mkfs() { if [ -n "$e2fsprogs_version" ] && dpkg --compare-versions "$e2fsprogs_version" ge '1.43~WIP.2015.05.18-1' ; then einfo "Disabling metadata_csum feature for $MKFS as $RELEASE doesn't support it." MKFS_OPTS="$MKFS_OPTS -O ^metadata_csum" - eend 0 fi ;; esac @@ -1329,13 +1327,21 @@ mkfs() { if [ -n "$e2fsprogs_version" ] && dpkg --compare-versions "$e2fsprogs_version" ge '1.43' ; then einfo "Disabling metadata_csum_seed feature for $MKFS as $RELEASE doesn't support it." MKFS_OPTS="$MKFS_OPTS -O ^metadata_csum_seed" - eend 0 fi ;; esac fi if [ -n "$MKFS" ] ; then + + 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=$? @@ -1347,7 +1353,7 @@ mkfs() { bailout 1 else einfo "Changing disk uuid for $TARGET to fixed (non-random) value $DISK_IDENTIFIER using tune2fs" - tune2fs "$TARGET" -U "$DISK_IDENTIFIER" + tune2fs "$TARGET" -U "$DISK_IDENTIFIER" /dev/null | cat -v | grep -Fq GRUB; then - einfo "Installing Grub as bootloader." - - if ! chroot "${MNTPOINT}" dpkg --list grub-pc 2>/dev/null | grep -q '^ii' ; then - echo "Notice: grub-pc package not present yet, installing it therefore." - # shellcheck disable=SC2086 - DEBIAN_FRONTEND=$DEBIAN_FRONTEND chroot "$MNTPOINT" apt-get -y --no-install-recommends install $DPKG_OPTIONS grub-pc - fi + if [ -n "$ARM_EFI_TARGET" ]; then + einfo "Installing Grub as bootloader into EFI." - 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 - bailout 1 - fi + chroot "${MNTPOINT}" grub-install --target=arm64-efi --efi-directory=/boot/efi --bootloader-id=debian --recheck --no-nvram --removable + # Has chroot-script installed GRUB to MBR using grub-install (successfully), already? + # chroot-script skips installation for unset ${GRUB} + elif [[ -z "${GRUB}" ]] || ! dd if="${GRUB}" bs=512 count=1 2>/dev/null | cat -v | grep -Fq GRUB; then + einfo "Installing Grub as bootloader." - 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 + if ! chroot "${MNTPOINT}" dpkg --list grub-pc 2>/dev/null | grep -q '^ii' ; then + echo "Notice: grub-pc package not present yet, installing it therefore." + # shellcheck disable=SC2086 + DEBIAN_FRONTEND=$DEBIAN_FRONTEND chroot "$MNTPOINT" apt-get -y --no-install-recommends install $DPKG_OPTIONS grub-pc + fi - if [ -n "$VMEFI" ]; then + 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 + bailout 1 + fi + cp -a "${MNTPOINT}"/usr/lib/grub/i386-pc "${MNTPOINT}/boot/grub/" - mkdir -p "${MNTPOINT}"/boot/efi - mount -t vfat "${EFI_TARGET}" "${MNTPOINT}"/boot/efi + if [ -n "$VMEFI" ]; then - if ! chroot "${MNTPOINT}" dpkg --list shim-signed 2>/dev/null | grep -q '^ii' ; then - echo "Notice: shim-signed package not present yet, installing it therefore." - # shellcheck disable=SC2086 - DEBIAN_FRONTEND=$DEBIAN_FRONTEND chroot "$MNTPOINT" apt-get -y --no-install-recommends install $DPKG_OPTIONS shim-signed - fi + mkdir -p "${MNTPOINT}"/boot/efi + mount -t vfat "${EFI_TARGET}" "${MNTPOINT}"/boot/efi - if [ "$(dpkg --print-architecture)" = "arm64" ]; then - if ! chroot "${MNTPOINT}" dpkg --list grub-efi-arm64-signed 2>/dev/null | grep -q '^ii' ; then - echo "Notice: grub-efi-arm64-signed package not present yet, installing it therefore." + if ! chroot "${MNTPOINT}" dpkg --list shim-signed 2>/dev/null | grep -q '^ii' ; then + echo "Notice: shim-signed package not present yet, installing it therefore." # shellcheck disable=SC2086 - DEBIAN_FRONTEND=$DEBIAN_FRONTEND chroot "$MNTPOINT" apt-get -y --no-install-recommends install $DPKG_OPTIONS grub-efi-arm64-bin grub-efi-arm64-signed + DEBIAN_FRONTEND=$DEBIAN_FRONTEND chroot "$MNTPOINT" apt-get -y --no-install-recommends install $DPKG_OPTIONS shim-signed fi - chroot "$MNTPOINT" grub-install --target=arm64-efi --efi-directory=/boot/efi --uefi-secure-boot --removable "/dev/$LOOP_DISK" - elif [ "$(dpkg --print-architecture)" = "i386" ]; then - if ! chroot "${MNTPOINT}" dpkg --list grub-efi-ia32-signed 2>/dev/null | grep -q '^ii' ; then - echo "Notice: grub-efi-ia32-signed package not present yet, installing it therefore." - # shellcheck disable=SC2086 - DEBIAN_FRONTEND=$DEBIAN_FRONTEND chroot "$MNTPOINT" apt-get -y --no-install-recommends install $DPKG_OPTIONS grub-efi-ia32-bin grub-efi-ia32-signed + + if [ "$(dpkg --print-architecture)" = "arm64" ]; then + if ! chroot "${MNTPOINT}" dpkg --list grub-efi-arm64-signed 2>/dev/null | grep -q '^ii' ; then + echo "Notice: grub-efi-arm64-signed package not present yet, installing it therefore." + # shellcheck disable=SC2086 + DEBIAN_FRONTEND=$DEBIAN_FRONTEND chroot "$MNTPOINT" apt-get -y --no-install-recommends install $DPKG_OPTIONS grub-efi-arm64-bin grub-efi-arm64-signed + fi + chroot "$MNTPOINT" grub-install --target=arm64-efi --efi-directory=/boot/efi --uefi-secure-boot --removable "/dev/$LOOP_DISK" + elif [ "$(dpkg --print-architecture)" = "i386" ]; then + if ! chroot "${MNTPOINT}" dpkg --list grub-efi-ia32-signed 2>/dev/null | grep -q '^ii' ; then + echo "Notice: grub-efi-ia32-signed package not present yet, installing it therefore." + # shellcheck disable=SC2086 + DEBIAN_FRONTEND=$DEBIAN_FRONTEND chroot "$MNTPOINT" apt-get -y --no-install-recommends install $DPKG_OPTIONS grub-efi-ia32-bin grub-efi-ia32-signed + fi + chroot "$MNTPOINT" grub-install --target=i386-efi --efi-directory=/boot/efi --uefi-secure-boot --removable "/dev/$LOOP_DISK" + chroot "$MNTPOINT" grub-install --target=i386-pc "/dev/$LOOP_DISK" + else + if ! chroot "${MNTPOINT}" dpkg --list grub-efi-amd64-signed 2>/dev/null | grep -q '^ii' ; then + echo "Notice: grub-efi-amd64-signed package not present yet, installing it therefore." + # shellcheck disable=SC2086 + DEBIAN_FRONTEND=$DEBIAN_FRONTEND chroot "$MNTPOINT" apt-get -y --no-install-recommends install $DPKG_OPTIONS grub-efi-amd64-bin grub-efi-amd64-signed + fi + chroot "$MNTPOINT" grub-install --target=x86_64-efi --efi-directory=/boot/efi --uefi-secure-boot --removable "/dev/$LOOP_DISK" + chroot "$MNTPOINT" grub-install --target=i386-pc "/dev/$LOOP_DISK" fi - chroot "$MNTPOINT" grub-install --target=i386-efi --efi-directory=/boot/efi --uefi-secure-boot --removable "/dev/$LOOP_DISK" else - if ! chroot "${MNTPOINT}" dpkg --list grub-efi-amd64-signed 2>/dev/null | grep -q '^ii' ; then - echo "Notice: grub-efi-amd64-signed package not present yet, installing it therefore." - # shellcheck disable=SC2086 - DEBIAN_FRONTEND=$DEBIAN_FRONTEND chroot "$MNTPOINT" apt-get -y --no-install-recommends install $DPKG_OPTIONS grub-efi-amd64-bin grub-efi-amd64-signed - fi - chroot "$MNTPOINT" grub-install --target=x86_64-efi --efi-directory=/boot/efi --uefi-secure-boot --removable "/dev/$LOOP_DISK" + dd if="${MNTPOINT}/usr/lib/grub/i386-pc/boot.img" of="${ORIG_TARGET}" conv=notrunc bs=440 count=1 + case "${_opt_filesystem}" in + f2fs) + chroot "${MNTPOINT}" grub-mkimage -O i386-pc -p "(hd0,msdos1)/boot/grub" -o /tmp/core.img biosdisk part_msdos f2fs + ;; + xfs) + chroot "${MNTPOINT}" grub-mkimage -O i386-pc -p "(hd0,msdos1)/boot/grub" -o /tmp/core.img biosdisk part_msdos xfs + ;; + # NOTE - we might need to distinguish between further filesystems + *) + chroot "${MNTPOINT}" grub-mkimage -O i386-pc -p "(hd0,msdos1)/boot/grub" -o /tmp/core.img biosdisk part_msdos ext2 + ;; + esac + + dd if="${MNTPOINT}/tmp/core.img" of="${ORIG_TARGET}" conv=notrunc seek=1 + rm -f "${MNTPOINT}/tmp/core.img" fi - else - dd if="${MNTPOINT}/usr/lib/grub/i386-pc/boot.img" of="${ORIG_TARGET}" conv=notrunc bs=440 count=1 - case "${_opt_filesystem}" in - f2fs) - chroot "${MNTPOINT}" grub-mkimage -O i386-pc -p "(hd0,msdos1)/boot/grub" -o /tmp/core.img biosdisk part_msdos f2fs - ;; - xfs) - chroot "${MNTPOINT}" grub-mkimage -O i386-pc -p "(hd0,msdos1)/boot/grub" -o /tmp/core.img biosdisk part_msdos xfs - ;; - # NOTE - we might need to distinguish between further filesystems - *) - chroot "${MNTPOINT}" grub-mkimage -O i386-pc -p "(hd0,msdos1)/boot/grub" -o /tmp/core.img biosdisk part_msdos ext2 - ;; - esac - - dd if="${MNTPOINT}/tmp/core.img" of="${ORIG_TARGET}" conv=notrunc seek=1 - rm -f "${MNTPOINT}/tmp/core.img" fi -fi # workaround for Debian bug #918590 with lvm + udev: # WARNING: Device /dev/... not initialized in udev database even after waiting 10000000 microseconds @@ -1651,8 +1684,14 @@ fi 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." chroot "${MNTPOINT}" update-grub + chroot "${MNTPOINT}" sync case "$RELEASE" in jessie) @@ -1665,7 +1704,7 @@ fi if grep -q '^GRUB_DISABLE_LINUX_UUID=.*true' "${MNTPOINT}"/etc/default/grub 2>/dev/null ; then ewarn "GRUB_DISABLE_LINUX_UUID is set to true in /etc/default/grub, not adjusting root= in grub.cfg." ewarn "Please note that your system might NOT be able to properly boot." - else + elif [ -z "$ARM_EFI_TARGET" ]; then einfo "Adjusting grub.cfg for successful boot sequence." sed -i "s;root=[^ ]\\+;root=UUID=$TARGET_UUID;" "${MNTPOINT}"/boot/grub/grub.cfg fi @@ -1696,6 +1735,10 @@ umount_target() { return 0 fi + if [ -n "${ARM_EFI_TARGET}" ]; then + umount "${MNTPOINT}/boot/efi" + fi + umount "${MNTPOINT}" kpartx -d "${ORIG_TARGET}" >/dev/null # Workaround for a bug in kpartx which doesn't clean up properly, @@ -1824,8 +1867,14 @@ preparechroot() { # package selection: if [ "$PACKAGES" = 'yes' ] ; then - cp $VERBOSE "${_opt_packages:-$CONFFILES/packages}" \ - "${MNTPOINT}"/etc/debootstrap/packages + PACKAGES_FILE="packages" + + if [ "$ARCH" = 'arm64' ]; then + PACKAGES_FILE="packages-arm64" + fi + + cp $VERBOSE "${_opt_packages:-$CONFFILES/$PACKAGES_FILE}" \ + "${MNTPOINT}/etc/debootstrap/${PACKAGES_FILE}" fi # debconf preseeding: @@ -1904,7 +1953,7 @@ iface ${interface} inet dhcp fi if [ -n "$NOINTERFACES" ] ; then - einfo "Not installing /etc/network/interfaces as requested via --nointerfaces option" ; eend 0 + einfo "Not installing /etc/network/interfaces as requested via --nointerfaces option" elif [ -n "$USE_DEFAULT_INTERFACES" ] ; then einfo "Installing default /etc/network/interfaces as requested via --defaultinterfaces options." mkdir -p "${MNTPOINT}/etc/network" @@ -1940,9 +1989,7 @@ iface ${interface} inet dhcp einfo "Use locally available public keys to authorise root login on the target system as requested via --sshcopyid option." mkdir -p "${MNTPOINT}"/root/.ssh chmod 0700 "${MNTPOINT}"/root/.ssh - if ssh-add -L >> "${MNTPOINT}"/root/.ssh/authorized_keys ; then - eend 0 - else + if ! ssh-add -L >> "${MNTPOINT}"/root/.ssh/authorized_keys ; then eerror "Error: executing 'ssh-add -L' failed." eend 1 bailout 1 @@ -1951,9 +1998,7 @@ iface ${interface} inet dhcp einfo "copying '$AUTHORIZED_KEYS_SOURCE' to '$AUTHORIZED_KEYS_TARGET' as requested via --sshcopyid option." mkdir -p "$AUTHORIZED_KEYS_TARGET" chmod 0700 "$AUTHORIZED_KEYS_TARGET" - if cp "$AUTHORIZED_KEYS_SOURCE" "$AUTHORIZED_KEYS_TARGET" ; then - eend 0 - else + if ! cp "$AUTHORIZED_KEYS_SOURCE" "$AUTHORIZED_KEYS_TARGET" ; then eerror "Error: copying '$AUTHORIZED_KEYS_SOURCE' to '$AUTHORIZED_KEYS_TARGET' failed" eend 1 bailout 1 @@ -1978,9 +2023,7 @@ iface ${interface} inet dhcp einfo "Copying '${AUTHORIZED_KEYS_SOURCE}' to '${AUTHORIZED_KEYS_TARGET}' as requested via --sshcopyauth option." mkdir -p "${AUTHORIZED_KEYS_TARGET}" chmod 0700 "${AUTHORIZED_KEYS_TARGET}" - if cp "${AUTHORIZED_KEYS_SOURCE}" "${AUTHORIZED_KEYS_TARGET}" ; then - eend 0 - else + if ! cp "${AUTHORIZED_KEYS_SOURCE}" "${AUTHORIZED_KEYS_TARGET}" ; then eerror "Error: copying '${AUTHORIZED_KEYS_SOURCE}' to '${AUTHORIZED_KEYS_TARGET}' failed." eend 1 bailout 1 @@ -1993,8 +2036,6 @@ iface ${interface} inet dhcp mount --bind /run/udev "${MNTPOINT}"/run/udev eend $? fi - - eend 0 } # }}} @@ -2096,7 +2137,6 @@ chrootscript() { eend $? else einfo "Keeping chroot-script as string GRML_CHROOT_SCRIPT_MARKER could not be found" - eend 0 fi } # }}} @@ -2156,7 +2196,7 @@ remove_configs() { fi if ! mountpoint "${MNTPOINT}" >/dev/null 2>&1 ; then - ewarn "Target ${MNTPOINT} doesn't seem to be mounted, can't remove configuration files." ; eend 0 + ewarn "Target ${MNTPOINT} doesn't seem to be mounted, can't remove configuration files." return 0 fi @@ -2172,7 +2212,8 @@ for i in format_efi_partition prepare_vm mkfs tunefs \ preparechroot execute_pre_scripts chrootscript execute_post_scripts \ remove_configs umount_chroot grub_install umount_target fscktool ; do if stage "${i}" ; then - if "$i" ; then + "$i" + if [ $? -eq 0 ]; then stage "${i}" 'done' && rm -f "${STAGES}/${i}" else bailout 2 "$i" @@ -2192,7 +2233,7 @@ Choose Cancel to skip rebooting." 10 60 10 ; then noeject noprompt reboot fi else - einfo "Finished execution of ${PN}. Enjoy your Debian system." ; eend 0 + einfo "Finished execution of ${PN}. Enjoy your Debian system." fi # }}}