blob: 72a621764b8b98c160b9a6dbf15af296a3c48f8a (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
#!/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
|