s243a icon

ironchroot (with options)

s243a | PRO | 01/19/21 03:07:10 AM UTC (Edited) | 0 ⭐ | 1802 👁️ | Never ⏰ | []
Bash |

6.26 KB

|

None

|

0 👍

/

0 👎

#!/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
 

Comments