grml-chroot: mount /dev/pts as devpts inside chroot
[grml-scripts.git] / usr_sbin / grml-chroot
index 4277c34..17f3d3c 100755 (executable)
@@ -9,7 +9,6 @@
 PROG_NAME_=$(basename $0)
 DEST_=""
 MOUNTED_=""     # all mounted destinations
-COMMAND_=""     # command to start in chroot
 
 
 function die
@@ -23,7 +22,7 @@ function printUsage
     cat <<EOT
 Usage: "$PROG_NAME_" NEWROOT [COMMAND....]
 
-$PROG_NAME__ is a chroot wrapper with proc/sys/pts/dev filesystem handling
+$PROG_NAME_ is a chroot wrapper with proc/sys/pts/dev filesystem handling
 
 EOT
 }
@@ -46,8 +45,8 @@ function mountit
 
     local all_options_=""
 
-    if [[ $options_ == "--bind" ]]; then
-        all_options_="--bind $type_"
+    if [[ $options_ == "--rbind" ]]; then
+        all_options_="--rbind $type_"
     else
         all_options_="-t $type_ none"
     fi
@@ -57,7 +56,7 @@ function mountit
 function umount_all
 {
     for i in $MOUNTED_; do
-        umount "${DEST_}/$i"
+        umount --recursive "${DEST_}/$i"
     done
 }
 
@@ -75,11 +74,11 @@ done
 shift $(($OPTIND - 1))
 
 if (( $# < 1 )); then
+    printUsage
     die "Wrong number of arguments."
 fi
 
-DEST_="$1"
-COMMAND_="${2}"
+DEST_="$1"; shift
 
 if [ ! -d "$DEST_" ]; then
     die "Target chroot does not exist: $DEST_"
@@ -88,7 +87,26 @@ fi
 
 mountit "proc"  "proc"
 mountit "sysfs" "sys"
-mountit "/dev"   "dev"   "--bind"
-chroot "$DEST_" $COMMAND_
+mountit "/dev"   "dev"   "--rbind"
+
+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