#!/bin/bash # Command to erase user data file system MNT_USER="/mnt/user" OVERLAY="$MNT_USER/overlay" WORKDIR="$MNT_USER/work" UPPERDIR="$MNT_USER/upper" LOWERDIR="/" USER_ORIG="$UPPERDIR/orig" USER_PARTITION="User data" TABLE=$'\n'"$(cat /proc/mtd)" # Erase the file system DO_ERASE_PERSISTENT="/mnt/user/.persistent/mts_do_erase_persistent" # Remove files not hidden DO_CLEAR_PERSISTENT="/mnt/user/.persistent/mts_do_clear_persistent" pid=$$ prefix="<3>overlayrootfs-generator[${pid}]: " loginfo() { echo "${prefix}$@" >/dev/kmsg ; } logpipe() { OIFS="${IFS}" IFS=$'\n' while read ln ; do echo -n "${prefix}${ln}" >/dev/kmsg done IFS="${OIFS}" } if [[ $TABLE =~ [[:space:]]mtd([[:digit:]]+)[^\"]*\"$USER_PARTITION\" ]] ; then USER_DEV=/dev/mtd${BASH_REMATCH[1]} else loginfo "Cannot find a User data partition" exit 0 fi fs="/dev /proc /sys /run /var/volatile /dev/pts /sys/kernel/debug /sys/kernel/config" mnt_user() { mkdir -p $MNT_USER mount -t jffs2 $USER_DEV $MNT_USER } my_switch_root() { NEW_ROOT=$1 loginfo mountinfo mount --make-rprivate / loginfo "my_switch_root: Mount file systems" for f in $fs ; do if [[ -d $NEW_ROOT/$f ]] ; then loginfo "my_switch_root: mount -o noatime,move --bind $f $NEW_ROOT/$f" mount -o noatime,move --bind $f $NEW_ROOT/$f else # loginfo "my_switch_root: Skipping $NEW_ROOT/$f" : fi done /sbin/pivot_root $NEW_ROOT $NEW_ROOT/orig } do_remove_old() { shopt -s dotglob rm -rf $MNT_USER/*.old shopt -u dotglob } # select files for deletion do_clear_old() { # when "clear user data" is requested - mark all non-hidden files for deletion loginfo "Clearing user data. Persistent data will be left " for FILE_PATH in "$MNT_USER"/*; do FILE_NAME=$(basename "$FILE_PATH") # rename all files and folders that exist in /mnt/user mv "$FILE_PATH" "$MNT_USER/$FILE_NAME.old" 2>&1 | logpipe done do_remove_old rm -f $DO_CLEAR_PERSISTENT } # Most efficient way to clear UBIFS file system do_erase_old() { loginfo "Erasing user data" # Sys must be mounted to use ubifs utilities mount -t sysfs sysfs /sys umount -l $MNT_USER loginfo "Erase user-data partition $USER_DEV" ls -l ${USER_DEV} 2>&1 | logpipe flash_erase -j ${USER_DEV} 0 0 2>&1 | logpipe mnt_user } do_rw_mount() { loginfo "Starting RW overlayfs" mount -t tmpfs inittemp /mnt mnt_user # user_data is now accessible do_remove_old cat /proc/mounts | logpipe loginfo "ls -lad /mnt" ls -lad /mnt 2>&1 | logpipe loginfo "ls -lad /mnt/user" ls -lad /mnt/user 2>&1 | logpipe loginfo "ls -lad /mnt/user/.persistent" ls -lad /mnt/user/.persistent 2>&1 | logpipe loginfo "ls -la /mnt/user/.persistent" ls -la /mnt/user/.persistent 2>&1 | logpipe loginfo "ls -lad $DO_ERASE_PERSISTENT" ls -lad "$DO_ERASE_PERSISTENT" 2>&1 | logpipe if [[ -f $DO_ERASE_PERSISTENT ]] ; then loginfo "do_erase_old is next" do_erase_old elif [[ -f $DO_CLEAR_PERSISTENT ]] ; then do_clear_old fi mkdir -p $UPPERDIR $WORKDIR $OVERLAY $USER_ORIG ${MNT_USER}/.persistent loginfo "Mounting..." mount -o index=off,metacopy=off,noatime,lowerdir=$LOWERDIR,upperdir=$UPPERDIR,workdir=$WORKDIR,rw -t overlay overlay $OVERLAY loginfo "/proc/mounts:" cat /proc/mounts | grep overlay | logpipe mkdir -p ${OVERLAY}/var/persistent mount --bind ${MNT_USER}/.persistent ${OVERLAY}/var/persistent loginfo "Switch root to $OVERLAY" my_switch_root $OVERLAY cat /proc/mounts | grep overlay | logpipe mount -o remount,rw / cat /proc/mounts | grep overlay | logpipe cat /proc/mounts | grep tmp | logpipe umount -l /tmp >/dev/null 2>&1 umount -l /var/volatile >/dev/null 2>&1 cgroupmnts=$(sed -r -e 's/[^[:space:]]*[[:space:]]//' -e 's/[[:space:]]+.*//g' /proc/mounts | grep '^/orig') for mp in ${cgroupmnts} ; do if [[ $mp != /orig ]] && [[ -d $mp ]] ; then umount -l $mp >/dev/null 2>&1 fi done } do_start() { do_rw_mount } case $1 in start) do_start ;; *) echo "Usage: $0 {start}" ;; esac