summaryrefslogtreecommitdiff
path: root/recipes-core/multitech/overlayfs-init/overlayfs.init
blob: 4da621783de9367785d25d6615cbf27225318777 (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
#!/bin/bash

MNT_USER="/mnt/user"
OVERLAY="$MNT_USER/overlay"
WORKDIR="$MNT_USER/work"
UPPERDIR="$MNT_USER/upper"
LOWERDIR="/"
USER_ORIG="$UPPERDIR/orig"
USER_PARTITION="/dev/mtdblock9"
DO_ERASE_USERDATA_FILE="/mnt/user/.persistent/mts_do_erase_userdata"

loginfo()  { logger -s -t overlayfs "info: $@" 1>&2 ; }

mnt_user() {
    mkdir -p $MNT_USER
    mount -t jffs2 $USER_PARTITION $MNT_USER
}

switch_root() {
    NEW_ROOT=$1
    mount -o noatime,move --bind /run $NEW_ROOT/run
    mount -o noatime,move --bind /dev $NEW_ROOT/dev
    mount -o noatime,move --bind /proc $NEW_ROOT/proc
    mount -o noatime,move --bind /sys $NEW_ROOT/sys
    /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 u-boot printenv default_reset_f; then
        do_select_old
        do_remove_old
        u-boot setenv default_reset_f
    fi

    mkdir -p $UPPERDIR $WORKDIR $OVERLAY $USER_ORIG ${MNT_USER}/.persistent
    loginfo "Mounting..."
    mount -o noatime,lowerdir=$LOWERDIR,upperdir=$UPPERDIR,workdir=$WORKDIR -t overlay overlay $OVERLAY

    mkdir -p ${OVERLAY}/var/persistent
    mount --bind ${MNT_USER}/.persistent ${OVERLAY}/var/persistent

    switch_root $OVERLAY
}

do_start() {
    do_rw_mount
}

case $1 in
start)
    do_start
;;
*)
    echo "Usage: $0 {start}"
;;
esac