#!/bin/sh # Get the value of the root env variable found in /proc/cmdline get_root() { local root="$(cat /proc/cmdline)" root="${root##* root=PARTLABEL=}" root="${root%% *}" [ "${root}" != "" ] && echo "${root}" } fslist="proc sys dev run" rodir=/mnt/rofs cd / mkdir -p $fslist mount dev dev -tdevtmpfs mount sys sys -tsysfs mount proc proc -tproc mount tmpfs run -t tmpfs -o mode=755,nodev # Move the secondary GPT to the end of the device if needed. Look for the GPT # header signature "EFI PART" located 512 bytes from the end of the device. magic=$(tail -c 512 /dev/mmcblk0 | hexdump -C -n 8 | grep "EFI PART") if test -z "${magic}"; then sgdisk -e /dev/mmcblk0 partprobe fi # There eMMC GPT labels for the rootfs are rofs-a and rofs-b, and the label for # the read-write partition is rwfs. Run udev to make the partition labels show # up. Mounting by label allows for partition numbers to change if needed. udevd --daemon udevadm trigger --type=devices --action=add udevadm settle --timeout=10 mkdir -p $rodir if ! mount /dev/disk/by-partlabel/"$(get_root)" $rodir -t ext4 -o ro; then /bin/sh fi if ! mount /dev/disk/by-partlabel/rwfs $rodir/var -t ext4 -o rw; then /bin/sh fi rm -rf $rodir/var/persist/etc-work/ mkdir -p $rodir/var/persist/etc $rodir/var/persist/etc-work $rodir/var/persist/home/root mount overlay $rodir/etc -t overlay -o lowerdir=$rodir/etc,upperdir=$rodir/var/persist/etc,workdir=$rodir/var/persist/etc-work for f in $fslist; do mount --move $f $rodir/$f done exec chroot $rodir /sbin/init