diff options
author | nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2009-09-27 22:56:21 +0000 |
---|---|---|
committer | nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2009-09-27 22:56:21 +0000 |
commit | 9f19c5e029bb385cb7dca43c8f94d70231994275 (patch) | |
tree | 500409a74a3c348baff6ce98bf31bf2707cfaeee /package | |
parent | 2346d031cbadae78448eedc4e53f57dbdcf21b7a (diff) |
firstboot: add support for union mounts
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@17778 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'package')
-rwxr-xr-x | package/base-files/files/sbin/firstboot | 83 |
1 files changed, 60 insertions, 23 deletions
diff --git a/package/base-files/files/sbin/firstboot b/package/base-files/files/sbin/firstboot index 8453b30096..d5a0981f43 100755 --- a/package/base-files/files/sbin/firstboot +++ b/package/base-files/files/sbin/firstboot @@ -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 } |