Honor GRUB_DISABLE_LINUX_UUID=true for all Debian releases
[grml-debootstrap.git] / grml-debootstrap
index 0feed2a..61dab37 100755 (executable)
@@ -111,6 +111,7 @@ Bootstrap options:
       --interactive      Use interactive mode (frontend).
       --nodebootstrap    Skip debootstrap, only do configuration to the target.
       --grub <device>    Target for grub installation. Usage example: /dev/sda
+      --efi <device>     Target for EFI installation. Usage example: /dev/sda1
       --arch <arch>      Set target architecture, use for installing i386 on amd64.
       --filesystem <fs>  Filesystem that should be used when target is a partition
                          or Virtual Machine (see --vmfile).
@@ -395,6 +396,7 @@ fi
 [ "$_opt_nokernel" ]            && NOKERNEL="true"
 [ "$_opt_bootappend" ]          && BOOT_APPEND=$_opt_bootappend
 [ "$_opt_grub" ]                && GRUB=$_opt_grub
+[ "$_opt_efi" ]                 && EFI=$_opt_efi
 [ "$_opt_arch" ]                && ARCH=$_opt_arch
 [ "$_opt_insecure" ]            && echo "Warning: --insecure is deprecated, continuing anyway."
 [ "$_opt_force" ]               && FORCE=$_opt_force
@@ -448,7 +450,7 @@ fi
 
 # make sure we have what we need {{{
 if [ -n "$VIRTUAL" ] ; then
-  check4progs kpartx mksh parted qemu-img || bailout 1
+  check4progs kpartx parted qemu-img || bailout 1
 fi
 # }}}
 
@@ -759,9 +761,63 @@ Do you want to stop now?" 0 0 2>/dev/null
 }
 # }}}
 
+format_efi_partition() {
+  if [ -z "$EFI" ] ; then
+    return 0
+  fi
+
+  if ! [ -b "$EFI" ] ; then
+    eerror "Specified efi argument [$EFI] not a valid block device."
+    bailout 1
+  fi
+
+  if fsck.vfat -bn "$EFI" >/dev/null; then
+    einfo "EFI partition $EFI seems to have a FAT filesystem, not modifying." ; eend 0
+  else
+    einfo "EFI partition $EFI doesn't seem to be formated, creating filesystem."
+    mkfs.fat -F32 -n "EFI System Partition" "$EFI"
+    RC=$?
+    if [ $RC -eq 0 ] ; then
+      eend 0
+    else
+      eerror "Error while creating filesystem on ${EFI}."
+      eend 1
+      bailout 1
+    fi
+  fi
+}
+
+# check for EFI support or try to enable it {{{
+efi_support() {
+  if lsmod | grep -q efivars ; then
+    einfo "EFI support detected." ; eend 0
+    return 0
+  fi
+
+  if modprobe efivars &>/dev/null ; then
+    einfo "EFI support enabled now." ; eend 0
+    return 0
+  fi
+
+  return 1
+}
+# }}}
+
 # make sure the user is aware of the used configuration {{{
 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
+  fi
+else
+  if [ -n "$_opt_efi" ] ; then
+     eerror "EFI option used but no EFI support detected." ; eend 0
+     bailout 1
+  fi
+fi
+
 if [ -n "$AUTOINSTALL" ] ; then
    if checkforrun ; then
       eerror "Exiting as requested" ; eend 0
@@ -775,6 +831,8 @@ elif [ -n "$INTERACTIVE" ] ; then
    Target:          $TARGET"
    [ -n "$GRUB" ]    && INFOTEXT="$INFOTEXT
    Install grub:    $GRUB"
+   [ -n "$EFI" ]    && INFOTEXT="$INFOTEXT
+   Install efi:     $EFI"
    [ -n "$RELEASE" ] && INFOTEXT="$INFOTEXT
    Using release:   $RELEASE"
    [ -n "$HOSTNAME" ] && INFOTEXT="$INFOTEXT
@@ -808,6 +866,7 @@ else # if not running automatic installation display configuration and prompt fo
       echo "   Install grub:    yes"
    else
      [ -n "$GRUB" ]     && echo "   Install grub:    $GRUB" || echo "   Install grub:    no"
+     [ -n "$EFI" ]      && echo "   Install efi:     $EFI"  || echo "   Install efi:     no"
    fi
 
    [ -n "$RELEASE" ]   && echo "   Using release:   $RELEASE"
@@ -996,6 +1055,24 @@ mkfs() {
         einfo "Enabling force option (-F) for mkfs.ext* tool as requested via --force switch."
         MKFS_OPTS="$MKFS_OPTS -F"
         eend 0
+
+        ;;
+    esac
+  fi
+
+  # starting with e2fsprogs 1.43~WIP.2015.05.18-1 mkfs.ext4 enables the metadata_csum feature
+  # by default, which requires a recent version of tune2fs on the target system then,
+  # 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)
+        # assume a more recent version if we can't identify the version via dpkg-query
+        local e2fsprogs_version="$(dpkg-query --show --showformat='${Version}' e2fsprogs 2>/dev/null || echo 1.44)"
+        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
   fi
@@ -1191,8 +1268,9 @@ if [[ -z "${GRUB}" ]] || ! dd if="${GRUB}" bs=512 count=1 2>/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
   chroot "${MNTPOINT}" grub-mkimage -O i386-pc -p "(hd0,msdos1)/boot/grub" -o /tmp/core.img biosdisk part_msdos ext2
-  dd if="${MNTPOINT}/tmp/core.img" of="${ORIG_TARGET}" conv=notrunc seek=4
+  dd if="${MNTPOINT}/tmp/core.img" of="${ORIG_TARGET}" conv=notrunc seek=1
   rm -f "${MNTPOINT}/tmp/core.img"
 fi
 
@@ -1210,17 +1288,13 @@ fi
       ;;
   esac
 
-  case "$RELEASE" in
-    lenny|squeeze|wheezy)
-      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
-        einfo "Adjusting grub.cfg for successful boot sequence."
-        sed -i "s;root=[^ ]\+;root=UUID=$TARGET_UUID;" "${MNTPOINT}"/boot/grub/grub.cfg
-      fi
-      ;;
-  esac
+  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
+    einfo "Adjusting grub.cfg for successful boot sequence."
+    sed -i "s;root=[^ ]\+;root=UUID=$TARGET_UUID;" "${MNTPOINT}"/boot/grub/grub.cfg
+  fi
 
   umount "${MNTPOINT}"/proc
   umount "${MNTPOINT}"/sys
@@ -1292,6 +1366,7 @@ preparechroot() {
   [ -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 "$FORCE" ]               && echo "FORCE='$(sed "s,','\\\\'',g" <<<"${FORCE}")'"                             >> "$CHROOT_VARIABLES"
   [ -n "$GRMLREPOS" ]           && echo "GRMLREPOS='$(sed "s,','\\\\'',g" <<<"${GRMLREPOS}")'"                     >> "$CHROOT_VARIABLES"
@@ -1451,8 +1526,9 @@ execute_pre_scripts() {
 
 # execute all scripts in /etc/debootstrap/post-scripts/ {{{
 execute_post_scripts() {
-  # make sure we have $MNTPOINT available for our scripts
+  # make sure we have $MNTPOINT and HOSTNAME available for our scripts
   export MNTPOINT
+  export TARGET_HOSTNAME=$HOSTNAME
 
   if [ -d "$_opt_scripts" ] || [ "$SCRIPTS" = 'yes' ] ; then
     # legacy support for /etc/debootstrap/scripts/
@@ -1589,7 +1665,7 @@ remove_configs() {
 # }}}
 
 # now execute all the functions {{{
-for i in prepare_vm mkfs tunefs mount_target debootstrap_system \
+for i in format_efi_partition prepare_vm mkfs tunefs mount_target debootstrap_system \
          preparechroot execute_pre_scripts chrootscript execute_post_scripts \
          remove_configs umount_chroot finalize_vm fscktool ; do
     if stage "${i}" ; then