Browse Source

firstboot: add support for union mounts

SVN-Revision: 17778
Felix Fietkau 16 years ago
parent
commit
2da13936e9
1 changed files with 60 additions and 23 deletions
  1. 60 23
      package/base-files/files/sbin/firstboot

+ 60 - 23
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
 	}