# 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 kubesolo.data=LABEL=KSOLODATA 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=LABEL=KSOLODATA kubesolo.debug console=ttyS0,115200 console=ttyAMA0,115200 initrd /kubesolo-os.gz } menuentry "KubeSolo OS — Emergency Shell" { echo "Booting to emergency shell..." linux /vmlinuz 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=LABEL=KSOLODATA kubesolo.debug console=ttyS0,115200 console=ttyAMA0,115200 initrd /kubesolo-os.gz }