X-Git-Url: http://git.grml.org/?a=blobdiff_plain;f=grml-debootstrap;h=f57616099958bffa863f39c6ae67884403940139;hb=dcccf1133376d0841a0a57141aae71d16f6e9184;hp=339d35272cf3a70b634ce9f67b26c090c4002311;hpb=bbb2ea07e365faf1eded92926eed68905d28e23f;p=grml-debootstrap.git diff --git a/grml-debootstrap b/grml-debootstrap index 339d352..f576160 100755 --- a/grml-debootstrap +++ b/grml-debootstrap @@ -131,6 +131,7 @@ Options for Virtual Machine deployment: Example: --vmfile --target /mnt/sda1/qemu.img --vmsize Use specified size for size of VM file (default: 2G). Syntax as supported by qemu-img, like: --vmsize 3G + --vmefi Create an EFI boot partition for the VM. Configuration options: @@ -288,7 +289,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" @@ -339,8 +340,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 } @@ -354,7 +355,7 @@ 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:,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 +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 -- "$@") @@ -389,6 +390,9 @@ while :; do --vmsize) # size of Virtual machine file shift; _opt_vmsize="$1" ;; + --vmefi) # Create an EFI boot partition for the VM + _opt_vmefi="T" + ;; --mntpoint|-p) # Mountpoint used for mounting the target system shift; _opt_mntpoint="$1" ;; @@ -554,6 +558,7 @@ done [ "$_opt_vm" ] && VIRTUAL=1 [ "$_opt_vmfile" ] && VMFILE=1 && VIRTUAL=1 [ "$_opt_vmsize" ] && VMSIZE=$_opt_vmsize +[ "$_opt_vmefi" ] && VMEFI=1 [ "$_opt_mntpoint" ] && MNTPOINT=$_opt_mntpoint [ "$_opt_debopt" ] && DEBOOTSTRAP_OPT=$_opt_debopt [ "$_opt_interactive" ] && INTERACTIVE=1 @@ -630,15 +635,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 } # }}} @@ -983,14 +986,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 @@ -1012,7 +1013,7 @@ efi_support() { fi if [ -d /sys/firmware/efi ] ; then - einfo "EFI support detected." ; eend 0 + einfo "EFI support detected." return 0 fi @@ -1030,18 +1031,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 @@ -1085,6 +1086,7 @@ else # if not running automatic installation display configuration and prompt fo if [ -n "$VIRTUAL" ] ; then echo " Install grub: yes" + [ -n "$VMEFI" ] && echo " Install efi: yes" || echo " Install efi: no" else [ -n "$GRUB" ] && echo " Install grub: $GRUB" || echo " Install grub: no" [ -n "$EFI" ] && echo " Install efi: $EFI" || echo " Install efi: no" @@ -1287,8 +1289,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 @@ -1305,7 +1305,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 @@ -1323,7 +1322,6 @@ 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 @@ -1341,11 +1339,17 @@ 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 | cp -a "${MNTPOINT}"/usr/lib/grub/i386-pc "${MNTPOINT}/boot/grub/" ;; esac - 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" + if [ -n "$VMEFI" ]; then + + mkdir -p "${MNTPOINT}"/boot/efi + mount -t vfat "${EFI_TARGET}" "${MNTPOINT}"/boot/efi + + 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 + + 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 + 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: @@ -1624,6 +1680,10 @@ fi umount "${MNTPOINT}"/dev/pts try_umount 3 "${MNTPOINT}"/dev + if [ -n "$VMEFI" ]; then + umount "${MNTPOINT}"/boot/efi + fi + } # }}} @@ -1841,7 +1901,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" @@ -1877,9 +1937,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 @@ -1888,9 +1946,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 @@ -1915,9 +1971,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 @@ -1930,8 +1984,6 @@ iface ${interface} inet dhcp mount --bind /run/udev "${MNTPOINT}"/run/udev eend $? fi - - eend 0 } # }}} @@ -2033,7 +2085,6 @@ chrootscript() { eend $? else einfo "Keeping chroot-script as string GRML_CHROOT_SCRIPT_MARKER could not be found" - eend 0 fi } # }}} @@ -2093,7 +2144,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 @@ -2129,7 +2180,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 # }}}