1*ee5dd4aeScharkear#!/bin/sh
28a445a08SJorge Cisneros
38a445a08SJorge Cisnerosfslist="proc sys dev run"
48a445a08SJorge Cisnerosrodir=run/initramfs/ro
58a445a08SJorge Cisnerosrwdir=run/initramfs/rw
68a445a08SJorge Cisnerosupper=$rwdir/cow
78a445a08SJorge Cisneroswork=$rwdir/work
88a445a08SJorge Cisneros
98a445a08SJorge Cisneroscd /
10*ee5dd4aeScharkearfor f in $fslist
11*ee5dd4aeScharkeardo
12*ee5dd4aeScharkear	mkdir -p "$f"
13*ee5dd4aeScharkeardone
148a445a08SJorge Cisnerosmount dev dev -tdevtmpfs
158a445a08SJorge Cisnerosmount sys sys -tsysfs
168a445a08SJorge Cisnerosmount proc proc -tproc
178a445a08SJorge Cisnerosif ! grep run proc/mounts
188a445a08SJorge Cisnerosthen
198a445a08SJorge Cisneros	mount tmpfs run -t tmpfs -o mode=755,nodev
208a445a08SJorge Cisnerosfi
218a445a08SJorge Cisneros
228a445a08SJorge Cisnerosmkdir -p $rodir $rwdir
238a445a08SJorge Cisneros
248a445a08SJorge Cisneroscp -rp init shutdown update whitelist bin sbin usr lib etc var run/initramfs
258a445a08SJorge Cisneros
268a445a08SJorge Cisneros# To start a interactive shell with job control at this point, run
278a445a08SJorge Cisneros# getty 38400 ttyS4
288a445a08SJorge Cisneros
298a445a08SJorge Cisnerosfindmtd() {
308a445a08SJorge Cisneros	m=$(grep -xl "$1" /sys/class/mtd/*/name)
318a445a08SJorge Cisneros	m=${m%/name}
328a445a08SJorge Cisneros	m=${m##*/}
338b86a415SPatrick Williams	echo "$m"
348a445a08SJorge Cisneros}
358a445a08SJorge Cisneros
368a445a08SJorge Cisnerosblkid_fs_type() {
378a445a08SJorge Cisneros	# Emulate util-linux's `blkid -s TYPE -o value $1`
388a445a08SJorge Cisneros	# Example busybox blkid output:
398a445a08SJorge Cisneros	#    # blkid /dev/mtdblock5
408a445a08SJorge Cisneros	#    /dev/mtdblock5: TYPE="squashfs"
418a445a08SJorge Cisneros	# Process output to extract TYPE value "squashfs".
428b86a415SPatrick Williams	blkid "$1" | sed -e 's/^.*TYPE="//' -e 's/".*$//'
438a445a08SJorge Cisneros}
448a445a08SJorge Cisneros
458a445a08SJorge Cisnerosprobe_fs_type() {
468b86a415SPatrick Williams	fst=$(blkid_fs_type "$1")
478b86a415SPatrick Williams	echo "${fst:=jffs2}"
488a445a08SJorge Cisneros}
498a445a08SJorge Cisneros
508a445a08SJorge Cisneros# This fw_get_env_var is a possibly broken version of fw_printenv that
518a445a08SJorge Cisneros# does not check the crc or flag byte.
528a445a08SJorge Cisneros# The u-boot environment starts with a crc32, followed by a flag byte
538a445a08SJorge Cisneros# when a redundannt environment is configured, followed by var=value\0 sets.
548a445a08SJorge Cisneros# The flag byte for nand is a 1 byte counter; for nor it is a 1 or 0 byte.
558a445a08SJorge Cisneros
568a445a08SJorge Cisnerosget_fw_env_var() {
578a445a08SJorge Cisneros	# do we have 1 or 2 copies of the environment?
588a445a08SJorge Cisneros	# count non-blank non-comment lines
598a445a08SJorge Cisneros	# copies=$(grep -v ^# /etc/fw_env.config | grep -c [::alnum::])
608a445a08SJorge Cisneros	# ... we could if we had the fw_env.config in the initramfs
618a445a08SJorge Cisneros	copies=2
628a445a08SJorge Cisneros
638a445a08SJorge Cisneros	# * Change \n to \r and \0 to \n
648a445a08SJorge Cisneros	# * Skip to the 5th byte to skip over crc
658a445a08SJorge Cisneros	# * then skip to the first or 2nd byte to skip over flag if it exists
668a445a08SJorge Cisneros	# * stop parsing at first empty line corresponding to the
678a445a08SJorge Cisneros	#   double \0 at the end of the environment.
688a445a08SJorge Cisneros	# * print the value of the variable name passed as argument
698a445a08SJorge Cisneros
708a445a08SJorge Cisneros	envdev=$(findmtd u-boot-env)
718b86a415SPatrick Williams	if test -n "$envdev"
728a445a08SJorge Cisneros	then
738b86a415SPatrick Williams		tr '\n\000' '\r\n' < "/dev/$envdev" |
748a445a08SJorge Cisneros		tail -c +5 | tail -c +${copies-1} |
758a445a08SJorge Cisneros		sed -ne '/^$/,$d' -e "s/^$1=//p"
768a445a08SJorge Cisneros	fi
778a445a08SJorge Cisneros}
788a445a08SJorge Cisneros
798a445a08SJorge Cisnerossetup_resolv() {
808a445a08SJorge Cisneros	runresolv=/run/systemd/resolve/resolv.conf
818a445a08SJorge Cisneros	etcresolv=/etc/resolv.conf
828a445a08SJorge Cisneros
838a445a08SJorge Cisneros	if test ! -e $etcresolv -a ! -L $etcresolv
848a445a08SJorge Cisneros	then
858a445a08SJorge Cisneros		mkdir -p ${runresolv%/*}
868a445a08SJorge Cisneros		ln -s $runresolv $etcresolv
878a445a08SJorge Cisneros	fi
888a445a08SJorge Cisneros	if test ! -f $runresolv
898a445a08SJorge Cisneros	then
908a445a08SJorge Cisneros		cat  /proc/net/pnp > $runresolv
918a445a08SJorge Cisneros	fi
928a445a08SJorge Cisneros
938a445a08SJorge Cisneros	return 0
948a445a08SJorge Cisneros}
958a445a08SJorge Cisneros
968a445a08SJorge Cisnerostry_tftp() {
978a445a08SJorge Cisneros	# split into  tftp:// host:port/ path/on/remote
988a445a08SJorge Cisneros	# then spilt off / and then :port from the end of host:port/
998a445a08SJorge Cisneros	# and : from the beginning of port
1008a445a08SJorge Cisneros
1018a445a08SJorge Cisneros	rest="${1#tftp://}"
1028a445a08SJorge Cisneros	path=${rest#*/}
1038b86a415SPatrick Williams	host=${rest%"$path"}
1048a445a08SJorge Cisneros	host="${host%/}"
1058b86a415SPatrick Williams	port="${host#"${host%:*}"}"
1068b86a415SPatrick Williams	host="${host%"$port"}"
1078a445a08SJorge Cisneros	port="${port#:}"
1088a445a08SJorge Cisneros
1098a445a08SJorge Cisneros	setup_resolv
1108a445a08SJorge Cisneros
1118a445a08SJorge Cisneros	if test -z "$host" -o -z "$path"
1128a445a08SJorge Cisneros	then
1138a445a08SJorge Cisneros		debug_takeover "Invalid tftp download url '$url'."
1148a445a08SJorge Cisneros	elif echo "Downloading '$url' from $host ..."  &&
1158a445a08SJorge Cisneros		! tftp -g -r "$path" -l /run/image-rofs "$host" ${port+"$port"}
1168a445a08SJorge Cisneros	then
1178a445a08SJorge Cisneros		debug_takeover "Download of '$url' failed."
1188a445a08SJorge Cisneros	fi
1198a445a08SJorge Cisneros}
1208a445a08SJorge Cisneros
1218a445a08SJorge Cisnerostry_wget() {
1228a445a08SJorge Cisneros	setup_resolv
1238a445a08SJorge Cisneros
1248a445a08SJorge Cisneros	echo "Downloading '$1' ..."
1258a445a08SJorge Cisneros	if ! wget -O /run/image-rofs "$1"
1268a445a08SJorge Cisneros	then
1278a445a08SJorge Cisneros		debug_takeover "Download of '$url' failed."
1288a445a08SJorge Cisneros	fi
1298a445a08SJorge Cisneros}
1308a445a08SJorge Cisneros
131*ee5dd4aeScharkeargetch() {
132*ee5dd4aeScharkear        old=$(stty -g)
133*ee5dd4aeScharkear        stty raw -echo min 0 time 50
134*ee5dd4aeScharkear        printf '%s' "$(dd bs=1 count=1 2>/dev/null)"
135*ee5dd4aeScharkear        stty "$old"
136*ee5dd4aeScharkear}
137*ee5dd4aeScharkear
1388a445a08SJorge Cisnerosdebug_takeover() {
1398a445a08SJorge Cisneros	echo "$@"
140*ee5dd4aeScharkear	echo "Press (Y/y) to log in and try to manually fix, force recovery in 5 seconds"
141*ee5dd4aeScharkear	answer=$(getch)
142*ee5dd4aeScharkear	if [ "$answer" != "y" ] && [ "$answer" != "Y" ] ;
1438a445a08SJorge Cisneros	then
1448a445a08SJorge Cisneros		mkdir -p /var/lock
1458a445a08SJorge Cisneros		envdev=$(findmtd u-boot-env)
146*ee5dd4aeScharkear		echo "/dev/${envdev}     0x00000     0x10000" > /etc/fw_env.config
147*ee5dd4aeScharkear		echo "/dev/${envdev}     0x10000     0x10000" >> /etc/fw_env.config
1488a445a08SJorge Cisneros		fw_setenv force_recovery 1
1498a445a08SJorge Cisneros		fw_setenv last_booterrmsg "$@"
1508a445a08SJorge Cisneros		devmem 0xc0000000 32 0x01
1518a445a08SJorge Cisneros	fi
1528a445a08SJorge Cisneros	cat << HERE
1538a445a08SJorge CisnerosAfter fixing run exit to continue this script, or reboot -f to retry, or
1548a445a08SJorge Cisnerostouch /takeover and exit to become PID 1 allowing editing of this script.
1558a445a08SJorge CisnerosHERE
1568a445a08SJorge Cisneros
1578a445a08SJorge Cisneros	while ! sulogin && ! test -f /takeover
1588a445a08SJorge Cisneros	do
1598a445a08SJorge Cisneros		echo getty failed, retrying
1608a445a08SJorge Cisneros	done
1618a445a08SJorge Cisneros
1628a445a08SJorge Cisneros	# Touch /takeover in the above getty to become pid 1
1638a445a08SJorge Cisneros	if test -e /takeover
1648a445a08SJorge Cisneros	then
1658a445a08SJorge Cisneros		cat << HERE
1668a445a08SJorge Cisneros
1678a445a08SJorge CisnerosTakeover of init requested.  Executing /bin/sh as PID 1.
1688a445a08SJorge CisnerosWhen finished exec new init or cleanup and run reboot -f.
1698a445a08SJorge Cisneros
1708a445a08SJorge CisnerosWarning: No job control!  Shell exit will panic the system!
1718a445a08SJorge CisnerosHERE
1728a445a08SJorge Cisneros		export PS1=init#\
1738a445a08SJorge Cisneros		exec /bin/sh
1748a445a08SJorge Cisneros	fi
1758a445a08SJorge Cisneros}
1768a445a08SJorge Cisneros
1778a445a08SJorge Cisneros# Check System Maintenace Switch 7 and load factory default
1788a445a08SJorge Cisneroscheck_dip() {
1798a445a08SJorge Cisneros  devmem 0x800000b8 16 0xFF
1808a445a08SJorge Cisneros  dip=$(devmem 0x800000b8 16)
1818a445a08SJorge Cisneros
1828b86a415SPatrick Williams  value1=$((( dip & 0xFF00 ) >> 8 ))
1838b86a415SPatrick Williams  value2=$((( dip & 0x0040 ) >> 6 ))
1848a445a08SJorge Cisneros
1858a445a08SJorge Cisneros  if [ $value1 -eq 0 ] && [ $value2 -eq 1 ]
1868a445a08SJorge Cisneros  then
1878a445a08SJorge Cisneros    echo "Detect System Maintenace Switch 7 on. Will load factory default"
1888a445a08SJorge Cisneros    return 0
1898a445a08SJorge Cisneros  fi
1908a445a08SJorge Cisneros  return 1
1918a445a08SJorge Cisneros}
1928a445a08SJorge Cisneros
1938a445a08SJorge Cisnerosrofs=$(findmtd rofs)
1948a445a08SJorge Cisnerosrwfs=$(findmtd rwfs)
1958a445a08SJorge Cisneros
1968a445a08SJorge Cisnerosrodev=/dev/mtdblock${rofs#mtd}
1978a445a08SJorge Cisnerosrwdev=/dev/mtdblock${rwfs#mtd}
1988a445a08SJorge Cisneros
1998a445a08SJorge Cisneros# Set to y for yes, anything else for no.
2008a445a08SJorge Cisnerosforce_rwfst_jffs2=y
2018a445a08SJorge Cisnerosflash_images_before_init=n
2028a445a08SJorge Cisnerosconsider_download_files=y
2038a445a08SJorge Cisnerosconsider_download_tftp=y
2048a445a08SJorge Cisnerosconsider_download_http=y
2058a445a08SJorge Cisnerosconsider_download_ftp=y
2068a445a08SJorge Cisneros
2078a445a08SJorge Cisnerosrofst=squashfs
2088b86a415SPatrick Williamsrwfst=$(probe_fs_type "$rwdev")
2098a445a08SJorge Cisnerosroopts=ro
2108a445a08SJorge Cisnerosrwopts=rw
2118a445a08SJorge Cisneros
2128a445a08SJorge Cisnerosimage=/run/initramfs/image-
2138a445a08SJorge Cisnerostrigger=${image}rwfs
2148a445a08SJorge Cisneros
2158a445a08SJorge Cisnerosinit=/sbin/init
2168a445a08SJorge Cisnerosfsckbase=/sbin/fsck.
2178a445a08SJorge Cisnerosfsck=$fsckbase$rwfst
2188a445a08SJorge Cisnerosfsckopts=-a
2198a445a08SJorge Cisnerosoptfile=/run/initramfs/init-options
2208a445a08SJorge Cisnerosoptbase=/run/initramfs/init-options-base
2218a445a08SJorge Cisnerosurlfile=/run/initramfs/init-download-url
2228a445a08SJorge Cisnerosupdate=/run/initramfs/update
2238a445a08SJorge Cisneros
2248a445a08SJorge Cisnerosif test -e /${optfile##*/}
2258a445a08SJorge Cisnerosthen
2268a445a08SJorge Cisneros	cp /${optfile##*/} $optfile
2278a445a08SJorge Cisnerosfi
2288a445a08SJorge Cisneros
2298a445a08SJorge Cisnerosif test -e /${optbase##*/}
2308a445a08SJorge Cisnerosthen
2318a445a08SJorge Cisneros	cp /${optbase##*/} $optbase
2328a445a08SJorge Cisneroselse
2338a445a08SJorge Cisneros	touch $optbase
2348a445a08SJorge Cisnerosfi
2358a445a08SJorge Cisneros
2368a445a08SJorge Cisnerosif test ! -f $optfile
2378a445a08SJorge Cisnerosthen
2388a445a08SJorge Cisneros	cat /proc/cmdline $optbase > $optfile
2398a445a08SJorge Cisneros	get_fw_env_var openbmcinit >> $optfile
2408a445a08SJorge Cisneros	get_fw_env_var openbmconce >> $optfile
2418a445a08SJorge Cisnerosfi
2428a445a08SJorge Cisneros
2438b86a415SPatrick Williamsecho "rofs = $rofs $rofst   rwfs = $rwfs $rwfst"
2448a445a08SJorge Cisneros
2458a445a08SJorge Cisnerosif grep -w debug-init-sh $optfile
2468a445a08SJorge Cisnerosthen
2478a445a08SJorge Cisneros	debug_takeover "Debug initial shell requested by command line."
2488a445a08SJorge Cisnerosfi
2498a445a08SJorge Cisneros
2508b86a415SPatrick Williamsif test "$consider_download_files" = "y" &&
2518a445a08SJorge Cisneros	grep -w openbmc-init-download-files $optfile
2528a445a08SJorge Cisnerosthen
2538a445a08SJorge Cisneros	if test -f ${urlfile##*/}
2548a445a08SJorge Cisneros	then
2558a445a08SJorge Cisneros		cp ${urlfile##*/} $urlfile
2568a445a08SJorge Cisneros	fi
2578a445a08SJorge Cisneros	if test ! -f $urlfile
2588a445a08SJorge Cisneros	then
2598a445a08SJorge Cisneros		get_fw_env_var openbmcinitdownloadurl > $urlfile
2608a445a08SJorge Cisneros	fi
2618a445a08SJorge Cisneros	url="$(cat $urlfile)"
2628a445a08SJorge Cisneros	rest="${url#*://}"
2638b86a415SPatrick Williams	proto="${url%"$rest"}"
2648a445a08SJorge Cisneros
2658a445a08SJorge Cisneros	if test -z "$url"
2668a445a08SJorge Cisneros	then
2678a445a08SJorge Cisneros		echo "Download url empty.  Ignoring download request."
2688a445a08SJorge Cisneros	elif test -z "$proto"
2698a445a08SJorge Cisneros	then
2708a445a08SJorge Cisneros		echo "Download failed."
2718a445a08SJorge Cisneros	elif test "$proto" = tftp://
2728a445a08SJorge Cisneros	then
2738b86a415SPatrick Williams		if test "$consider_download_tftp" = "y"
2748a445a08SJorge Cisneros		then
2758a445a08SJorge Cisneros			try_tftp "$url"
2768a445a08SJorge Cisneros		else
2778a445a08SJorge Cisneros			echo "Download failed."
2788a445a08SJorge Cisneros		fi
2798a445a08SJorge Cisneros	elif test "$proto" = http://
2808a445a08SJorge Cisneros	then
2818b86a415SPatrick Williams		if test "$consider_download_http" = "y"
2828a445a08SJorge Cisneros		then
2838a445a08SJorge Cisneros			try_wget "$url"
2848a445a08SJorge Cisneros		else
2858a445a08SJorge Cisneros			echo "Download failed."
2868a445a08SJorge Cisneros		fi
2878a445a08SJorge Cisneros	elif test "$proto" = ftp://
2888a445a08SJorge Cisneros	then
2898b86a415SPatrick Williams		if test "$consider_download_ftp" = "y"
2908a445a08SJorge Cisneros		then
2918a445a08SJorge Cisneros			try_wget "$url"
2928a445a08SJorge Cisneros		else
2938a445a08SJorge Cisneros			echo "Download failed."
2948a445a08SJorge Cisneros		fi
2958a445a08SJorge Cisneros	else
2968a445a08SJorge Cisneros		echo "Download failed."
2978a445a08SJorge Cisneros	fi
2988a445a08SJorge Cisnerosfi
2998a445a08SJorge Cisneros
3008a445a08SJorge Cisneros# If there are images in root move them to /run/initramfs/ or /run/ now.
3018a445a08SJorge Cisnerosimagebasename=${image##*/}
3028b86a415SPatrick Williamsif test -n "${imagebasename}" && ls /"${imagebasename}"* > /dev/null 2>&1
3038a445a08SJorge Cisnerosthen
3048b86a415SPatrick Williams	if test "$flash_images_before_init" = "y"
3058a445a08SJorge Cisneros	then
3068a445a08SJorge Cisneros		echo "Flash images found, will update before starting init."
3078b86a415SPatrick Williams		mv /"${imagebasename}"* ${image%"$imagebasename"}
3088a445a08SJorge Cisneros	else
3098a445a08SJorge Cisneros		echo "Flash images found, will use but deferring flash update."
3108b86a415SPatrick Williams		mv /"${imagebasename}"* /run/
3118a445a08SJorge Cisneros	fi
3128a445a08SJorge Cisnerosfi
3138a445a08SJorge Cisneros
3148a445a08SJorge Cisnerosif grep -w clean-rwfs-filesystem $optfile
3158a445a08SJorge Cisnerosthen
3168a445a08SJorge Cisneros	echo "Cleaning of read-write overlay filesystem requested."
3178a445a08SJorge Cisneros	touch $trigger
3188a445a08SJorge Cisnerosfi
3198a445a08SJorge Cisneros
3208a445a08SJorge Cisnerosif grep -w factory-reset $optfile || check_dip
3218a445a08SJorge Cisnerosthen
3228a445a08SJorge Cisneros	echo "Factory reset requested."
3238a445a08SJorge Cisneros	touch $trigger
3248a445a08SJorge Cisneros	do_save=--no-save-files
3258a445a08SJorge Cisneroselse
3268a445a08SJorge Cisneros	do_save=--save-files
3278a445a08SJorge Cisnerosfi
3288a445a08SJorge Cisneros
3298b86a415SPatrick Williamsif test "$force_rwfst_jffs2" = "y" -a "$rwfst" != jffs2 -a ! -f $trigger
3308a445a08SJorge Cisnerosthen
3318a445a08SJorge Cisneros	echo "Converting read-write overlay filesystem to jffs2 forced."
3328a445a08SJorge Cisneros	touch $trigger
3338a445a08SJorge Cisnerosfi
3348a445a08SJorge Cisneros
3358a445a08SJorge Cisnerosif ls $image* > /dev/null 2>&1
3368a445a08SJorge Cisnerosthen
3378a445a08SJorge Cisneros	if ! test -x $update
3388a445a08SJorge Cisneros	then
3398a445a08SJorge Cisneros		debug_takeover "Flash update requested but $update missing!"
3408a445a08SJorge Cisneros	elif test -f $trigger -a ! -s $trigger
3418a445a08SJorge Cisneros	then
3428a445a08SJorge Cisneros		if [ $do_save = "--save-files" ]
3438a445a08SJorge Cisneros		then
3448a445a08SJorge Cisneros			echo "Saving selected files from read-write overlay filesystem."
3458a445a08SJorge Cisneros		else
3468a445a08SJorge Cisneros			echo "No files will be selected for save."
3478a445a08SJorge Cisneros		fi
3488a445a08SJorge Cisneros		$update --no-restore-files $do_save
3498a445a08SJorge Cisneros		echo "Clearing read-write overlay filesystem."
3508b86a415SPatrick Williams		flash_eraseall "/dev/$rwfs"
3518a445a08SJorge Cisneros		echo "Restoring saved files to read-write overlay filesystem."
3528a445a08SJorge Cisneros		touch $trigger
3538a445a08SJorge Cisneros		$update --no-save-files --clean-saved-files
3548a445a08SJorge Cisneros	else
3558a445a08SJorge Cisneros		$update --clean-saved-files $do_save
3568a445a08SJorge Cisneros	fi
3578a445a08SJorge Cisneros
3588b86a415SPatrick Williams	rwfst=$(probe_fs_type "$rwdev")
3598a445a08SJorge Cisneros	fsck=$fsckbase$rwfst
3608a445a08SJorge Cisnerosfi
3618a445a08SJorge Cisneros
3628a445a08SJorge Cisnerosif grep -w overlay-filesystem-in-ram $optfile
3638a445a08SJorge Cisnerosthen
3648a445a08SJorge Cisneros	rwfst=none
3658a445a08SJorge Cisnerosfi
3668a445a08SJorge Cisneros
3678a445a08SJorge Cisneroscopyfiles=
3688a445a08SJorge Cisnerosif grep -w copy-files-to-ram $optfile
3698a445a08SJorge Cisnerosthen
3708a445a08SJorge Cisneros	rwfst=none
3718a445a08SJorge Cisneros	copyfiles=y
3728a445a08SJorge Cisnerosfi
3738a445a08SJorge Cisneros
3748a445a08SJorge Cisneros# It would be nice to do this after fsck but that mean rofs is mounted
3758a445a08SJorge Cisneros# which triggers the mtd is mounted check
3768a445a08SJorge Cisnerosif test "$rwfst$copyfiles" = noney
3778a445a08SJorge Cisnerosthen
3788a445a08SJorge Cisneros	touch $trigger
3798a445a08SJorge Cisneros	$update --copy-files --clean-saved-files --no-restore-files
3808a445a08SJorge Cisnerosfi
3818a445a08SJorge Cisneros
3828a445a08SJorge Cisnerosif grep -w copy-base-filesystem-to-ram $optfile &&
3838b86a415SPatrick Williams	test ! -e /run/image-rofs && ! cp "$rodev" /run/image-rofs
3848a445a08SJorge Cisnerosthen
3858a445a08SJorge Cisneros	# Remove any partial copy to avoid attempted usage later
3868a445a08SJorge Cisneros	if test -e  /run/image-rofs
3878a445a08SJorge Cisneros	then
3888a445a08SJorge Cisneros		ls -l /run/image-rofs
3898a445a08SJorge Cisneros		rm -f /run/image-rofs
3908a445a08SJorge Cisneros	fi
3918a445a08SJorge Cisneros	debug_takeover "Copying $rodev to /run/image-rofs failed."
3928a445a08SJorge Cisnerosfi
3938a445a08SJorge Cisneros
3948a445a08SJorge Cisnerosif test -s /run/image-rofs
3958a445a08SJorge Cisnerosthen
3968a445a08SJorge Cisneros	rodev=/run/image-rofs
3978a445a08SJorge Cisneros	roopts=$roopts,loop
3988a445a08SJorge Cisnerosfi
3998a445a08SJorge Cisneros
4008b86a415SPatrick Williamsmount "$rodev" $rodir -t $rofst -o $roopts
4018a445a08SJorge Cisneros
4028b86a415SPatrick Williamsif test -x "$rodir$fsck"
4038a445a08SJorge Cisnerosthen
4048a445a08SJorge Cisneros	for fs in $fslist
4058a445a08SJorge Cisneros	do
4068b86a415SPatrick Williams		mount --bind "$fs" "$rodir/$fs"
4078a445a08SJorge Cisneros	done
4088b86a415SPatrick Williams	chroot $rodir "$fsck" $fsckopts "$rwdev"
4098a445a08SJorge Cisneros	rc=$?
4108a445a08SJorge Cisneros	for fs in $fslist
4118a445a08SJorge Cisneros	do
4128b86a415SPatrick Williams		umount "$rodir/$fs"
4138a445a08SJorge Cisneros	done
4148a445a08SJorge Cisneros	if test $rc -gt 1
4158a445a08SJorge Cisneros	then
4168a445a08SJorge Cisneros		debug_takeover "fsck of read-write fs on $rwdev failed (rc=$rc)"
4178a445a08SJorge Cisneros	fi
4188a445a08SJorge Cisneroselif test "$rwfst" != jffs2 -a "$rwfst" != none
4198a445a08SJorge Cisnerosthen
4208a445a08SJorge Cisneros	echo "No '$fsck' in read only fs, skipping fsck."
4218a445a08SJorge Cisnerosfi
4228a445a08SJorge Cisneros
4238a445a08SJorge Cisnerosif test "$rwfst" = none
4248a445a08SJorge Cisnerosthen
4258a445a08SJorge Cisneros	echo "Running with read-write overlay in RAM for this boot."
4268a445a08SJorge Cisneros	echo "No state will be preserved unless flash update performed."
4278b86a415SPatrick Williamselif ! mount "$rwdev" $rwdir -t "$rwfst" -o $rwopts
4288a445a08SJorge Cisnerosthen
4298a445a08SJorge Cisneros	msg="$(cat)" << HERE
4308a445a08SJorge Cisneros
4318a445a08SJorge CisnerosMounting read-write $rwdev filesystem failed.  Please fix and run
4328a445a08SJorge Cisneros	mount $rwdev $rwdir -t $rwfst -o $rwopts
4338a445a08SJorge Cisnerosto to continue, or do change nothing to run from RAM for this boot.
4348a445a08SJorge CisnerosHERE
4358a445a08SJorge Cisneros	debug_takeover "$msg"
4368a445a08SJorge Cisnerosfi
4378a445a08SJorge Cisneros
4388a445a08SJorge Cisnerosrm -rf $work
4398a445a08SJorge Cisnerosmkdir -p $upper $work
4408a445a08SJorge Cisneros
4418a445a08SJorge Cisnerosmount -t overlay -o lowerdir=$rodir,upperdir=$upper,workdir=$work cow /root
4428a445a08SJorge Cisneros
4438a445a08SJorge Cisneroswhile ! chroot /root /bin/sh -c "test -x '$init' -a -s '$init'"
4448a445a08SJorge Cisnerosdo
4458a445a08SJorge Cisneros	msg="$(cat)" << HERE
4468a445a08SJorge Cisneros
4478a445a08SJorge CisnerosUnable to confirm /sbin/init is an executable non-empty file
4488a445a08SJorge Cisnerosin merged file system mounted at /root.
4498a445a08SJorge Cisneros
4508a445a08SJorge CisnerosChange Root test failed!  Invoking emergency shell.
4518a445a08SJorge CisnerosHERE
4528a445a08SJorge Cisneros	debug_takeover "$msg"
4538a445a08SJorge Cisnerosdone
4548a445a08SJorge Cisneros
4558a445a08SJorge Cisnerosfor f in $fslist
4568a445a08SJorge Cisnerosdo
4578b86a415SPatrick Williams	mount --move "$f" "root/$f"
4588a445a08SJorge Cisnerosdone
4598a445a08SJorge Cisneros
4608a445a08SJorge Cisneros# switch_root /root $init
4618a445a08SJorge Cisnerosexec chroot /root $init
4628a445a08SJorge Cisneros
463