#!/bin/bash # To turn on systemd debug: # setenv bootargs "systemd.log_level=debug console=ttymxc0,115200 ubi.mtd=nandubi root=ubi0:rootfs rootfstype=ubifs ro # rootflags=chk_data_crc mtdparts=gpmi-nand:4m(nandboot),-(nandubi)" # Command to erase user data file system # Modified for ubifs, secure boot (no U-Boot access) MNT_USER="/mnt/user" OVERLAY="$MNT_USER/overlay" WORKDIR="$MNT_USER/work" UPPERDIR="$MNT_USER/upper" LOWERDIR="/" USER_ORIG="$UPPERDIR/orig" USER_PARTITION="ubi0:user-data" DO_ERASE_USERDATA_FILE="/mnt/user/.persistent/mts_do_erase_userdata" DO_CLEAR_USERDATA_FILE="/mnt/user/.persistent/mts_do_clear_userdata" pid=$$ prefix="<3>overlayrootfs-generator[${pid}]: " loginfo() { echo "${prefix}$@" >/dev/kmsg ; } logpipe() { cat <(echo -n "${prefix}") - >/dev/kmsg ; } mnt_user() { mkdir -p $MNT_USER mount -t ubifs $USER_PARTITION $MNT_USER } fs="/run /dev /proc /sys /sys/kernel/security /dev/shm /dev/pts /run /sys/fs/cgroup /sys/fs/cgroup/unified /sys/fs/cgroup/systemd /sys/fs/cgroup/devices /sys/fs/cgroup/freezer /sys/fs/cgroup/pids /sys/fs/cgroup/memory /dev/mqueue /sys/kernel/debug /tmp /sys/fs/fuse/connections /sys/kernel/config /var/volatile" my_switch_root() { NEW_ROOT=$1 echo mountinfo >&2 cat /proc/mounts >&2 mount --make-rprivate / for f in $fs ; do mount -o noatime,move --bind $f $NEW_ROOT/$f done /sbin/pivot_root $NEW_ROOT $NEW_ROOT/orig } # remove old hidden and non-hidden files and folders do_remove_old() { shopt -s dotglob rm -rf $MNT_USER/*.old shopt -u dotglob } # select files for deletion do_select_old() { if [[ -f $DO_ERASE_USERDATA_FILE ]]; then # when "erase user data" is requested - mark all hidden and non-hidden files for deletion shopt -s dotglob trap "shopt -u dotglob" RETURN loginfo "Erasing user data" else # when "clear user data" is requested - mark all non-hidden files for deletion loginfo "Clearing user data" fi 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" done } do_rw_mount() { loginfo "Starting RW overlayfs" mount -t tmpfs inittemp /mnt mnt_user do_remove_old if [[ -f $DO_CLEAR_USERDATA_FILE ]] || [[ -f $DO_ERASE_USERDATA_FILE ]] ; then do_select_old do_remove_old rm -f $DO_CLEAR_USERDATA_FILE fi mkdir -p $UPPERDIR $WORKDIR $OVERLAY $USER_ORIG ${MNT_USER}/.persistent loginfo "Mounting..." set -x mount -o noatime,lowerdir=$LOWERDIR,upperdir=$UPPERDIR,workdir=$WORKDIR,rw -t overlay overlay $OVERLAY loginfo "JAK: What does overlay look like in /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 >&2 mount -o remount,rw / cat /proc/mounts | grep overlay | logpipe cat /proc/mounts | grep tmp | logpipe umount -l /tmp umount -l /var/volatile cgroupmnts=$(sed -r -e 's/[^[:space:]]*[[:space:]]//' -e 's/[[:space:]]+.*//g' /proc/mounts | grep '^/orig') for mp in ${cgroupmnts} ; do if [[ $mp != /orig ]] ; then umount -l $mp fi done } do_start() { do_rw_mount } case $1 in start) do_start ;; *) echo "Usage: $0 {start}" ;; esac