blob: 90aa4b015ec99f752246d1bb888e6fa54170c127 (
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
|
#!/bin/sh
INIT=/sbin/init.sysvinit
#OVERLAYS=/media/ram /media/cf /media/card
ROOTBACKUP=/media/realroot
UNION=/media/union
PATH=/usr/bin:/usr/sbin:/bin:/sbin
if ! test -e ${INIT}; then
echo >&2 "ERROR: ${INIT} not found"
exit 1
fi
if test x"$*" != "x"; then
exec ${INIT} $*
fi
if ! which unionctl; then
exec ${INIT}
fi
nodupmount () {
opts=""
type=""
while true; do
if test "$1" = "-o"; then
shift
opts="-o $1"
shift
elif test "$1" = "-t"; then
shift
type="$1"
shift
else
break
fi
done
if test x"$2" = "x"; then
mountpt="$1"
else
device="$1"
mountpt="$2"
fi
mountmatch="^[^ ]+ $mountpt $type"
# echo "NOTE: grep -E -q \"$mountmatch\" /proc/mounts"
if grep -E -q "$mountmatch" /proc/mounts; then
return 0;
fi
if test x"$type" != "x"; then
type="-t $type"
fi
echo >&2 "NOTE: executing mount $type $opts $device $mountpt"
mkdir -p $mountpt
/bin/mount.busybox $type $opts $device $mountpt
ret="$?"
if test "$ret" = "0"; then
wemounted="$wemounted $mountpt"
fi
return $ret
}
#set -x
wemounted=""
(
set -e
/bin/mount.busybox /proc
insmod /lib/modules/`uname -r`/kernel/fs/unionfs.o
nodupmount -t unionfs -o dirs=/.=rw none ${UNION}
# nodupmount -o bind / ${UNION}/${ROOTBACKUP}
# for OVERLAY in ${OVERLAYS}; do
# nodupmount ${OVERLAY}
# union-ctl /. --add --mode rw ${OVERLAY}
# nodupmount -o bind ${OVERLAY} ${UNION}/${OVERLAY}
# done
/bin/umount.busybox /proc
# nodupmount -o bind /proc ${UNION}/proc
# nodupmount -o bind / ${ROOTBACKUP}
) || (
echo >&2 "ERROR: unable to setup mounts for chroot";
if test x"$wemounted" != "x"; then
# cleanup
for mount in $wemounted; do
/bin/umount.busybox $mount
done
fi
exec ${INIT}
)
cd ${UNION}
pivot_root . ./${ROOTBACKUP}
exec chroot . ${INIT}
|