Install only linux-image-cloud-amd64 in VMs for >=buster and amd64
[grml-debootstrap.git] / chroot-script
index 58bdb0e..0eb0d4b 100755 (executable)
@@ -75,8 +75,8 @@ askpass() {
 
 # define chroot mirror {{{
 chrootmirror() {
-  if [ -n "$KEEP_SRC_LIST" ] ; then
-    echo "KEEP_SRC_LIST has been set, skipping chrootmirror stage."
+  if [ "$KEEP_SRC_LIST" = "yes" ] ; then
+    echo "KEEP_SRC_LIST has been enabled, skipping chrootmirror stage."
     return
   fi
 
@@ -129,8 +129,8 @@ chrootmirror() {
 
 # remove local chroot mirror {{{
 remove_chrootmirror() {
-  if [ -n "$KEEP_SRC_LIST" ] ; then
-    echo "KEEP_SRC_LIST has been set, skipping remove_chrootmirror stage."
+  if [ "$KEEP_SRC_LIST" = "yes" ] ; then
+    echo "KEEP_SRC_LIST has been enabled, skipping remove_chrootmirror stage."
     return
   fi
 
@@ -350,19 +350,38 @@ kernel() {
   fi
 
   $APTUPDATE
-  KVER=$(get_kernel_version)
-  if [ -n "$KVER" ] ; then
-     # note: install busybox to be able to debug initramfs
-     KERNELPACKAGES="linux-image-$KVER linux-headers-$KVER busybox firmware-linux-free"
-     # only add firmware-linux if we have non-free as a component
-     if expr "$COMPONENTS" : '.*non-free' >/dev/null ; then
-       KERNELPACKAGES="$KERNELPACKAGES firmware-linux"
-     fi
-     # shellcheck disable=SC2086
-     DEBIAN_FRONTEND=$DEBIAN_FRONTEND $APTINSTALL $KERNELPACKAGES
-  else
-     echo "Warning: Could not find a kernel for your system. Your system won't be able to boot itself!"
+
+  local kernel_version
+  kernel_version=$(get_kernel_version)
+
+  if [ -z "${kernel_version}" ] ; then
+    echo "Error: could not find a kernel for your system. Your system won't be able to boot itself!" >&2
+    exit 1
+  fi
+
+  # defaults (note: install busybox to be able to debug initramfs)
+  KERNELPACKAGES="linux-image-${kernel_version} linux-headers-${kernel_version} busybox firmware-linux-free"
+
+  # only add firmware-linux if we have non-free as a component
+  if expr "$COMPONENTS" : '.*non-free' >/dev/null ; then
+    KERNELPACKAGES="$KERNELPACKAGES firmware-linux"
+  fi
+
+  # when installing into a VM using buster or newer, install only
+  # linux-image-cloud-amd64 (and no headers and firmware packages)
+  if [ -n "${VMSIZE}" ] && [ "${ARCH:-}" = "amd64" ] ; then
+    case "${RELEASE}" in
+      lenny|squeeze|wheezy|jessie|stretch)
+        ;;
+      *)
+        echo "Note: installing into VM, choosing linux-image-cloud-amd64 kernel package"
+        KERNELPACKAGES="linux-image-cloud-amd64"
+        ;;
+    esac
   fi
+
+  # shellcheck disable=SC2086
+  DEBIAN_FRONTEND=$DEBIAN_FRONTEND $APTINSTALL $KERNELPACKAGES
 }
 # }}}
 
@@ -470,8 +489,26 @@ timezone() {
 # helper function for fstab() {{{
 createfstab(){
   echo "Setting up /etc/fstab"
+  cat > /etc/fstab <<EOF
+# /etc/fstab - created by grml-debootstrap on $(date)
+# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
+# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
+#
+# After editing this file, run 'systemctl daemon-reload' to update systemd
+# units generated from this file.
+#
+EOF
+
   if [ -n "$TARGET_UUID" ] ; then
-    echo "/dev/disk/by-uuid/${TARGET_UUID} /  auto    defaults,errors=remount-ro 0   1" > /etc/fstab
+    local rootfs_mount_options=",errors=remount-ro"
+    case "${FILESYSTEM}" in
+      f2fs)
+        # errors=remount-ro is unsupported, see https://github.com/grml/grml-debootstrap/issues/163
+        rootfs_mount_options=""
+        ;;
+    esac
+
+    echo "/dev/disk/by-uuid/${TARGET_UUID} /  auto    defaults${rootfs_mount_options} 0   1" >> /etc/fstab
   else
     echo "Warning: couldn't identify target UUID for rootfs, your /etc/fstab might be incomplete."
   fi
@@ -577,8 +614,18 @@ efi_setup() {
   echo "Mounting $EFI on /boot/efi"
   mount "$EFI" /boot/efi || return 1
 
+  # if efivarfs kernel module is loaded, but efivars isn't,
+  # then we need to mount efivarfs for efibootmgr usage
+  if ! ls /sys/firmware/efi/efivars/* &>/dev/null ; then
+    echo "Mounting efivarfs on /sys/firmware/efi/efivars"
+    mount -t efivarfs efivarfs /sys/firmware/efi/efivars
+  fi
+
   echo "Invoking efibootmgr"
   efibootmgr || return 1
+
+  umount /sys/firmware/efi/efivars &>/dev/null || true
+
 }
 
 # grub configuration/installation {{{