X-Git-Url: http://git.grml.org/?a=blobdiff_plain;f=usr_sbin%2Fgrml-chroot;h=b13b57e006315dfea4ffb1de8801c68f0efa4e7e;hb=3b7f948896440f41092f14347b17ce114072c569;hp=7e5f50358ec4b0fde35fa80e12a5d7e935402b99;hpb=6f3191ec8e502a461cd26b6deffc9aa4c0451acc;p=grml-scripts.git diff --git a/usr_sbin/grml-chroot b/usr_sbin/grml-chroot index 7e5f503..b13b57e 100755 --- a/usr_sbin/grml-chroot +++ b/usr_sbin/grml-chroot @@ -6,23 +6,23 @@ # License: This file is licensed under the GPL v2. ################################################################################ -PROG_NAME_=$(basename $0) +PROG_NAME_=$(basename "$0") DEST_="" MOUNTED_="" # all mounted destinations function die { - echo "Error: $@" >&2 + echo "Error: $*" >&2 exit 1 } function printUsage { cat < +Usage: "$PROG_NAME_" NEWROOT [COMMAND....] -$PROG_NAME__ is a chroot wrapper with proc/sys/pts/dev fs handling +$PROG_NAME_ is a chroot wrapper with proc/sys/pts/dev filesystem handling EOT } @@ -43,19 +43,21 @@ function mountit local dest_="$2" local options_="$3" - local all_options_="" + local all_options_=() if [[ $options_ == "--bind" ]]; then - all_options_="--bind $type_" + all_options_+=(--bind "$type_") else - all_options_="-t $type_ none" + all_options_+=(-t "$type_" none) fi - mount $all_options_ "${DEST_}/$dest_" && storeMounts "$dest_" + mount "${all_options_[@]}" "${DEST_}/$dest_" && storeMounts "$dest_" } function umount_all { - for i in $MOUNTED_; do + local reverse + reverse=$(echo "$MOUNTED_" | awk '{ for (i=NF; i>1; i--) printf("%s ",$i); print $1; }') + for i in $reverse; do umount "${DEST_}/$i" done } @@ -71,21 +73,58 @@ while getopts "h" opt; do ?) printUsage; exit 64 ;; esac done -shift $(($OPTIND - 1)) +shift $((OPTIND - 1)) if (( $# < 1 )); then + printUsage die "Wrong number of arguments." fi -DEST_="$1" +if ! command -v 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_" /bin/bash + +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 /sys/firmware/efi/efivars ] ; then + mountit "efivarfs" "sys/firmware/efi/efivars" + fi + 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 [ -n "$WROTE_DEBIAN_CHROOT" ]; then + rm "$DEST_"/etc/debian_chroot +fi + +exit $RC