grml-chroot: bind-mount /run/udev in target system as workaround for lvm2 issue ...
[grml-scripts.git] / usr_sbin / grml-chroot
index 0985924..3b27505 100755 (executable)
@@ -9,7 +9,6 @@
 PROG_NAME_=$(basename $0)
 DEST_=""
 MOUNTED_=""     # all mounted destinations
-COMMAND_=""     # command to start in chroot
 
 
 function die
@@ -56,7 +55,8 @@ function mountit
 
 function umount_all
 {
-    for i in $MOUNTED_; do
+    local reverse=$(echo $MOUNTED_ | awk '{ for (i=NF; i>1; i--) printf("%s ",$i); print $1; }')
+    for i in $reverse; do
         umount "${DEST_}/$i"
     done
 }
@@ -79,17 +79,48 @@ if (( $# < 1 )); then
     die "Wrong number of arguments."
 fi
 
-DEST_="$1"
-COMMAND_="${2}"
+if ! which awk >/dev/null 2>&1 ; then
+  die "No awk binary found, required for execution."
+fi
+
+DEST_="$1"; shift
 
 if [ ! -d "$DEST_" ]; then
     die "Target chroot does not exist: $DEST_"
 fi
 
 
-mountit "proc"  "proc"
-mountit "sysfs" "sys"
-mountit "/dev"   "dev"   "--bind"
-chroot "$DEST_" $COMMAND_
+
+if [ -f "$DEST_"/proc/cmdline ] ; then
+    echo "Looks like $DEST_ already has filesystems mounted, skipping."
+else
+    mountit "proc"  "proc"
+    mountit "sysfs" "sys"
+    mountit "/dev"   "dev"   "--bind"
+    mountit "devpts" "dev/pts"
+    if [ -d "$DEST_"/run/udev ] && [ -d /run/udev ] ; then
+      mountit "/run/udev" "/run/udev" "--bind"
+    fi
+fi
+
+WROTE_DEBIAN_CHROOT=""
+if [ ! -f "$DEST_"/etc/debian_chroot ]; then
+    WROTE_DEBIAN_CHROOT="yes"
+    echo "Writing /etc/debian_chroot ..."
+    cat "$DEST_"/etc/hostname > "$DEST_"/etc/debian_chroot
+fi
+
+if (( $# < 1 )); then
+    chroot "$DEST_"
+    RC=$?
+else
+    chroot "$DEST_" "$@"
+    RC=$?
+fi
 umount_all
 
+if [ ! -z "$WROTE_DEBIAN_CHROOT" ]; then
+    rm "$DEST_"/etc/debian_chroot
+fi
+
+exit $RC