X-Git-Url: https://git.grml.org/?a=blobdiff_plain;f=grml-debootstrap;h=0489c52228223913c421bad9d2efa15905427df0;hb=d275bdfe5ba2b9abcf67687311110ae2dc5ac90f;hp=f57616099958bffa863f39c6ae67884403940139;hpb=dcccf1133376d0841a0a57141aae71d16f6e9184;p=grml-debootstrap.git diff --git a/grml-debootstrap b/grml-debootstrap index f576160..0489c52 100755 --- a/grml-debootstrap +++ b/grml-debootstrap @@ -5,6 +5,7 @@ # 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' @@ -31,6 +32,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 @@ -41,7 +43,7 @@ fi # 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 @@ -260,6 +262,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 @@ -596,7 +602,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" ;; *) @@ -612,7 +618,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 @@ -921,16 +927,10 @@ 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) # shellcheck disable=SC2086 yes | mdadm --create "${TARGET}" --level="${RAIDLEVEL}" \ - --raid-devices="${NUM_PARTITIONS}" ${METADATA_VERSION} ${SELECTED_PARTITIONS} >/dev/null 2>$ERRORFILE + --raid-devices="${NUM_PARTITIONS}" ${SELECTED_PARTITIONS} >/dev/null 2>$ERRORFILE RC=$? if [ "$RC" = 0 ] ; then dialog --title "$PN" --msgbox \ @@ -1029,14 +1029,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 @@ -1084,7 +1086,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 @@ -1298,7 +1300,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)" @@ -1315,7 +1317,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)" @@ -1328,6 +1330,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=$? @@ -1502,25 +1513,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' @@ -1529,7 +1558,7 @@ prepare_vm() { 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 @@ -1553,91 +1582,95 @@ 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 ! 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" - 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 @@ -1648,8 +1681,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) @@ -1662,7 +1701,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 @@ -1693,6 +1732,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, @@ -1753,55 +1796,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 @@ -1821,8 +1862,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: @@ -1848,9 +1895,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/ @@ -1906,11 +1950,13 @@ 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" + # shellcheck disable=SC2320 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" + # shellcheck disable=SC2320 eend $? elif [ -r /etc/network/interfaces ] ; then einfo "Copying /etc/network/interfaces from host to target system" @@ -1921,6 +1967,7 @@ iface ${interface} inet dhcp ewarn "Couldn't read /etc/network/interfaces, installing default /etc/network/interfaces" mkdir -p "${MNTPOINT}/etc/network" echo "$DEFAULT_INTERFACES" > "${MNTPOINT}/etc/network/interfaces" + # shellcheck disable=SC2320 eend $? fi @@ -2160,7 +2207,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"