#!/bin/bash export LC_ALL=C cd "$(realpath "${0%/*}")" unset CHROOT_CMD unset EXECUTE unset NO_EXIT unset Mount_PT_to_Del declare -a options="$(getopt -o c:,e:,n: --long chroot-cmd::,chroot-command,cmd::,::command::,no-exit:: -- "$@")" eval set --"$options_str" eval set --"$options" while [ $# -gt 0 ]; do case "$1" in -c|--chroot-cmd|--chroot-command) if [ $# -lt 2 ] || [[ $2 = 1* ]]; then CHROOT_CMD=( iron ) shift 1 else CHROOT_CMD=( $2 ) shift 2 fi [ -z ${EXECUTE+x} ] && EXECUTE="" ;; -e|--cmd|--command) if [ $# -lt 2 ] || [[ $2 = 1* ]]; then EXECUTE=( iron ) shift 1 else EXECUTE=( $2 ) shift 2 fi [ -z ${CHROOT_CMD+x} ] && CHROOT_CMD="" ;; --no-exit) if [ $# -lt 2 ] || [[ $2 = 1* ]]; then NO_EXIT=true shift 1 else NO_EXIT=$2 shift 2 fi ;; --) shift break ;; *) shift ;; esac done if [ -z ${NO_EXIT+x} ]; then NO_EXIT=false fi if [ -z ${CHROOT_CMD+x} ] && [ -z ${EXECUTE+x} ]; then CHROOT_CMD=( iron ) EXECUTE="" fi SFS_NAME="$(ls -1 ../*iron*.sfs | head -n 1 | sed -r 's#^[.][.]/##g' | sed -r 's#[.]sfs##g')" Parent_WD="$(realpath "$PWD/..")" SFS_PATH="$Parent_WD/$SFS_NAME".sfs Cont_Root=/mnt/cont #TODO: fix spelling of CONT_NAME_SOUCE CONT_NAME_SOUCE=cont #These manes must have a length greater than 1 so as to exclude "/". I'll make this more general later CONT_NAME_DEST=cont Mount_PT_ID="" #Don't edit this function umountall(){ set -x umount -l /${CONT_NAME_DEST}/tmp/.X11-unix umount -l /${CONT_NAME_DEST}/dev/pts umount -l /${CONT_NAME_DEST}/dev umount -l /${CONT_NAME_DEST}/proc umount -l /${CONT_NAME_DEST}/sys umount -l "/$CONT_NAME_DEST" umount -l "$Cont_TMPFS" umount -l "${BIND_Target}" if [ -z ${Mount_PT_to_Del+x} ]; then files_to_remove=("/${CONT_NAME_DEST}" "$Cont_TMPFS" "$BIND_Target_Root") else files_to_remove=("/${CONT_NAME_DEST}" "$Cont_TMPFS" "$Mount_PT_to_Del" "$BIND_Target_Root") fi for to_remove in "${files_to_remove[@]}"; do to_remove="$(realpath "/${to_remove}")" if [ -z "$(cat /proc/mounts | grep "${to_remove}")" ] && [ ${#to_remove} -gt 1 ]; then rm -rf ${to_remove} fi done xhost - } trap 'umountall' 1 mkdir -p /${CONT_NAME_DEST} if [ ! -z "$(ls -A "/${CONT_NAME_DEST}")" ]; then cd / CONT_NAME_DEST=$(mktemp -u ${CONT_NAME_DEST}.XXXXXXX) fi mkdir -p "/$CONT_NAME_DEST" append_mnt_id_awk=' function get_mnt_id(mnt_pt,loop){ if (length(mnt_pt) > 0 && length(loop)>0){ cmd="cat /proc/self/mountinfo | sort | grep '" loop "' | grep " mnt_pt " | head -n 1" } else if (length(mnt_pt) > 0){ cmd="cat /proc/self/mountinfo | sort | grep '" mnt_pt "' | head -n 1" } else if (length(loop)>0){ cmd="cat /proc/self/mountinfo | sort | grep '" loop "' | head -n 1" } while ((cmd | getline )){ mnt_id=$1 break } close(cmd) return mnt_id } { mnt_pt=$1 loop=$2 mnt_id=get_mnt_id(mnt_pt,loop) print mnt_id "|" mnt_pt "|" loop }' loop=$(losetup -a | grep "$SFS_PATH" | sed "s/:.*$//" ) if [ ! -z "$loop" ]; then #Mount_PT=$(findmnt -o TARGET,SOURCE -D -n | grep "${loop}\$" | cut -f1 -d' ') Mount_PT="$(findmnt -o TARGET,SOURCE -D -n | grep 'loop5$' | awk "$append_mnt_id_awk" | sort -t '|' -k1 | cut -d'|' -f2 | head -n 1)" else Mount_PT=${CHROOT_DIR:-/mnt/cont/sfs_img} if [ ! -z "$(ls -A "$Mount_PT")" ]; then Mount_PT=$(mktemp -d -p "$Cont_Root" sfs_img.XXXXXXX) Mount_PT_ID=".${Mount_PT##*.}" fi mkdir -p "${Mount_PT}" mount -o loop "$SFS_PATH" "$Mount_PT" Mount_PT_to_Del=$Mount_PT fi #MNTPNT=${CHROOT_DIR:-/mnt/chroot-$SFS_NAME} if [ ${#CONT_NAME_SOUCE} -le 1 ]; then BIND_Source="${Mount_PT}" else BIND_Source="${Mount_PT}/${CONT_NAME_SOUCE}" fi mkdir -p "$BIND_Source" BIND_Target_Root="$Cont_Root"/sfs__target${Mount_PT_ID} if [ ${#Mount_PT_ID} -gt 0 ]; then BIND_Target_Root="$Cont_Root"/sfs__target${Mount_PT_ID} elif [ -z "$(ls -A "$BIND_Target_Root")" ]; then BIND_Target_Root="$Cont_Root"/sfs__target else BIND_Target_Root=$(mktemp -d -p "$Cont_Root" sfs__target.XXXXXXX) fi mkdir -p "$BIND_Target_Root" if [ ${#CONT_NAME_DEST} -gt 0 ]; then BIND_Target=$BIND_Target_Root/${CONT_NAME_DEST} else BIND_Target=$BIND_Target_Root fi mkdir -p "$BIND_Target" if [ ${#Mount_PT_ID} -gt 0 ]; then Cont_TMPFS="$Cont_Root"/tmpfs${Mount_PT_ID} elif [ -z "$(ls -A "${Cont_Root}/tmpfs")" ]; then Cont_TMPFS="$Cont_Root"/tmpfs else Cont_TMPFS=$(mktemp -d -p "$Cont_Root" tmpfs.XXXXXXX) fi mkdir -p "$Cont_TMPFS" mount -t tmpfs none "$Cont_TMPFS" #mount -t tmpfs none $BIND_Target_Root; #NEW='' #MOUNTED_PUP_RO=$(busybox df | grep -o '/initrd/pup_ro.*') ## pup_ro1 and pup_ro2 are reserved #for i in $(seq 3 99) # find free pup_roX #do # if ! [ "$(echo "$MOUNTED_PUP_RO" | grep "pup_ro${i}$")" ] ; then # NEW=${i} # break # fi #done #Cont_Layer=/initrd/pup_ro$NEW mount --bind "${BIND_Source}" "${BIND_Target}" #ln -s "$BIND_Target_Root" "$Cont_Layer" set +x read -p "Press enter to continue" set -x busybox mount -t aufs -o "udba=reval,diropq=w,br:${Cont_TMPFS}=rw:${BIND_Target}=rr" aufs "/$CONT_NAME_DEST" || { umountall && exit 1; } #busybox mount -t aufs -o remount,append:$BIND_Target_Root=rr / || { umountall && exit 1; } mount --bind /dev /${CONT_NAME_DEST}/dev mount --bind /proc /${CONT_NAME_DEST}/proc mount --bind /sys /${CONT_NAME_DEST}/sys mount -t devpts devpts /${CONT_NAME_DEST}/dev/pts cp /etc/resolv.conf /${CONT_NAME_DEST}/etc/resolv.conf cp /var/lib/dbus/machine-id /${CONT_NAME_DEST}/var/lib/dbus/machine-id xhost + mkdir -p /${CONT_NAME_DEST}/tmp/.X11-unix mount --rbind /tmp/.X11-unix /${CONT_NAME_DEST}/tmp/.X11-unix cd /${CONT_NAME_DEST} set +x if [ ! -z "${EXECUTE}" ]; then echo "next cmd: \"${EXECUTE[@]}\" \"$@\"" read -p "Ready to EXECUTE Press enter to continue" "${EXECUTE[@]}" "$@" fi if [ -z ${CHROOT_CMD+x} ]]; then echo "next cmd: \"${CHROOT_CMD[@]}\" \"$@\"" read -p "Ready to chroot Press enter to continue" "${CHROOT_CMD[@]}" "$@" fi chroot /${CONT_NAME_DEST} iron "$@" set -x if [ ! NO_EXIT = true ]; then umountall fi