| #!/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 |