+# mount the new partition or if it's a directory do nothing at all {{{
+mount_target() {
+ if [ -n "$DIRECTORY" ] ; then
+ einfo "Running grml-debootstrap on a directory, nothing to mount."
+ else
+ if grep -q "$TARGET" /proc/mounts ; then
+ ewarn "$TARGET already mounted, continuing anyway." ; eend 0
+ else
+ if ! [ -d "${MNTPOINT}" ] ; then
+ [ -n "$VIRTUAL" ] || mkdir -p "${MNTPOINT}"
+ fi
+ einfo "Mounting $TARGET to $MNTPOINT"
+ mkdir -p "$MNTPOINT"
+ mount -o rw,suid,dev "$TARGET" "$MNTPOINT"
+ eend $?
+ fi
+ fi
+ if [ -n "$ISODIR" ] ; then
+ einfo "Mounting Debian image loopback to $MNTPOINT/$ISODIR."
+ mkdir -p "$MNTPOINT/$ISODIR"
+ mount --bind "$ISODIR" "$MNTPOINT/$ISODIR"
+ eend $?
+ fi
+}
+# }}}
+
+# prepare VM image for usage with debootstrap {{{
+prepare_vm() {
+ if [ -z "$VIRTUAL" ] ; then
+ return 0 # be quiet by intention
+ fi
+
+ if [ -b "$TARGET" -a -n "$VMFILE" ] ; then
+ eerror "Error: specified virtual disk target ($TARGET) is an existing block device."
+ eend 1
+ bailout 1
+ fi
+ if [ ! -b "$TARGET" -a -z "$VMFILE" ] ; then
+ eerror "Error: specified virtual disk target ($TARGET) does not exist yet."
+ eend 1
+ bailout 1
+ fi
+
+ ORIG_TARGET="$TARGET" # store for later reuse
+
+ if [ -n "$VMFILE" ]; then
+ qemu-img create -f raw "${TARGET}" "${VMSIZE}"
+ fi
+ echo 4 66 | /usr/share/grml-debootstrap/bootgrub.mksh -A | dd of="$TARGET" conv=notrunc
+ dd if=/dev/zero bs=1 conv=notrunc count=64 seek=446 of="$TARGET"
+ if [ "$FIXED_DISK_IDENTIFIERS" = "yes" ] ; then
+ einfo "Adjusting disk signature to a fixed (non-random) value"
+ MBRTMPFILE=$(mktemp)
+ dd if="${TARGET}" of="${MBRTMPFILE}" bs=512 count=1
+ echo -en "\x41\x41\x41\x41\x41" | dd of="${MBRTMPFILE}" conv=notrunc seek=440 bs=1
+ dd if="${MBRTMPFILE}" of="${TARGET}" conv=notrunc
+ eend $?
+ fi
+ parted -s "${TARGET}" 'mkpart primary ext4 2M -1'
+
+ # 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") # 'add map loop1p1 (253:0): 0 6289408 linear /dev/loop1 2048'
+ if [ -z "${DEVINFO}" ] ; then
+ eerror "Error setting up loopback device." ; eend 1
+ bailout 1
+ fi
+
+ # hopefully this always works as expected
+ LOOP=$(echo "${DEVINFO}" | sed 's/.* linear //; s/ [[:digit:]]*//') # 'loop1'
+ LOOP_PART="$(echo "${DEVINFO##add map }" | sed 's/ .*//')" # 'loop1p1'
+ export TARGET="/dev/mapper/$LOOP_PART" # '/dev/mapper/loop1p1'
+
+ blockdev --rereadpt "${LOOP}"
+
+ if [ -z "$TARGET" ] ; then
+ eerror "Error: target could not be set to according /dev/mapper/* device." ; eend 1
+ bailout 1
+ fi
+}
+# }}}
+
+# make VM image bootable and unmount it {{{
+finalize_vm() {
+ if [ -z "${VIRTUAL}" ] ; then
+ return 0
+ fi
+
+ if ! mount "${TARGET}" "${MNTPOINT}" ; then
+ eerror "Error: Mounting ${TARGET} failed, can not continue." ; eend 1
+ bailout 1
+ fi
+
+ einfo "Installing Grub as bootloader."
+ mount -t proc none "${MNTPOINT}"/proc
+ mount -t sysfs none "${MNTPOINT}"/sys
+ mount --bind /dev "${MNTPOINT}"/dev
+
+ mkdir -p "${MNTPOINT}/boot/grub"
+ if ! [ -d "${MNTPOINT}"/usr/lib/grub/i386-pc/ ] ; then
+ eerror "Error: grub not installed inside Virtual Machine. Can not install bootloader." ; eend 1
+ bailout 1
+ fi
+
+ case "$RELEASE" in
+ lenny|squeeze|wheezy)
+ cp "${MNTPOINT}"/usr/lib/grub/i386-pc/* "${MNTPOINT}/boot/grub/"
+ ;;
+ *)
+ cp -a "${MNTPOINT}"/usr/lib/grub/i386-pc "${MNTPOINT}/boot/grub/"
+ ;;
+ esac
+ 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
+ rm -f "${MNTPOINT}/tmp/core.img"
+
+ einfo "Updating grub configuration file."
+ if [ -n "$BOOT_APPEND" ] ; then
+ sed -i "/GRUB_CMDLINE_LINUX_DEFAULT/ s#\"\$# ${BOOT_APPEND}\"#" "${MNTPOINT}"/etc/default/grub
+ fi
+ chroot "${MNTPOINT}" update-grub
+
+ case "$RELEASE" in
+ lenny|squeeze|wheezy)
+ einfo "Adjusting grub.cfg for successful boot sequence."
+ sed -i "s;root=[^ ]\+;root=UUID=$TARGET_UUID;" "${MNTPOINT}"/boot/grub/grub.cfg
+ ;;
+ esac
+
+ umount "${MNTPOINT}"/proc
+ umount "${MNTPOINT}"/sys
+ umount "${MNTPOINT}"/dev
+ umount "${MNTPOINT}"
+ kpartx -d "${ORIG_TARGET}" >/dev/null
+}
+# }}}
+
+# install main chroot {{{
+debootstrap_system() {
+ if [ "$_opt_nodebootstrap" ]; then
+ einfo "Skipping debootstrap as requested."
+ return
+ fi
+
+ if grep -q "$MNTPOINT" /proc/mounts || [ -n "$DIRECTORY" ] ; then
+ :
+ else
+ eerror "Error: $MNTPOINT not mounted, can not continue."
+ eend 1 ; exit 1
+ fi
+
+ if [ -n "$ISO" ] ; then
+ einfo "Running $DEBOOTSTRAP $DEBOOTSTRAP_OPT for release ${RELEASE}${ARCHINFO} using ${ISO}"
+ einfo "Executing: $DEBOOTSTRAP $ARCHCMD $KEYRING $DEBOOTSTRAP_OPT $RELEASE $MNTPOINT $ISO"
+ "$DEBOOTSTRAP" $ARCHCMD $KEYRING $DEBOOTSTRAP_OPT "$RELEASE" "$MNTPOINT" "$ISO"
+ RC=$?
+ else
+ einfo "Running $DEBOOTSTRAP $DEBOOTSTRAP_OPT for release ${RELEASE}${ARCHINFO} using ${MIRROR}"
+ einfo "Executing: $DEBOOTSTRAP $ARCHCMD $KEYRING $DEBOOTSTRAP_OPT $RELEASE $MNTPOINT $MIRROR"
+ "$DEBOOTSTRAP" $ARCHCMD $KEYRING $DEBOOTSTRAP_OPT "$RELEASE" "$MNTPOINT" "$MIRROR"
+ RC=$?
+ fi
+
+ if [ $RC -ne 0 ] ; then
+ if [ -r "$MNTPOINT/debootstrap/debootstrap.log" ] && \
+ [ -s "$MNTPOINT/debootstrap/debootstrap.log" ] ; then
+ einfo "Presenting last ten lines of debootstrap.log:"
+ tail -10 "${MNTPOINT}"/debootstrap/debootstrap.log
+ einfo "End of debootstrap.log"
+ fi
+ fi
+
+ eend $RC
+}
+# }}}
+
+# prepare chroot via chroot-script {{{
+preparechroot() {
+ einfo "Preparing chroot system"
+
+ # provide variables to chroot system
+ CHROOT_VARIABLES="/var/cache/grml-debootstrap/variables_${SHORT_TARGET}"
+ touch "$CHROOT_VARIABLES"
+ chmod 600 "$CHROOT_VARIABLES" # make sure nobody except root can read it
+ echo "# Configuration of ${PN}" > "$CHROOT_VARIABLES"
+ [ -n "$ARCH" ] && echo "ARCH=\"$ARCH\"" >> "$CHROOT_VARIABLES"
+ [ -n "$BACKPORTREPOS" ] && echo "BACKPORTREPOS=\"$BACKPORTREPOS\"" >> "$CHROOT_VARIABLES"
+ [ -n "$CHROOT_SCRIPTS" ] && echo "CHROOT_SCRIPTS=\"$CHROOT_SCRIPTS\"" >> "$CHROOT_VARIABLES"
+ [ -n "$CONFFILES" ] && echo "CONFFILES=\"$CONFFILES\"" >> "$CHROOT_VARIABLES"
+ [ -n "$DEBCONF" ] && echo "DEBCONF=\"$DEBCONF\"" >> "$CHROOT_VARIABLES"
+ [ -n "$DEBIAN_FRONTEND" ] && echo "DEBIAN_FRONTEND=\"$DEBIAN_FRONTEND\"" >> "$CHROOT_VARIABLES"
+ [ -n "$DEBOOTSTRAP" ] && echo "DEBOOTSTRAP=\"$DEBOOTSTRAP\"" >> "$CHROOT_VARIABLES"
+ [ -n "$DEFAULT_LOCALES" ] && echo "DEFAULT_LOCALES=\"$DEFAULT_LOCALES\"" >> "$CHROOT_VARIABLES"
+ [ -n "$DEFAULT_LANGUAGE" ] && echo "DEFAULT_LANGUAGE=\"$DEFAULT_LANGUAGE\"" >> "$CHROOT_VARIABLES"
+ [ -n "$EXTRAPACKAGES" ] && echo "EXTRAPACKAGES=\"$EXTRAPACKAGES\"" >> "$CHROOT_VARIABLES"
+ [ -n "$FALLBACK_MIRROR" ] && echo "FALLBACK_MIRROR=\"$FALLBACK_MIRROR\"" >> "$CHROOT_VARIABLES"
+ [ -n "$FORCE" ] && echo "FORCE=\"$FORCE\"" >> "$CHROOT_VARIABLES"
+ [ -n "$GRMLREPOS" ] && echo "GRMLREPOS=\"$GRMLREPOS\"" >> "$CHROOT_VARIABLES"
+ [ -n "$GRUB" ] && echo "GRUB=\"$GRUB\"" >> "$CHROOT_VARIABLES"
+ [ -n "$HOSTNAME" ] && echo "HOSTNAME=\"$HOSTNAME\"" >> "$CHROOT_VARIABLES"
+ [ -n "$INITRD" ] && echo "INITRD=\"$INITRD\"" >> "$CHROOT_VARIABLES"
+ [ -n "$INSTALL_NOTES" ] && echo "INSTALL_NOTES=\"$INSTALL_NOTES\"" >> "$CHROOT_VARIABLES"
+ [ -n "$ISODIR" ] && echo "ISODIR=\"$ISO\"" >> "$CHROOT_VARIABLES"
+ [ -n "$ISO" ] && echo "ISO=\"$ISO\"" >> "$CHROOT_VARIABLES"
+ [ -n "$KEEP_SRC_LIST" ] && echo "KEEP_SRC_LIST=\"$KEEP_SRC_LIST\"" >> "$CHROOT_VARIABLES"
+ [ -n "$LOCALES" ] && echo "LOCALES=\"$LOCALES\"" >> "$CHROOT_VARIABLES"
+ [ -n "$MIRROR" ] && echo "MIRROR=\"$MIRROR\"" >> "$CHROOT_VARIABLES"
+ [ -n "$MKFS" ] && echo "MKFS=\"$MKFS\"" >> "$CHROOT_VARIABLES"
+ [ -n "$NOPASSWORD" ] && echo "NOPASSWORD=\"true\"" >> "$CHROOT_VARIABLES"
+ [ -n "$NOKERNEL" ] && echo "NOKERNEL=\"true\"" >> "$CHROOT_VARIABLES"
+ [ -n "$PACKAGES" ] && echo "PACKAGES=\"$PACKAGES\"" >> "$CHROOT_VARIABLES"
+ [ -n "$PRE_SCRIPTS" ] && echo "PRE_SCRIPTS=\"$PRE_SCRIPTS\"" >> "$CHROOT_VARIABLES"
+ [ -n "$RECONFIGURE" ] && echo "RECONFIGURE=\"$RECONFIGURE\"" >> "$CHROOT_VARIABLES"
+ [ -n "$RELEASE" ] && echo "RELEASE=\"$RELEASE\"" >> "$CHROOT_VARIABLES"
+ [ -n "$RM_APTCACHE" ] && echo "RM_APTCACHE=\"$RM_APTCACHE\"" >> "$CHROOT_VARIABLES"
+ [ -n "$ROOTPASSWORD" ] && echo "ROOTPASSWORD=\"$ROOTPASSWORD\"" >> "$CHROOT_VARIABLES"
+ [ -n "$SCRIPTS" ] && echo "SCRIPTS=\"$SCRIPTS\"" >> "$CHROOT_VARIABLES"
+ [ -n "$SECURE" ] && echo "SECURE=\"$SECURE\"" >> "$CHROOT_VARIABLES"
+ [ -n "$SELECTED_PARTITIONS" ] && echo "SELECTED_PARTITIONS=\"$SELECTED_PARTITIONS\"" >> "$CHROOT_VARIABLES"
+ [ -n "$TARGET" ] && echo "TARGET=\"$TARGET\"" >> "$CHROOT_VARIABLES"
+ [ -n "$UPGRADE_SYSTEM" ] && echo "UPGRADE_SYSTEM=\"$UPGRADE_SYSTEM\"" >> "$CHROOT_VARIABLES"
+ [ -n "$TARGET_UUID" ] && echo "TARGET_UUID=\"$TARGET_UUID\"" >> "$CHROOT_VARIABLES"
+ [ -n "$TIMEZONE" ] && echo "TIMEZONE=\"$TIMEZONE\"" >> "$CHROOT_VARIABLES"
+ [ -n "$TUNE2FS" ] && echo "TUNE2FS=\"$TUNE2FS\"" >> "$CHROOT_VARIABLES"
+ [ -n "$VMSIZE" ] && echo "VMSIZE=\"$VMSIZE\"" >> "$CHROOT_VARIABLES"