piCore64's blkid/findfs binaries (separate util-linux dynamics, NOT busybox
symlinks) crash in QEMU virt with the same instruction-abort issue as the
broken BusyBox. The host's static busybox doesn't include blkid/findfs
applets either, so stage 20-persistent-mount.sh segfaults in a loop trying
to resolve LABEL=KSOLODATA.
Short-term: hardcode /dev/vda4 (the virtio data partition under QEMU) so
the boot can progress past stage 20 and we can see what else needs fixing.
Pre-v0.3 release we need to either:
a) ship a real blkid/findfs binary that works (util-linux from upstream,
statically built), or
b) avoid LABEL= entirely and detect the data partition by walking
/sys/class/block looking for our ext4 magic+label.
Either way the LABEL= path needs to work on real ARM64 hosts where the
device path varies (vda/sda/nvme0n1).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
94 lines
3.1 KiB
INI
94 lines
3.1 KiB
INI
# KubeSolo OS — GRUB Configuration (ARM64)
|
|
# A/B partition boot with automatic rollback.
|
|
#
|
|
# Same A/B logic as build/grub/grub.cfg; only the console parameters differ
|
|
# (ARM64 PL011 / 16550-compat UART rather than x86 ttyS0).
|
|
#
|
|
# Partition layout:
|
|
# (hd0,gpt1) — EFI/Boot (256 MB, FAT32) — contains GRUB + grubenv
|
|
# (hd0,gpt2) — System A (512 MB, ext4) — vmlinuz + kubesolo-os.gz
|
|
# (hd0,gpt3) — System B (512 MB, ext4) — vmlinuz + kubesolo-os.gz
|
|
# (hd0,gpt4) — Data (remaining, ext4) — persistent K8s state
|
|
|
|
set default=0
|
|
set timeout=3
|
|
|
|
load_env
|
|
|
|
# --- A/B Rollback Logic (identical to amd64 grub.cfg) ---
|
|
|
|
if [ "${boot_success}" != "1" ]; then
|
|
if [ "${boot_counter}" = "0" ]; then
|
|
if [ "${active_slot}" = "A" ]; then
|
|
set active_slot=B
|
|
else
|
|
set active_slot=A
|
|
fi
|
|
save_env active_slot
|
|
set boot_counter=3
|
|
save_env boot_counter
|
|
else
|
|
if [ "${boot_counter}" = "3" ]; then
|
|
set boot_counter=2
|
|
elif [ "${boot_counter}" = "2" ]; then
|
|
set boot_counter=1
|
|
elif [ "${boot_counter}" = "1" ]; then
|
|
set boot_counter=0
|
|
fi
|
|
save_env boot_counter
|
|
fi
|
|
fi
|
|
|
|
set boot_success=0
|
|
save_env boot_success
|
|
|
|
if [ "${active_slot}" = "A" ]; then
|
|
set root='(hd0,gpt2)'
|
|
set slot_label="System A"
|
|
else
|
|
set root='(hd0,gpt3)'
|
|
set slot_label="System B"
|
|
fi
|
|
|
|
# --- ARM64 console string ---
|
|
# Order matters: the LAST `console=` is the primary system console (where /dev/console
|
|
# points and where init's stdout/stderr land). Earlier `console=` entries get mirrored
|
|
# kernel output but don't carry process I/O.
|
|
#
|
|
# Covers Graviton/16550 (ttyS0) as secondary and QEMU virt / PL011 / Ampere (ttyAMA0)
|
|
# as primary. ttyAMA0 must be last for `-nographic` QEMU + most ARM64 SBCs.
|
|
#
|
|
# `quiet` is intentionally omitted from the default entry while we stabilise the
|
|
# generic ARM64 boot path. Add back once boots are reliable.
|
|
|
|
menuentry "KubeSolo OS (${slot_label})" {
|
|
echo "Booting KubeSolo OS from ${slot_label}..."
|
|
echo "Boot counter: ${boot_counter}, Boot success: ${boot_success}"
|
|
linux /vmlinuz init=/sbin/init kubesolo.data=/dev/vda4 console=ttyS0,115200 console=ttyAMA0,115200
|
|
initrd /kubesolo-os.gz
|
|
}
|
|
|
|
menuentry "KubeSolo OS (${slot_label}) — Debug Mode" {
|
|
echo "Booting KubeSolo OS (debug) from ${slot_label}..."
|
|
linux /vmlinuz kubesolo.data=/dev/vda4 kubesolo.debug console=ttyS0,115200 console=ttyAMA0,115200
|
|
initrd /kubesolo-os.gz
|
|
}
|
|
|
|
menuentry "KubeSolo OS — Emergency Shell" {
|
|
echo "Booting to emergency shell..."
|
|
linux /vmlinuz init=/sbin/init kubesolo.shell console=ttyS0,115200 console=ttyAMA0,115200
|
|
initrd /kubesolo-os.gz
|
|
}
|
|
|
|
menuentry "KubeSolo OS — Boot Other Slot" {
|
|
if [ "${active_slot}" = "A" ]; then
|
|
set root='(hd0,gpt3)'
|
|
echo "Booting from System B (passive)..."
|
|
else
|
|
set root='(hd0,gpt2)'
|
|
echo "Booting from System A (passive)..."
|
|
fi
|
|
linux /vmlinuz kubesolo.data=/dev/vda4 kubesolo.debug console=ttyS0,115200 console=ttyAMA0,115200
|
|
initrd /kubesolo-os.gz
|
|
}
|