From 6f3191ec8e502a461cd26b6deffc9aa4c0451acc Mon Sep 17 00:00:00 2001 From: Michael Gebetsroither Date: Fri, 29 Aug 2008 12:00:05 +0200 Subject: [PATCH] added grml-chroot --- debian/changelog | 6 ++++ usr_sbin/grml-chroot | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100755 usr_sbin/grml-chroot diff --git a/debian/changelog b/debian/changelog index 47ad376..9bf565e 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +grml-scripts (1.1.10) UNRELEASED; urgency=low + + * added grml-chroot + + -- Michael Gebetsroither 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 index 0000000..7e5f503 --- /dev/null +++ b/usr_sbin/grml-chroot @@ -0,0 +1,91 @@ +#!/bin/bash +# Filename: grml-chroot +# Purpose: Program to chroot into another system +# Authors: grml-team (grml.org), (c) Michael Gebetsroither +# 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 < + +$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 -- 2.1.4