From: Michael Prokop Date: Wed, 14 Nov 2018 21:23:04 +0000 (+0100) Subject: Merge remote-tracking branch 'remotes/origin/pr/113' X-Git-Tag: v0.83~1 X-Git-Url: https://git.grml.org/?p=grml-debootstrap.git;a=commitdiff_plain;h=2cba71c7ac06006c75c1f2157f529d2efd89ea42;hp=-c Merge remote-tracking branch 'remotes/origin/pr/113' --- 2cba71c7ac06006c75c1f2157f529d2efd89ea42 diff --combined grml-debootstrap index 1a3cda5,4670144..ab7c577 --- a/grml-debootstrap +++ b/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 @@@ -1425,6 -1405,25 +1426,6 @@@ 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 @@@ -1434,7 -1433,6 +1435,7 @@@ # 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 @@@ -1444,11 -1442,15 +1445,15 @@@ } # }}} - # 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 @@@ -1517,13 -1519,18 +1522,23 @@@ f 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}"