X-Git-Url: https://git.grml.org/?p=grml-debootstrap.git;a=blobdiff_plain;f=grml-debootstrap;h=2a27c460c20af95d61050fe1759c389c697dbf96;hp=b967baa8d2050c712ea6cd3f1b53a453ebb6de9f;hb=b3cddceda4de4d2417cbba3b7e8ae78fd72764f0;hpb=a2b19f17d05810eb20667ced83135a0a4a049940 diff --git a/grml-debootstrap b/grml-debootstrap index b967baa..2a27c46 100755 --- a/grml-debootstrap +++ b/grml-debootstrap @@ -8,7 +8,11 @@ # variables {{{ PN="$(basename "$0")" -VERSION="$(dpkg-query --show --showformat='${Version}' "$PN")" +if [[ -d "$(dirname "$(which "$0")")"/.git ]]; then + VERSION="$(git describe | sed 's|^v||')" +else + VERSION="$(dpkg-query --show --showformat='${Version}' "$PN")" +fi VERSION="${VERSION:-unknown}" MNTPOINT="/mnt/debootstrap.$$" @@ -205,8 +209,11 @@ cleanup() { if [ -n "$MNTPOINT" ] ; then if grep -q "$MNTPOINT" /proc/mounts ; then # make sure nothing is left inside chroot so we can unmount it - [ -x "$MNTPOINT"/etc/init.d/ssh ] && "$MNTPOINT"/etc/init.d/ssh stop - [ -x "$MNTPOINT"/etc/init.d/mdadm ] && "$MNTPOINT"/etc/init.d/mdadm stop + for service in ssh mdadm ; do + if [ -x "${MNTPOINT}/etc/init.d/${service}" ] ; then + chroot "$MNTPOINT" "/etc/init.d/${service}" stop + fi + done [ -x "$MNTPOINT"/bin/umount ] && chroot "$MNTPOINT" umount -a >/dev/null 2>&1 @@ -375,7 +382,7 @@ fi # make sure we have what we need {{{ if [ -n "$VIRTUAL" ] ; then - check4progs kpartx mksh parted qemu-img || bailout 1 + check4progs grub-mkimage kpartx mksh parted qemu-img || bailout 1 fi # }}} @@ -419,7 +426,7 @@ prompt_for_target() AVAILABLE_PARTITIONS=$(LANG=C fdisk -l 2>/dev/null | \ sed 's/*//' | \ grep -v 'Extended$' | \ - gawk -v num=0 -v ORS=' ' '/^\/dev\// {print $1}'; ls /dev/md* 2>/dev/null || true); + gawk -v num=0 -v ORS=' ' '/^\/dev\// {print $1}'; ls /dev/md[0-9]* 2>/dev/null || true); if [ -z "$AVAILABLE_PARTITIONS" ] ; then dialog --title "$PN" --trim \ @@ -430,7 +437,10 @@ prompt_for_target() fi PARTITION_LIST=$(for i in $AVAILABLE_PARTITIONS ; do - echo "$i $(blkid -s TYPE -o value "$i" 2>/dev/null || echo '[no_filesystem_yet]')" + fs="$(blkid -s TYPE -o value "$i" 2>/dev/null)" + [ -n "$fs" ] || fs='[no_filesystem_yet]' + echo "$i" "$fs" + unset fs done) TARGET=$(dialog --title "$PN" --single-quoted --stdout \ @@ -818,6 +828,14 @@ if [ "$CURRENT_ARCH" != "x86_64" ] ; then fi # }}} +# Support for generic release codenames is unavailable. {{{ +if [ "$RELEASE" = "stable" ] || [ "$RELEASE" = "testing" ] ; then + eerror "Generic release codenames (stable, testing) are unsupported. \ +Please use specific codenames such as lenny, squeeze, wheezy or jessie." ; eend 1 + bailout 1 +fi +# }}} + checkconfiguration # finally make sure at least $TARGET is set [the partition for the new system] {{{ @@ -1036,7 +1054,7 @@ prepare_vm() { fi fi - DEVINFO=$(kpartx -av "$TARGET") # 'add map loop1p1 (253:0): 0 6289408 linear /dev/loop1 2048' + 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 @@ -1078,7 +1096,14 @@ finalize_vm() { bailout 1 fi - cp "${MNTPOINT}"/usr/lib/grub/i386-pc/* "${MNTPOINT}/boot/grub/" + 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" @@ -1089,18 +1114,16 @@ finalize_vm() { 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 - - einfo "Adjusting grub.cfg for successful boot sequence." - if [ "$FIXED_DISK_IDENTIFIERS" = "yes" ]; then - sed -i "s;root=[^ ]\+;root=UUID=$DISK_IDENTIFIER;" /boot/grub/grub.cfg - else - sed -i "s;set root=.*;set root='(hd0,msdos1)';" "${MNTPOINT}"/boot/grub/grub.cfg - sed -i "s;root=[^ ]\+;root=/dev/sda1;" "${MNTPOINT}"/boot/grub/grub.cfg - fi - umount "${MNTPOINT}" kpartx -d "${ORIG_TARGET}" >/dev/null } @@ -1330,6 +1353,26 @@ execute_scripts() { } # }}} +try_umount() { + local tries=$1 + local mountpoint="$2" + + for (( try=1; try<=tries; try++ )); do + if [[ ${try} -eq ${tries} ]]; then + # Last time, show errors this time + umount "${mountpoint}" && return 0 + else + # Not last time, hide errors until fatal + if umount "${mountpoint}" 2>/dev/null ; then + return 0 + else + sleep 1 + fi + fi + done + return 1 # Tried enough +} + # execute chroot-script {{{ chrootscript() { if ! [ -r "$MNTPOINT/bin/chroot-script" ] ; then @@ -1347,7 +1390,7 @@ chrootscript() { else chroot "$MNTPOINT" /bin/chroot-script ; RC=$? fi - umount "$MNTPOINT"/dev + try_umount 3 "$MNTPOINT"/dev eend $RC fi