Adriana Kobylak | 0998d1e | 2020-06-03 16:22:42 -0500 | [diff] [blame] | 1 | #!/bin/sh |
| 2 | |
Andrew Jeffery | e9284a5 | 2023-06-01 16:32:24 +0930 | [diff] [blame] | 3 | kgetopt () |
| 4 | { |
Patrick Williams | 2345ace | 2023-04-14 14:03:05 -0500 | [diff] [blame] | 5 | _cmdline="$(cat /proc/cmdline)" |
Andrew Jeffery | e9284a5 | 2023-06-01 16:32:24 +0930 | [diff] [blame] | 6 | _optname="$1" |
| 7 | _optval="$2" |
| 8 | for _opt in $_cmdline |
Andrew Jeffery | a2e2aea | 2023-01-25 12:35:00 +1030 | [diff] [blame] | 9 | do |
Andrew Jeffery | e9284a5 | 2023-06-01 16:32:24 +0930 | [diff] [blame] | 10 | case "$_opt" in |
| 11 | "${_optname}"=*) |
| 12 | _optval="${_opt##"${_optname}"=}" |
Andrew Jeffery | a2e2aea | 2023-01-25 12:35:00 +1030 | [diff] [blame] | 13 | ;; |
| 14 | *) |
| 15 | ;; |
| 16 | esac |
| 17 | done |
Andrew Jeffery | e9284a5 | 2023-06-01 16:32:24 +0930 | [diff] [blame] | 18 | [ -n "$_optval" ] && echo "$_optval" |
Adriana Kobylak | 0998d1e | 2020-06-03 16:22:42 -0500 | [diff] [blame] | 19 | } |
| 20 | |
| 21 | fslist="proc sys dev run" |
| 22 | rodir=/mnt/rofs |
Isaac Kurth | 5003195 | 2021-09-07 22:04:14 +0000 | [diff] [blame] | 23 | mmcdev="/dev/mmcblk0" |
| 24 | rwfsdev="/dev/disk/by-partlabel/rwfs" |
| 25 | |
Adriana Kobylak | 0998d1e | 2020-06-03 16:22:42 -0500 | [diff] [blame] | 26 | cd / |
Andrew Jeffery | 2ea84eb | 2023-04-26 11:42:02 +0930 | [diff] [blame] | 27 | |
| 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 |
| 32 | mkdir -p $fslist |
| 33 | |
Adriana Kobylak | 0998d1e | 2020-06-03 16:22:42 -0500 | [diff] [blame] | 34 | mount dev dev -tdevtmpfs |
| 35 | mount sys sys -tsysfs |
| 36 | mount proc proc -tproc |
| 37 | mount tmpfs run -t tmpfs -o mode=755,nodev |
| 38 | |
Adriana Kobylak | 331a369 | 2020-08-17 12:40:23 -0500 | [diff] [blame] | 39 | # 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 Kobylak | 331a369 | 2020-08-17 12:40:23 -0500 | [diff] [blame] | 41 | count=0 |
| 42 | while [ $count -lt 5 ]; do |
| 43 | if [ -e "${mmcdev}" ]; then |
| 44 | break |
| 45 | fi |
| 46 | sleep 1 |
| 47 | count=$((count + 1)) |
| 48 | done |
| 49 | |
Adriana Kobylak | 0998d1e | 2020-06-03 16:22:42 -0500 | [diff] [blame] | 50 | # 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 Jeffery | 9e08ff4 | 2021-04-01 22:28:43 +1030 | [diff] [blame] | 52 | if ! tail -c 512 "${mmcdev}" | hexdump -C -n 8 | grep -q "EFI PART"; then |
Adriana Kobylak | 331a369 | 2020-08-17 12:40:23 -0500 | [diff] [blame] | 53 | sgdisk -e "${mmcdev}" |
Adriana Kobylak | 0998d1e | 2020-06-03 16:22:42 -0500 | [diff] [blame] | 54 | partprobe |
| 55 | fi |
| 56 | |
| 57 | # There eMMC GPT labels for the rootfs are rofs-a and rofs-b, and the label for |
Patrick Williams | 2345ace | 2023-04-14 14:03:05 -0500 | [diff] [blame] | 58 | # the read-write partition is rwfs. Run udev to make the partition labels show |
Adriana Kobylak | 0998d1e | 2020-06-03 16:22:42 -0500 | [diff] [blame] | 59 | # up. Mounting by label allows for partition numbers to change if needed. |
| 60 | udevd --daemon |
| 61 | udevadm trigger --type=devices --action=add |
| 62 | udevadm settle --timeout=10 |
Andrew Geissler | e143c93 | 2024-02-14 11:32:53 -0600 | [diff] [blame^] | 63 | # 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 |
| 66 | udevadm control --exit |
Adriana Kobylak | 0998d1e | 2020-06-03 16:22:42 -0500 | [diff] [blame] | 67 | |
| 68 | mkdir -p $rodir |
Andrew Jeffery | e9284a5 | 2023-06-01 16:32:24 +0930 | [diff] [blame] | 69 | if ! mount /dev/disk/by-partlabel/"$(kgetopt root=PARTLABEL)" $rodir -t ext4 -o ro; then |
Adriana Kobylak | 0998d1e | 2020-06-03 16:22:42 -0500 | [diff] [blame] | 70 | /bin/sh |
| 71 | fi |
Adriana Kobylak | 1f6ac83 | 2020-08-24 15:20:04 -0500 | [diff] [blame] | 72 | |
Isaac Kurth | 5003195 | 2021-09-07 22:04:14 +0000 | [diff] [blame] | 73 | # Determine if a factory reset has been requested |
Isaac Kurth | 315698e | 2021-06-25 11:33:46 -0500 | [diff] [blame] | 74 | mkdir -p /var/lock |
Isaac Kurth | 5003195 | 2021-09-07 22:04:14 +0000 | [diff] [blame] | 75 | resetval=$(fw_printenv -n rwreset 2>/dev/null) |
Patrick Williams | 2345ace | 2023-04-14 14:03:05 -0500 | [diff] [blame] | 76 | if gpiopresent=$(gpiofind factory-reset-toggle) ; then |
Zev Weiss | f307a2f | 2023-04-18 15:56:22 -0700 | [diff] [blame] | 77 | # 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 Kurth | 5003195 | 2021-09-07 22:04:14 +0000 | [diff] [blame] | 81 | else |
| 82 | gpioval="" |
| 83 | fi |
| 84 | # Prevent unnecessary resets on first boot |
Patrick Williams | 2345ace | 2023-04-14 14:03:05 -0500 | [diff] [blame] | 85 | if [ -n "$gpioval" ] && [ -z "$resetval" ]; then |
| 86 | fw_setenv rwreset "$gpioval" |
Isaac Kurth | 5003195 | 2021-09-07 22:04:14 +0000 | [diff] [blame] | 87 | resetval=$gpioval |
| 88 | fi |
Patrick Williams | 2345ace | 2023-04-14 14:03:05 -0500 | [diff] [blame] | 89 | if [ "$resetval" = "true" ] || [ -n "$gpioval" ] && [ "$resetval" != "$gpioval" ]; then |
Isaac Kurth | 315698e | 2021-06-25 11:33:46 -0500 | [diff] [blame] | 90 | echo "Factory reset requested." |
| 91 | if ! mkfs.ext4 -F "${rwfsdev}"; then |
| 92 | echo "Reformat for factory reset failed." |
| 93 | /bin/sh |
| 94 | else |
Isaac Kurth | 5003195 | 2021-09-07 22:04:14 +0000 | [diff] [blame] | 95 | # gpioval will be an empty string if factory-reset-toggle was not found |
Patrick Williams | 2345ace | 2023-04-14 14:03:05 -0500 | [diff] [blame] | 96 | fw_setenv rwreset "$gpioval" |
Isaac Kurth | 5003195 | 2021-09-07 22:04:14 +0000 | [diff] [blame] | 97 | echo "rwfs has been formatted." |
Isaac Kurth | 315698e | 2021-06-25 11:33:46 -0500 | [diff] [blame] | 98 | fi |
| 99 | fi |
| 100 | |
Adriana Kobylak | 1f6ac83 | 2020-08-24 15:20:04 -0500 | [diff] [blame] | 101 | fsck.ext4 -p "${rwfsdev}" |
| 102 | if ! mount "${rwfsdev}" $rodir/var -t ext4 -o rw; then |
Adriana Kobylak | 0998d1e | 2020-06-03 16:22:42 -0500 | [diff] [blame] | 103 | /bin/sh |
| 104 | fi |
| 105 | |
| 106 | rm -rf $rodir/var/persist/etc-work/ |
| 107 | mkdir -p $rodir/var/persist/etc $rodir/var/persist/etc-work $rodir/var/persist/home/root |
| 108 | mount overlay $rodir/etc -t overlay -o lowerdir=$rodir/etc,upperdir=$rodir/var/persist/etc,workdir=$rodir/var/persist/etc-work |
| 109 | |
Andrew Jeffery | e9284a5 | 2023-06-01 16:32:24 +0930 | [diff] [blame] | 110 | init="$(kgetopt init /sbin/init)" |
| 111 | |
Adriana Kobylak | 0998d1e | 2020-06-03 16:22:42 -0500 | [diff] [blame] | 112 | for f in $fslist; do |
Patrick Williams | 2345ace | 2023-04-14 14:03:05 -0500 | [diff] [blame] | 113 | mount --move "$f" "$rodir/$f" |
Adriana Kobylak | 0998d1e | 2020-06-03 16:22:42 -0500 | [diff] [blame] | 114 | done |
| 115 | |
Andrew Jeffery | e9284a5 | 2023-06-01 16:32:24 +0930 | [diff] [blame] | 116 | exec switch_root $rodir "$init" |