blob: ec4b745dbf3d6f14327f343851add810a021a00b [file] [log] [blame]
Adriana Kobylak86164b22020-06-03 16:22:42 -05001#!/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# Move the secondary GPT to the end of the device if needed. Look for the GPT
21# header signature "EFI PART" located 512 bytes from the end of the device.
22magic=$(tail -c 512 /dev/mmcblk0 | hexdump -C -n 8 | grep "EFI PART")
23if test -z "${magic}"; then
24 sgdisk -e /dev/mmcblk0
25 partprobe
26fi
27
28# There eMMC GPT labels for the rootfs are rofs-a and rofs-b, and the label for
29# the read-write partition is rwfs. Run udev to make the partition labels show
30# up. Mounting by label allows for partition numbers to change if needed.
31udevd --daemon
32udevadm trigger --type=devices --action=add
33udevadm settle --timeout=10
34
35mkdir -p $rodir
36if ! mount /dev/disk/by-partlabel/"$(get_root)" $rodir -t ext4 -o ro; then
37 /bin/sh
38fi
39if ! mount /dev/disk/by-partlabel/rwfs $rodir/var -t ext4 -o rw; then
40 /bin/sh
41fi
42
43rm -rf $rodir/var/persist/etc-work/
44mkdir -p $rodir/var/persist/etc $rodir/var/persist/etc-work $rodir/var/persist/home/root
45mount overlay $rodir/etc -t overlay -o lowerdir=$rodir/etc,upperdir=$rodir/var/persist/etc,workdir=$rodir/var/persist/etc-work
46
47for f in $fslist; do
48 mount --move $f $rodir/$f
49done
50
51exec chroot $rodir /sbin/init