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 an 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
+ einfo "Device-mapper support missing in kernel."
+ 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
try_umount 3 "${MNTPOINT}"/dev
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
}
# }}}