Try unmounting [..]/dev harder
[grml-debootstrap.git] / grml-debootstrap
index 4adb0be..7a71239 100755 (executable)
@@ -23,7 +23,7 @@ MNTPOINT="/mnt/debootstrap.$$"
 [ -n "$DISK_IDENTIFIER" ] || DISK_IDENTIFIER='26ada0c0-1165-4098-884d-aafd2220c2c6'
 [ -n "$EXTRAPACKAGES" ] || EXTRAPACKAGES='yes'
 [ -n "$FALLBACK_MIRROR" ] || FALLBACK_MIRROR='http://http.debian.net/debian'
-[ -n "$FIXED_DISK_IDENTIFIERS" ] || FIXED_DISK_IDENTIFIERS="yes"
+[ -n "$FIXED_DISK_IDENTIFIERS" ] || FIXED_DISK_IDENTIFIERS="no"
 [ -n "$FORCE" ] || FORCE=''
 [ -n "$HOSTNAME" ] || HOSTNAME='grml'
 [ -n "$INITRD" ] || INITRD='yes'
@@ -419,7 +419,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 +430,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 \
@@ -1036,7 +1039,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 +1081,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 +1099,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 +1338,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 +1375,7 @@ chrootscript() {
     else
       chroot "$MNTPOINT" /bin/chroot-script ; RC=$?
     fi
-    umount "$MNTPOINT"/dev
+    try_umount 3 "$MNTPOINT"/dev
     eend $RC
   fi