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