blob: adc841304c72e0deb3b47ee142054d15815b2769 [file] [log] [blame]
Adriana Kobylak0998d1e2020-06-03 16:22:42 -05001#!/bin/sh
2
Andrew Jefferye9284a52023-06-01 16:32:24 +09303kgetopt ()
4{
Patrick Williams2345ace2023-04-14 14:03:05 -05005 _cmdline="$(cat /proc/cmdline)"
Andrew Jefferye9284a52023-06-01 16:32:24 +09306 _optname="$1"
7 _optval="$2"
8 for _opt in $_cmdline
Andrew Jefferya2e2aea2023-01-25 12:35:00 +10309 do
Andrew Jefferye9284a52023-06-01 16:32:24 +093010 case "$_opt" in
11 "${_optname}"=*)
12 _optval="${_opt##"${_optname}"=}"
Andrew Jefferya2e2aea2023-01-25 12:35:00 +103013 ;;
14 *)
15 ;;
16 esac
17 done
Andrew Jefferye9284a52023-06-01 16:32:24 +093018 [ -n "$_optval" ] && echo "$_optval"
Adriana Kobylak0998d1e2020-06-03 16:22:42 -050019}
20
21fslist="proc sys dev run"
22rodir=/mnt/rofs
Isaac Kurth50031952021-09-07 22:04:14 +000023mmcdev="/dev/mmcblk0"
24rwfsdev="/dev/disk/by-partlabel/rwfs"
25
Adriana Kobylak0998d1e2020-06-03 16:22:42 -050026cd /
Andrew Jeffery2ea84eb2023-04-26 11:42:02 +093027
28# We want to make all the directories in $fslist, not one directory named by
29# concatonating the names with spaces
30#
31# shellcheck disable=SC2086
32mkdir -p $fslist
33
Adriana Kobylak0998d1e2020-06-03 16:22:42 -050034mount dev dev -tdevtmpfs
35mount sys sys -tsysfs
36mount proc proc -tproc
37mount tmpfs run -t tmpfs -o mode=755,nodev
38
Adriana Kobylak331a3692020-08-17 12:40:23 -050039# Wait up to 5s for the mmc device to appear. Continue even if the count is
40# exceeded. A failure will be caught later like in the mount command.
Adriana Kobylak331a3692020-08-17 12:40:23 -050041count=0
42while [ $count -lt 5 ]; do
43 if [ -e "${mmcdev}" ]; then
44 break
45 fi
46 sleep 1
47 count=$((count + 1))
48done
49
Adriana Kobylak0998d1e2020-06-03 16:22:42 -050050# Move the secondary GPT to the end of the device if needed. Look for the GPT
51# header signature "EFI PART" located 512 bytes from the end of the device.
Andrew Jeffery9e08ff42021-04-01 22:28:43 +103052if ! tail -c 512 "${mmcdev}" | hexdump -C -n 8 | grep -q "EFI PART"; then
Adriana Kobylak331a3692020-08-17 12:40:23 -050053 sgdisk -e "${mmcdev}"
Adriana Kobylak0998d1e2020-06-03 16:22:42 -050054 partprobe
55fi
56
57# There eMMC GPT labels for the rootfs are rofs-a and rofs-b, and the label for
Patrick Williams2345ace2023-04-14 14:03:05 -050058# the read-write partition is rwfs. Run udev to make the partition labels show
Adriana Kobylak0998d1e2020-06-03 16:22:42 -050059# up. Mounting by label allows for partition numbers to change if needed.
60udevd --daemon
61udevadm trigger --type=devices --action=add
62udevadm settle --timeout=10
Andrew Geisslere143c932024-02-14 11:32:53 -060063# The real udevd will be started a bit later by systemd-udevd.service
64# so kill the one we started above now that we have the needed
65# devices loaded
66udevadm control --exit
Adriana Kobylak0998d1e2020-06-03 16:22:42 -050067
68mkdir -p $rodir
Andrew Jefferye9284a52023-06-01 16:32:24 +093069if ! mount /dev/disk/by-partlabel/"$(kgetopt root=PARTLABEL)" $rodir -t ext4 -o ro; then
Adriana Kobylak0998d1e2020-06-03 16:22:42 -050070 /bin/sh
71fi
Adriana Kobylak1f6ac832020-08-24 15:20:04 -050072
Isaac Kurth50031952021-09-07 22:04:14 +000073# Determine if a factory reset has been requested
Isaac Kurth315698e2021-06-25 11:33:46 -050074mkdir -p /var/lock
Isaac Kurth50031952021-09-07 22:04:14 +000075resetval=$(fw_printenv -n rwreset 2>/dev/null)
Patrick Williams2345ace2023-04-14 14:03:05 -050076if gpiopresent=$(gpiofind factory-reset-toggle) ; then
Zev Weissf307a2f2023-04-18 15:56:22 -070077 # gpiopresent contains both the gpiochip and line number as
78 # separate words, and gpioget needs to see them as such.
79 # shellcheck disable=SC2086
80 gpioval=$(gpioget $gpiopresent)
Isaac Kurth50031952021-09-07 22:04:14 +000081else
82 gpioval=""
83fi
84# Prevent unnecessary resets on first boot
Patrick Williams2345ace2023-04-14 14:03:05 -050085if [ -n "$gpioval" ] && [ -z "$resetval" ]; then
86 fw_setenv rwreset "$gpioval"
Isaac Kurth50031952021-09-07 22:04:14 +000087 resetval=$gpioval
88fi
Patrick Williams2345ace2023-04-14 14:03:05 -050089if [ "$resetval" = "true" ] || [ -n "$gpioval" ] && [ "$resetval" != "$gpioval" ]; then
Isaac Kurth315698e2021-06-25 11:33:46 -050090 echo "Factory reset requested."
91 if ! mkfs.ext4 -F "${rwfsdev}"; then
92 echo "Reformat for factory reset failed."
93 /bin/sh
94 else
Isaac Kurth50031952021-09-07 22:04:14 +000095 # gpioval will be an empty string if factory-reset-toggle was not found
Patrick Williams2345ace2023-04-14 14:03:05 -050096 fw_setenv rwreset "$gpioval"
Isaac Kurth50031952021-09-07 22:04:14 +000097 echo "rwfs has been formatted."
Isaac Kurth315698e2021-06-25 11:33:46 -050098 fi
99fi
100
Adriana Kobylak1f6ac832020-08-24 15:20:04 -0500101fsck.ext4 -p "${rwfsdev}"
102if ! mount "${rwfsdev}" $rodir/var -t ext4 -o rw; then
Adriana Kobylak0998d1e2020-06-03 16:22:42 -0500103 /bin/sh
104fi
105
106rm -rf $rodir/var/persist/etc-work/
107mkdir -p $rodir/var/persist/etc $rodir/var/persist/etc-work $rodir/var/persist/home/root
108mount overlay $rodir/etc -t overlay -o lowerdir=$rodir/etc,upperdir=$rodir/var/persist/etc,workdir=$rodir/var/persist/etc-work
109
Andrew Jefferye9284a52023-06-01 16:32:24 +0930110init="$(kgetopt init /sbin/init)"
111
Adriana Kobylak0998d1e2020-06-03 16:22:42 -0500112for f in $fslist; do
Patrick Williams2345ace2023-04-14 14:03:05 -0500113 mount --move "$f" "$rodir/$f"
Adriana Kobylak0998d1e2020-06-03 16:22:42 -0500114done
115
Andrew Jefferye9284a52023-06-01 16:32:24 +0930116exec switch_root $rodir "$init"