1#!/bin/sh 2 3# Get the value of the root env variable found in /proc/cmdline 4get_root() { 5 local root="$(cat /proc/cmdline)" 6 root="${root##* root=PARTLABEL=}" 7 root="${root%% *}" 8 [ "${root}" != "" ] && echo "${root}" 9} 10 11fslist="proc sys dev run" 12rodir=/mnt/rofs 13cd / 14mkdir -p $fslist 15mount dev dev -tdevtmpfs 16mount sys sys -tsysfs 17mount proc proc -tproc 18mount tmpfs run -t tmpfs -o mode=755,nodev 19 20# Wait up to 5s for the mmc device to appear. Continue even if the count is 21# exceeded. A failure will be caught later like in the mount command. 22mmcdev="/dev/mmcblk0" 23count=0 24while [ $count -lt 5 ]; do 25 if [ -e "${mmcdev}" ]; then 26 break 27 fi 28 sleep 1 29 count=$((count + 1)) 30done 31 32# Move the secondary GPT to the end of the device if needed. Look for the GPT 33# header signature "EFI PART" located 512 bytes from the end of the device. 34if ! tail -c 512 "${mmcdev}" | hexdump -C -n 8 | grep -q "EFI PART"; then 35 sgdisk -e "${mmcdev}" 36 partprobe 37fi 38 39# There eMMC GPT labels for the rootfs are rofs-a and rofs-b, and the label for 40# the read-write partition is rwfs. Run udev to make the partition labels show 41# up. Mounting by label allows for partition numbers to change if needed. 42udevd --daemon 43udevadm trigger --type=devices --action=add 44udevadm settle --timeout=10 45 46mkdir -p $rodir 47if ! mount /dev/disk/by-partlabel/"$(get_root)" $rodir -t ext4 -o ro; then 48 /bin/sh 49fi 50 51rwfsdev="/dev/disk/by-partlabel/rwfs" 52fsck.ext4 -p "${rwfsdev}" 53if ! mount "${rwfsdev}" $rodir/var -t ext4 -o rw; then 54 /bin/sh 55fi 56 57rm -rf $rodir/var/persist/etc-work/ 58mkdir -p $rodir/var/persist/etc $rodir/var/persist/etc-work $rodir/var/persist/home/root 59mount overlay $rodir/etc -t overlay -o lowerdir=$rodir/etc,upperdir=$rodir/var/persist/etc,workdir=$rodir/var/persist/etc-work 60 61for f in $fslist; do 62 mount --move $f $rodir/$f 63done 64 65exec switch_root $rodir /sbin/init 66