Merge remote-tracking branch 'origin/pr/214'
authorMichael Prokop <mika@grml.org>
Wed, 25 Oct 2023 08:06:03 +0000 (10:06 +0200)
committerMichael Prokop <mika@grml.org>
Wed, 25 Oct 2023 08:06:03 +0000 (10:06 +0200)
1  2 
chroot-script
grml-debootstrap

diff --combined 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
@@@ -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=$?
          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
          eend $?
        fi
      fi
@@@ -1433,7 -1445,7 +1446,7 @@@ mountpoint_to_blockdevice() 
  tunefs() {
    if [ -n "$TUNE2FS" ] && echo "$MKFS" | grep -q "mkfs.ext" ; then
       einfo "Disabling automatic filesystem check on $TARGET via tune2fs"
 -     $TUNE2FS "$TARGET"
 +     $TUNE2FS "$TARGET" </dev/null
       eend $?
    fi
  }
@@@ -1511,25 -1523,43 +1524,43 @@@ prepare_vm() 
      parted -s "${TARGET}" 'mkpart primary ext4 102MiB 100%'
  
    else
-     parted -s "${TARGET}" 'mklabel msdos'
-     if [ "$FIXED_DISK_IDENTIFIERS" = "yes" ] ; then
-       einfo "Adjusting disk signature to a fixed (non-random) value"
-       MBRTMPFILE=$(mktemp)
-       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 $?
+     # arm64 support largely only exists for GPT
+     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}" 'set 1 boot on'
+       parted -s "${TARGET}" 'mkpart LINUX ext4 10MiB 100%'
+     else
+       parted -s "${TARGET}" 'mklabel msdos'
+       if [ "$FIXED_DISK_IDENTIFIERS" = "yes" ] ; then
+         einfo "Adjusting disk signature to a fixed (non-random) value"
+         MBRTMPFILE=$(mktemp)
+         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'
      fi
-     parted -s "${TARGET}" 'mkpart primary ext4 4MiB 100%'
-     parted -s "${TARGET}" 'set 1 boot on'
    fi
  
-   DEVINFO=$(kpartx -asv "$TARGET") # e.g. 'add map loop0p1 (254:5): 0 20477 linear 7:0 3'
+   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
      bailout 1
    fi
  
+   # if we're building for arm64, we operate on the first line of $DEVINFO which is the EFI partition
+   if [ "$ARCH" = 'arm64' ]; then
+     LOOP_PART="${DEVINFO##add map }" # 'loop0p1 (254:5): 0 20477 linear 7:0 3'
+     LOOP_PART="${LOOP_PART// */}"    # 'loop0p1'
+     LOOP_DISK="${LOOP_PART%p*}"      # 'loop0'
+     export ARM_EFI_TARGET="/dev/mapper/$LOOP_PART"
+     DEVINFO=${DEVINFO##*$'\n'} # now set $DEVINFO to the last line which is the OS partition
+   fi
    # hopefully this always works as expected
    LOOP_PART="${DEVINFO##add map }" # 'loop0p1 (254:5): 0 20477 linear 7:0 3'
    LOOP_PART="${LOOP_PART// */}"    # 'loop0p1'
      LOOP_PART="${LOOP_PART%p1}p3"
    fi
    LOOP_DISK="${LOOP_PART%p*}"      # 'loop0'
-   export TARGET="/dev/mapper/$LOOP_PART" # '/dev/mapper/loop1p1'
+   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
@@@ -1562,91 -1592,103 +1593,103 @@@ grub_install() 
      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
+       bailout 1
+     fi
+   fi
    mount -t proc none "${MNTPOINT}"/proc
    mount -t sysfs none "${MNTPOINT}"/sys
    mount -t devtmpfs udev "${MNTPOINT}"/dev
    mount -t devpts devpts "${MNTPOINT}"/dev/pts
  
- # Has chroot-script installed GRUB to MBR using grub-install (successfully), already?
- # chroot-script skips installation for unset ${GRUB}
- if [[ -z "${GRUB}" ]] || ! dd if="${GRUB}" bs=512 count=1 2>/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
  
    einfo "Updating grub configuration file."
    chroot "${MNTPOINT}" update-grub
+   chroot "${MNTPOINT}" sync
  
    case "$RELEASE" in
      jessie)
    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"