uzbek-plus/b12/persist/alpine-provision.sh

34 lines
3.2 KiB
Bash

#!/bin/sh
# B12P-1 (board, ONE-TIME, DESTRUCTIVE to userdata only): format eMMC userdata as ext4 'aurora-alpine' and install the Alpine rootfs.
# alpine-provision.sh /tmp/b12/alpine-b13.tar.gz YES-FORMAT-USERDATA
# Gates: PARTNAME=userdata, expected start/size (S2 GPT), only this partition is switched RW and back to RO at the end.
TAR=$1; [ "$2" = YES-FORMAT-USERDATA ] || { echo "usage: $0 TAR YES-FORMAT-USERDATA"; exit 2; }
E=/tmp/aurora-e2fs; M=/mnt/aurora-alpine; LABEL=aurora-alpine
e2() { _b=$1; shift; $E/lib/ld-musl-aarch64.so.1 --library-path $E/lib $E/sbin/$_b "$@"; }
log() { echo "[$(cut -d' ' -f1 /proc/uptime)] P1 $*"; }
relock() { [ -n "$D" ] && blockdev --setro $D; blockdev --setro /dev/mmcblk0; }
fail() { log "FAIL: $*"; grep -q " $M " /proc/mounts && umount $M; relock; echo "PROVISION FAIL"; exit 1; }
others_ro() { for x in /dev/mmcblk0p*; do [ $x = $D ] && continue; [ "$(blockdev --getro $x)" = 1 ] || return 1; done; for x in /dev/mmcblk0boot*; do [ "$(blockdev --getro $x)" = 1 ] || return 1; done; }
D=; for p in /sys/class/block/mmcblk0p*; do [ "$(sed -n 's/^PARTNAME=//p' $p/uevent)" = userdata ] && D=/dev/$(basename $p); done
[ "$D" = /dev/mmcblk0p27 ] || fail "userdata is '$D', expected /dev/mmcblk0p27"
P=/sys/class/block/mmcblk0p27; [ "$(cat $P/start)" = 2428000 ] && [ "$(cat $P/size)" = 5206911 ] || fail "p27 geometry $(cat $P/start)/$(cat $P/size) unexpected"
grep -q "^/dev/mmcblk0" /proc/mounts && grep "^/dev/mmcblk0" /proc/mounts | grep -qv "^/dev/mmcblk0p1 " && fail "unexpected eMMC mount: $(grep ^/dev/mmcblk0 /proc/mounts)"
[ -f "$TAR" ] && [ -x $E/sbin/mke2fs ] || fail "missing $TAR or $E"
log "pre: stat=$(cat /sys/block/mmcblk0/stat | awk '{print "w="$5" ws="$7}') ro: disk=$(blockdev --getro /dev/mmcblk0) p27=$(blockdev --getro $D) p25=$(blockdev --getro /dev/mmcblk0p25)"
# disk-level RO masks partition RW: lift it on the disk, every other partition keeps its own RO flag (checked), RW only on p27
others_ro || fail "some other partition is not RO before start"
blockdev --setrw /dev/mmcblk0 && blockdev --setrw $D || fail "setrw"
[ "$(blockdev --getro $D)" = 0 ] || fail "p27 still RO"
others_ro || fail "other devices lost RO"
log "rw only on $D (disk flag lifted, p1..p26 + boot0/1 RO verified)"
e2 mke2fs -F -q -t ext4 -L $LABEL -m 1 -E nodiscard -O ^metadata_csum_seed $D || fail "mke2fs"
log "mke2fs ok"
mkdir -p $M; mount -t ext4 -o noatime $D $M || fail "mount"
tar xzf "$TAR" -C $M || fail "extract"
date -u +"provisioned %Y-%m-%dT%H:%M:%SZ from $(basename $TAR) $(sha256sum $TAR | cut -c1-8)" > $M/etc/aurora-alpine-release
sync; log "extracted: $(du -sk $M | cut -f1)k files=$(find $M -xdev | wc -l)"
umount $M || fail "umount"
e2 e2fsck -fn $D > /tmp/b12/p1-fsck.txt 2>&1; rc=$?; log "e2fsck -fn rc=$rc $(tail -1 /tmp/b12/p1-fsck.txt)"
relock; others_ro || log "WARN others_ro"; log "post: disk ro=$(blockdev --getro /dev/mmcblk0) p27 ro=$(blockdev --getro $D) stat=$(cat /sys/block/mmcblk0/stat | awk '{print "w="$5" ws="$7}')"
mount -t ext4 -o ro $D $M && { log "ro-mount ok: $(cat $M/etc/alpine-release) $(cat $M/etc/aurora-alpine-release)"; ls $M/usr/libexec/Xorg >/dev/null && log "Xorg present"; umount $M; }
[ $rc = 0 ] && echo "PROVISION OK" || echo "PROVISION FAIL fsck"