flash: Clean up/add support for RPi 3

Although the official Fedora CoreOS documentation only provides
instructions for running CoreOS on a Raspberry Pi 4, it does actually
work on older boards as well.  `coreos-installer` creates a GPT disk
label, which the older devices do not support, but this can be worked
around using a hybrid MBR label.

Unfortunately, after I put all the effort into refactoring this script
and adding support for the older devices, I realized that it was rather
pointless as those boards simply do not have enough memory to be useful
Kubernetes nodes.  I was hoping to move the Zigbee and ZWave controllers
to a Raspberry Pi 3, but these processes take way too much memory for
that.
Dustin 2023-10-04 09:58:26 -05:00
parent 364f4fed50
commit 40bde4df26
3 changed files with 140 additions and 35 deletions

1
.gitignore vendored
View File

@ -1,3 +1,4 @@
*.ign
frigate.env
*.token
RPi4boot

View File

@ -1,35 +0,0 @@
#!/bin/sh
# vim: set sw=4 ts=4 sts=4 et :
set -eu
ignition=${1}
dev=${2:-/dev/disk/by-id/usb-Generic_STORAGE_DEVICE_000000001206-0:0}
if [ -z "${ignition}" ]; then
printf 'usage: %s ignition\n' "${0##*/}" >&2
exit 2
fi
if [ $(id -u) -ne 0 ]; then
sudo=sudo
fi
${sudo} coreos-installer install \
-a aarch64 \
-s stable \
-i "${ignition}" \
--console ttyS0,115200n8 \
"${dev}"
sync; sync; sync
until [ -n "${efi_part}" ]; do
efi_part=$(
lsblk -o LABEL,PATH \
| awk '$1=="EFI-SYSTEM"{print $2}'
)
done
pmount "${efi_part}" coreos-efi
rsync -ah --ignore-existing RPi4boot/boot/efi/ /media/coreos-efi/
sync; sync; sync
pumount coreos-efi

139
flash.zsh Executable file
View File

@ -0,0 +1,139 @@
#!/bin/zsh
# vim: set ft=sh sw=4 ts=4 sts=4 et :
set -eu
function copy_firmware() {
local dev="$1"
local efi_part
local mountpoint=/run/media/coreos-efi
if [ ! -d RPi4boot ]; then
download_firmware
fi
printf 'Waiting for device to settle ...' >&2
until [ -n "${efi_part-}" ]; do
printf '.'
efi_part=$(
lsblk -o LABEL,PATH "${dev}" \
| awk '$1=="EFI-SYSTEM"{print $2}'
)
sleep 0.25
done
printf '\n'
mkdir -p "${mountpoint}"
mount "${efi_part}" "${mountpoint}"
rsync -rtiOh --ignore-existing RPi4boot/boot/efi/ "${mountpoint}"
sync; sync; sync
umount "${mountpoint}"
rmdir "${mountpoint}"
}
function download_firmware() {
local rpm
echo 'Downloading Raspberry Pi Firmware blobs ...'
mkdir RPi4boot
podman run --rm -it \
-v $(PWD)/RPi4boot:/RPi4boot:rw,z \
registry.fedoraproject.org/fedora:38 \
dnf install -y \
--downloadonly \
--forcearch=aarch64 \
--destdir=/RPi4boot \
uboot-images-armv8 \
bcm283x-firmware \
bcm283x-overlays
--
for rpm in RPi4boot/*.rpm; do
rpm2cpio "${rpm}" | cpio -idv -D RPi4boot/
done
cp RPi4boot/usr/share/uboot/rpi_3/u-boot.bin RPi4boot/boot/efi/rpi3-u-boot.bin
cp RPi4boot/usr/share/uboot/rpi_4/u-boot.bin RPi4boot/boot/efi/rpi4-u-boot.bin
cp RPi4boot/usr/share/uboot/rpi_arm64/u-boot.bin RPi4boot/boot/efi/rpi-u-boot.bin
}
function hybridize_gpt() {
local dev="$1"
echo 'Creating Hybrid MBR partition table ...'
sgdisk -h 2:EE "${dev}"
echo type=0c,bootable | sfdisk -Y mbr -N 1 "${dev}"
}
function install_coreos() {
local ignition="$1"
local dev="$2"
coreos-installer install \
-a aarch64 \
-s stable \
-i "${ignition}" \
--console ttyS0,115200n8 \
"${dev}"
sync; sync; sync
}
function parse_args() {
pi=4
while [ $# -gt 0 ]; do
case "$1" in
--pi)
shift
pi=${1}
;;
--pi=*)
pi=${1#--pi=}
;;
*)
if [ -z "${ignition-}" ]; then
ignition="${1}"
elif [ -z "${dev-}" ]; then
dev="${1}"
else
usage >&2
exit 2
fi
;;
esac
shift
done
if [ -z "${ignition-}" ]; then
usage >&2
exit 2
fi
if [ -z "${dev-}" ]; then
dev=/dev/disk/by-id/usb-Generic_STORAGE_DEVICE_000000001206-0:0
fi
}
function usage() {
printf 'usage: %s [--pi PI] ignition [device]\n' "${0##*/}"
}
parse_args "$@"
case "${pi}" in
0*|1)
printf 'Raspberry Pi model %s is not supported\n' "${pi}" >&2
exit 1
;;
esac
if [ $(id -u) -ne 0 ]; then
exec sudo "$0" "$@"
fi
install_coreos "${ignition}" "${dev}"
case "${pi}" in
2|3)
hybridize_gpt "${dev}"
;;
esac
copy_firmware "${dev}"