Merge remote-tracking branch 'remotes/origin/pr/113'
authorMichael Prokop <mika@grml.org>
Wed, 14 Nov 2018 21:23:04 +0000 (22:23 +0100)
committerMichael Prokop <mika@grml.org>
Wed, 14 Nov 2018 21:23:04 +0000 (22:23 +0100)
1  2 
grml-debootstrap

diff --combined grml-debootstrap
@@@ -80,6 -80,7 +80,7 @@@ MNTPOINT="/mnt/debootstrap.$$
  [ -n "$TUNE2FS" ] || TUNE2FS='tune2fs -c0 -i0'
  [ -n "$UPGRADE_SYSTEM" ] || UPGRADE_SYSTEM='yes'
  [ -n "$VMSIZE" ] || VMSIZE="2G"
+ [ -n "$GRUB_INSTALL" ] || GRUB_INSTALL='yes'
  
  # inside the chroot system locales might not be available, so use minimum:
  export LANG=C
@@@ -298,13 -299,7 +299,13 @@@ cleanup() 
  
    if [ -n "${ORIG_TARGET}" ] ; then
      einfo "Removing loopback mount of file ${ORIG_TARGET}."
 -    kpartx -d "${ORIG_TARGET}" ; eend $?
 +    kpartx -d "${ORIG_TARGET}"
 +    # Workaround for a bug in kpartx which doesn't clean up properly,
 +    # see Debian Bug #891077 and Github-PR grml/grml-debootstrap#112
 +    if dmsetup ls | grep -q "^${LOOP_PART} "; then
 +      kpartx -d "/dev/${LOOP_DISK}" >/dev/null
 +    fi
 +    eend $?
    fi
  }
  
@@@ -1393,21 -1388,6 +1394,21 @@@ prepare_vm() 
       bailout 1
    fi
  
 +  # make sure loop module is present and a usable loop device exists
 +  modprobe -q loop
 +  if ! losetup -f >/dev/null 2>&1; then
 +    eerror "Error finding usable loop device" ; eend 1
 +    bailout 1
 +  fi
 +
 +  # if dm-mod isn't available then kpartx will fail with
 +  # "Is device-mapper driver missing from kernel? [...]"
 +  modprobe -q dm-mod
 +  if ! grep -q 'device-mapper' /proc/misc >/dev/null 2>&1 ; then
 +    eerror "Device-mapper support missing in kernel." ; eend 1
 +    bailout 1
 +  fi
 +
    ORIG_TARGET="$TARGET" # store for later reuse
  
    if [ -n "$VMFILE" ]; then
    parted -s "${TARGET}" 'mkpart primary ext4 2M -1'
    parted -s "${TARGET}" 'set 1 boot on'
  
 -  # if dm-mod isn't available then kpartx will fail with
 -  # "Is device-mapper driver missing from kernel? [...]"
 -  if ! kpartx -av "$TARGET" >/dev/null 2>&1 || ! grep -q 'device-mapper' /proc/misc >/dev/null 2>&1 ; then
 -    einfo "Device-mapper not ready yet, trying to load dm-mod module."
 -    modprobe dm-mod ; eend $?
 -  fi
 -
 -  # make sure loop module is present
 -  if ! losetup -f >/dev/null 2>&1; then
 -    einfo "Can not find a usable loop device, retrying after loading loop module."
 -    modprobe loop
 -    if losetup -f >/dev/null 2>&1; then
 -      einfo "Found a usable loop device now, continuing."
 -    else
 -      eerror "Error finding usable loop device" ; eend 1
 -      bailout 1
 -    fi
 -  fi
 -
    DEVINFO=$(kpartx -asv "$TARGET") # e.g. 'add map loop0p1 (254:5): 0 20477 linear 7:0 3'
    if [ -z "${DEVINFO}" ] ; then
      eerror "Error setting up loopback device." ; eend 1
    # 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_DISK="${LOOP_PART%p*}"      # 'loop0'
    export TARGET="/dev/mapper/$LOOP_PART" # '/dev/mapper/loop1p1'
  
    if [ -z "$TARGET" ] ; then
  }
  # }}}
  
- # make VM image bootable and unmount it {{{
finalize_vm() {
+ # make VM image bootable {{{
grub_install() {
    if [ -z "${VIRTUAL}" ] ; then
       return 0
    fi
+   if [ "${GRUB_INSTALL}" != "yes" ] ; then
+     einfo "Not installing GRUB as requested via \$GRUB_INSTALL=$GRUB_INSTALL"
+     return 0
+   fi
  
    if ! mount "${TARGET}" "${MNTPOINT}" ; then
      eerror "Error: Mounting ${TARGET} failed, can not continue." ; eend 1
    umount "${MNTPOINT}"/sys
    umount "${MNTPOINT}"/dev/pts
    try_umount 3 "${MNTPOINT}"/dev
+ }
+ # }}}
+ # unmount VM image {{{
+ umount_target() {
+   if [ -z "${VIRTUAL}" ] ; then
+      return 0
+   fi
    umount "${MNTPOINT}"
    kpartx -d "${ORIG_TARGET}" >/dev/null
 +  # Workaround for a bug in kpartx which doesn't clean up properly,
 +  # see Debian Bug #891077 and Github-PR grml/grml-debootstrap#112
 +  if dmsetup ls | grep -q "^${LOOP_PART} "; then
 +    kpartx -d "/dev/${LOOP_DISK}" >/dev/null
 +  fi
  }
  # }}}
  
@@@ -1889,7 -1896,7 +1904,7 @@@ remove_configs() 
  for i in format_efi_partition prepare_vm mkfs tunefs \
           mount_target mountpoint_to_blockdevice debootstrap_system \
           preparechroot execute_pre_scripts chrootscript execute_post_scripts \
-          remove_configs umount_chroot finalize_vm fscktool ; do
+          remove_configs umount_chroot grub_install umount_target fscktool ; do
      if stage "${i}" ; then
        if "$i" ; then
          stage "${i}" 'done' && rm -f "${STAGES}/${i}"