Improve check for identifying underlying block device
[grml-debootstrap.git] / grml-debootstrap
index 9b8c47d..a3db195 100755 (executable)
@@ -144,6 +144,8 @@ Configuration options:
       --grmlrepos          Enable Grml's Debian repository (deb.grml.org).
       --backportrepos      Enable Debian's backports repository (backports.debian.org).
       --keep_src_list      Do not overwrite user provided apt sources.list.
+      --contrib            Enable 'contrib' in COMPONENTS (defaults to 'main' only).
+      --non-free           Enable non-free in COMPONENTS (defaults to 'main' only).
       --hostname <name>    Hostname of Debian system.
       --nopassword         Do not prompt for the root password.
       --password <pwd>     Use specified password as password for user root.
@@ -394,6 +396,11 @@ fi
 [ "$_opt_verbose" ]             && VERBOSE="-v"
 [ "$_opt_debug" ]               && DEBUG="true"
 
+# make sure main is always included
+[ -z "$COMPONENTS" ]            && COMPONENTS="main"
+[ "$_opt_contrib" ]             && COMPONENTS="$COMPONENTS contrib"
+[ "$_opt_non_free" ]            && COMPONENTS="$COMPONENTS non-free"
+
 if [ "$DEBUG" = "true" ] ; then
   set -x
 fi
@@ -988,10 +995,19 @@ mkfs() {
 
     # make sure /dev/disk/by-uuid/... is up2date, otherwise grub
     # will fail to detect the uuid in the chroot
-    if echo "$TARGET" | grep -q "/dev/md" ; then
+    if [ -n "$VIRTUAL" ] ; then
+      einfo "Virtual environment doesn't require blockdev --rereadpt, skipping therefore"
+    elif echo "$TARGET" | grep -q "/dev/md" ; then
       blockdev --rereadpt "${TARGET}"
-    elif ! [ -n "$VIRTUAL" ] ; then
-      blockdev --rereadpt "${TARGET%%[0-9]*}"
+    else
+      # if we deploy to /dev/sdX# then let's see if /dev/sdX exists
+      local main_device="${TARGET%%[0-9]*}"
+      # sanity check to not try to e.g. access /dev/loop if we get /dev/loop0
+      if [ -f "/sys/block/$(basename ${main_device})/$(basename ${TARGET})/dev" ] ; then
+        blockdev --rereadpt "$main_device"
+      else
+        einfo "No underlying block device for $TARGET identified, skipping blockdev --rereadpt."
+      fi
     fi
     # give the system 2 seconds, otherwise we might run into
     # race conditions :-/
@@ -1228,6 +1244,7 @@ preparechroot() {
   [ -n "$ARCH" ]                && echo "ARCH='$(sed "s,','\\\\'',g" <<<"${ARCH}")'"                               >> "$CHROOT_VARIABLES"
   [ -n "$BACKPORTREPOS" ]       && echo "BACKPORTREPOS='$(sed "s,','\\\\'',g" <<<"${BACKPORTREPOS}")'"             >> "$CHROOT_VARIABLES"
   [ -n "$CHROOT_SCRIPTS" ]      && echo "CHROOT_SCRIPTS='$(sed "s,','\\\\'',g" <<<"${CHROOT_SCRIPTS}")'"           >> "$CHROOT_VARIABLES"
+  [ -n "$COMPONENTS" ]          && echo "COMPONENTS='$(sed "s,','\\\\'',g" <<<"${COMPONENTS}")'"                   >> "$CHROOT_VARIABLES"
   [ -n "$CONFFILES" ]           && echo "CONFFILES='$(sed "s,','\\\\'',g" <<<"${CONFFILES}")'"                     >> "$CHROOT_VARIABLES"
   [ -n "$DEBCONF" ]             && echo "DEBCONF='$(sed "s,','\\\\'',g" <<<"${DEBCONF}")'"                         >> "$CHROOT_VARIABLES"
   [ -n "$DEBIAN_FRONTEND" ]     && echo "DEBIAN_FRONTEND='$(sed "s,','\\\\'',g" <<<"${DEBIAN_FRONTEND}")'"         >> "$CHROOT_VARIABLES"