added grml-chroot
authorMichael Gebetsroither <michael.geb@gmx.at>
Fri, 29 Aug 2008 10:00:05 +0000 (12:00 +0200)
committerMichael Gebetsroither <michael.geb@gmx.at>
Fri, 29 Aug 2008 10:00:05 +0000 (12:00 +0200)
debian/changelog
usr_sbin/grml-chroot [new file with mode: 0755]

index 47ad376..9bf565e 100644 (file)
@@ -1,3 +1,9 @@
+grml-scripts (1.1.10) UNRELEASED; urgency=low
+
+  * added grml-chroot 
+
+ -- Michael Gebetsroither <gebi@grml.org>  Fri, 29 Aug 2008 11:59:41 +0200
+
 grml-scripts (1.1.9) unstable; urgency=low
 
   * grml-quickconfig: integrate jwm [thanks for bringing up,
diff --git a/usr_sbin/grml-chroot b/usr_sbin/grml-chroot
new file mode 100755 (executable)
index 0000000..7e5f503
--- /dev/null
@@ -0,0 +1,91 @@
+#!/bin/bash
+# Filename:      grml-chroot
+# Purpose:       Program to chroot into another system
+# Authors:       grml-team (grml.org), (c) Michael Gebetsroither <gebi@grml.org>
+# Bug-Reports:   see http://grml.org/bugs/
+# License:       This file is licensed under the GPL v2.
+################################################################################
+
+PROG_NAME_=$(basename $0)
+DEST_=""
+MOUNTED_=""     # all mounted destinations
+
+
+function die
+{
+    echo "Error: $@" >&2
+    exit 1
+}
+
+function printUsage
+{
+    cat <<EOT
+Usage: "$PROG_NAME_" <chroot target>
+
+$PROG_NAME__ is a chroot wrapper with proc/sys/pts/dev fs handling
+
+EOT
+}
+
+function storeMounts
+{
+    local to_append_="$1"
+    if [[ $MOUNTED_ == "" ]]; then
+        MOUNTED_="$to_append_"
+    else
+        MOUNTED_="$MOUNTED_ $to_append_"
+    fi
+}
+
+function mountit
+{
+    local type_="$1" # type _or_ src
+    local dest_="$2"
+    local options_="$3"
+
+    local all_options_=""
+
+    if [[ $options_ == "--bind" ]]; then
+        all_options_="--bind $type_"
+    else
+        all_options_="-t $type_ none"
+    fi
+    mount $all_options_ "${DEST_}/$dest_" && storeMounts "$dest_"
+}
+
+function umount_all
+{
+    for i in $MOUNTED_; do
+        umount "${DEST_}/$i"
+    done
+}
+
+
+###
+### __MAIN
+###
+
+while getopts "h" opt; do
+    case "$opt" in
+        h) printUsage; exit 0 ;;
+        ?) printUsage; exit 64 ;;
+    esac
+done
+shift $(($OPTIND - 1))
+
+if (( $# < 1 )); then
+    die "Wrong number of arguments."
+fi
+
+DEST_="$1"
+
+if [ ! -d "$DEST_" ]; then
+    die "Target chroot does not exist: $DEST_"
+fi
+
+
+mountit "proc"  "proc"
+mountit "sysfs" "sys"
+mountit "/dev"   "dev"   "--bind"
+chroot "$DEST_" /bin/bash
+umount_all