From: Michael Prokop Date: Wed, 25 Oct 2023 08:06:03 +0000 (+0200) Subject: Merge remote-tracking branch 'origin/pr/214' X-Git-Tag: v0.105~15 X-Git-Url: http://git.grml.org/?a=commitdiff_plain;h=ad99b61111e1eeb20d56367e55d5b849b16c5de3;hp=-c;p=grml-debootstrap.git Merge remote-tracking branch 'origin/pr/214' --- ad99b61111e1eeb20d56367e55d5b849b16c5de3 diff --combined chroot-script index 3c69f00,2f6efba..2865387 --- a/chroot-script +++ b/chroot-script @@@ -11,7 -11,6 +11,7 @@@ # error_handler {{{ if [ "$REPORT_TRAP_ERR" = "yes" ] || [ "$FAIL_TRAP_ERR" = "yes" ]; then + set -e set -E set -o pipefail trap "error_handler" ERR @@@ -270,14 -269,21 +270,21 @@@ packages() } if [ "$PACKAGES" = 'yes' ] ; then - if ! [ -r /etc/debootstrap/packages ] ; then - echo "Error: /etc/debootstrap/packages (inside chroot) not found, exiting." >&2 - exit 1 - else - $APTUPDATE - # shellcheck disable=SC2086,SC2046 - DEBIAN_FRONTEND=$DEBIAN_FRONTEND $APTINSTALL $(grep -v '^#' /etc/debootstrap/packages) $GRMLPACKAGES - fi + PACKAGES_FILE="/etc/debootstrap/packages" + + if [ "$ARCH" = 'arm64' ]; then + PACKAGES_FILE="/etc/debootstrap/packages-arm64" + fi + + if ! [ -r "${PACKAGES_FILE}" ] ; then + echo "Error: ${PACKAGES_FILE} (inside chroot) not found, exiting." >&2 + exit 1 + else + $APTUPDATE + + # shellcheck disable=SC2086,SC2046 + DEBIAN_FRONTEND=$DEBIAN_FRONTEND $APTINSTALL $(grep -v '^#' "${PACKAGES_FILE}") $GRMLPACKAGES + fi fi } # }}} @@@ -326,8 -332,11 +333,11 @@@ get_kernel_version() amd64) KARCH='amd64' ;; + arm64) + KARCH='arm64' + ;; *) - echo "Only i386 and amd64 are currently supported" >&2 + echo "Only i386, amd64 and arm64 are currently supported" >&2 return 1 esac @@@ -654,7 -663,7 +664,7 @@@ available_ids() echo "${ids}" } -# helper function to report corresponding /dev/disk/by-id/… for a given device name, +# helper function to report corresponding /dev/disk/by-id/ for a given device name, # based on GRUB's postinst script device_to_id() { local id diff --combined grml-debootstrap index 8994542,f6c5535..fa1e19e --- a/grml-debootstrap +++ b/grml-debootstrap @@@ -31,7 -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 @@@ -261,6 -260,10 +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 @@@ -613,7 -616,7 +617,7 @@@ f 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 @@@ -1089,7 -1092,7 +1093,7 @@@ else # if not running automatic install # 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 @@@ -1337,6 -1340,15 +1341,15 @@@ mkfs() 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=$? @@@ -1348,7 -1360,7 +1361,7 @@@ 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 [ -n "$ARM_EFI_TARGET" ]; then + einfo "Installing Grub as bootloader into EFI." - 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 + 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." - 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 + 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 - 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 + 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 - if [ -n "$VMEFI" ]; then + 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 - 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" - 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" + 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 @@@ -1659,6 -1701,7 +1702,7 @@@ einfo "Updating grub configuration file." chroot "${MNTPOINT}" update-grub + chroot "${MNTPOINT}" sync case "$RELEASE" in jessie) @@@ -1671,7 -1714,7 +1715,7 @@@ 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 @@@ -1702,6 -1745,10 +1746,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, @@@ -1830,8 -1877,14 +1878,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: @@@ -2178,8 -2231,7 +2232,8 @@@ for i in format_efi_partition prepare_v 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"