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
ramoverlay() {
mkdir -p /tmp/root
+ mount -t tmpfs root /tmp/root
fopivot /tmp/root /rom 1
}
}
[ "$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
}