|
|
|
@ -48,7 +48,12 @@ pivot() { # <new_root> <old_root> |
|
|
|
|
fopivot() { # <rw_root> <ro_root> <dupe?> |
|
|
|
|
root=$1 |
|
|
|
|
{ |
|
|
|
|
mount -t mini_fo -o base=/,sto=$1 "mini_fo:$1" /mnt 2>&- && root=/mnt |
|
|
|
|
if grep -q mini_fo /proc/filesystems; then |
|
|
|
|
mount -t mini_fo -o base=/,sto=$1 "mini_fo:$1" /mnt 2>&- && root=/mnt |
|
|
|
|
else |
|
|
|
|
mount --bind / /mnt |
|
|
|
|
mount --bind -o union "$1" /mnt && root=/mnt |
|
|
|
|
fi |
|
|
|
|
} || { |
|
|
|
|
[ "$3" = "1" ] && { |
|
|
|
|
mount | grep "on $1 type" 2>&- 1>&- || mount -o bind $1 $1 |
|
|
|
@ -60,6 +65,7 @@ fopivot() { # <rw_root> <ro_root> <dupe?> |
|
|
|
|
|
|
|
|
|
ramoverlay() { |
|
|
|
|
mkdir -p /tmp/root |
|
|
|
|
mount -t tmpfs root /tmp/root |
|
|
|
|
fopivot /tmp/root /rom 1 |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -78,28 +84,59 @@ ramoverlay() { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
[ "$1" = "switch2jffs" ] && { |
|
|
|
|
mount "$mtdpart" /rom/jffs -t jffs2 || exit |
|
|
|
|
|
|
|
|
|
# try to avoid fs changing while copying |
|
|
|
|
mount -o remount,ro none / 2>&- |
|
|
|
|
|
|
|
|
|
# copy ramoverlay to jffs2 |
|
|
|
|
echo -n "copying files ... " |
|
|
|
|
cp -a /tmp/root/* /rom/jffs 2>&- |
|
|
|
|
echo "done" |
|
|
|
|
|
|
|
|
|
# switch back to squashfs (temporarily) |
|
|
|
|
# and park the ramdisk ontop of /tmp/root |
|
|
|
|
pivot /rom /mnt |
|
|
|
|
mount -o move /mnt /tmp/root |
|
|
|
|
|
|
|
|
|
# /jffs is the overlay |
|
|
|
|
# /rom is the readonly |
|
|
|
|
fopivot /jffs /rom |
|
|
|
|
|
|
|
|
|
# try to get rid of /tmp/root |
|
|
|
|
# this will almost always fail |
|
|
|
|
umount /tmp/root 2>&- |
|
|
|
|
if grep -q mini_fo /proc/filesystems; then |
|
|
|
|
mount "$mtdpart" /rom/jffs -t jffs2 || exit |
|
|
|
|
|
|
|
|
|
# try to avoid fs changing while copying |
|
|
|
|
mount -o remount,ro none / 2>&- |
|
|
|
|
|
|
|
|
|
# copy ramoverlay to jffs2 |
|
|
|
|
echo -n "copying files ... " |
|
|
|
|
cp -a /tmp/root/* /rom/jffs 2>&- |
|
|
|
|
echo "done" |
|
|
|
|
|
|
|
|
|
# switch back to squashfs (temporarily) |
|
|
|
|
# and park the ramdisk ontop of /tmp/root |
|
|
|
|
pivot /rom /mnt |
|
|
|
|
mount -o move /mnt /tmp/root |
|
|
|
|
|
|
|
|
|
# /jffs is the overlay |
|
|
|
|
# /rom is the readonly |
|
|
|
|
fopivot /jffs /rom |
|
|
|
|
|
|
|
|
|
# try to get rid of /tmp/root |
|
|
|
|
# this will almost always fail |
|
|
|
|
umount /tmp/root 2>&- |
|
|
|
|
else |
|
|
|
|
# switch back to squashfs temporarily |
|
|
|
|
pivot /rom /mnt |
|
|
|
|
|
|
|
|
|
# get rid of the old overlay |
|
|
|
|
umount -l /mnt |
|
|
|
|
|
|
|
|
|
# another umount to get rid of the bind from /tmp/root |
|
|
|
|
umount -l /mnt |
|
|
|
|
|
|
|
|
|
# initialize jffs2 |
|
|
|
|
mount "$mtdpart" /jffs -t jffs2 || exit |
|
|
|
|
|
|
|
|
|
# workaround to ensure that union can attach properly |
|
|
|
|
sync |
|
|
|
|
ls /jffs >/dev/null |
|
|
|
|
|
|
|
|
|
# switch to the new (empty) jffs2 |
|
|
|
|
fopivot /jffs /rom 1 |
|
|
|
|
|
|
|
|
|
# copy ramoverlay to jffs2, must be done after switching |
|
|
|
|
# to the new rootfs to avoid creating opaque directories |
|
|
|
|
echo -n "copying files ... " |
|
|
|
|
cp -a /tmp/root/* / >/dev/null 2>&1 |
|
|
|
|
sync |
|
|
|
|
echo "done" |
|
|
|
|
|
|
|
|
|
umount -l /jffs |
|
|
|
|
umount -l /tmp/root |
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
exit 0 |
|
|
|
|
} |
|
|
|
|