[ -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
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
}
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
}
# }}}
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}"