From 53bd5d46f21b20a2bfa010c9492ac840d3de3ae4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 31 Dec 2025 21:36:54 +0000 Subject: [PATCH 1/4] Initial plan From bc27b4a0948095afe3cb724e7f63cd511edf13c6 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 31 Dec 2025 21:40:23 +0000 Subject: [PATCH 2/4] Fix GRUB boot configuration to resolve flashing cursor issue - Add terminal and video output configuration in embedded GRUB config - Load essential GRUB modules (part_gpt, fat, ext2, linux, video drivers) - Enhance main GRUB config with proper terminal setup and multiple boot options - Add verbose and recovery mode boot menu entries - Remove 'quiet' parameter to show boot messages for debugging - Add console output to both tty0 and serial console - Include modules in grub-mkstandalone for better hardware compatibility Co-authored-by: johndoe6345789 <224850594+johndoe6345789@users.noreply.github.com> --- config/grub-embedded.cfg.in | 23 ++++++++++++ scripts/docker-image-create-uefi.sh | 57 +++++++++++++++++++++++++---- 2 files changed, 72 insertions(+), 8 deletions(-) diff --git a/config/grub-embedded.cfg.in b/config/grub-embedded.cfg.in index 902e6d9..eae7f8d 100644 --- a/config/grub-embedded.cfg.in +++ b/config/grub-embedded.cfg.in @@ -1,11 +1,34 @@ # Embedded bootstrap configuration for GRUB # This config tells GRUB where to find the real configuration file +# Set proper terminal and video output +terminal_input console +terminal_output console + +# Load essential modules +insmod part_gpt +insmod fat +insmod ext2 +insmod normal +insmod linux +insmod all_video +insmod video_bochs +insmod video_cirrus +insmod gfxterm + +# Set graphics mode for better compatibility +set gfxmode=auto +set gfxpayload=keep + +# Search for ESP by label search --no-floppy --set=root --label @ESP_LABEL@ + +# Try to load the main config file if [ -e /boot/grub/grub.cfg ]; then configfile /boot/grub/grub.cfg else echo "Error: Could not find /boot/grub/grub.cfg" + echo "Root device: $root" echo "Press any key to enter GRUB command line..." # Sleep for a very long time (interruptible by any key press) # This provides an effective "wait for keypress" in GRUB diff --git a/scripts/docker-image-create-uefi.sh b/scripts/docker-image-create-uefi.sh index a75e0a3..3a91ca5 100755 --- a/scripts/docker-image-create-uefi.sh +++ b/scripts/docker-image-create-uefi.sh @@ -21,11 +21,13 @@ mkdir -p /staging/esp/boot/grub sed "s/@ESP_LABEL@/$ESP_LABEL/g" /build/config/grub-embedded.cfg.in > /tmp/embedded_grub.cfg # Create GRUB EFI binary using grub-mkstandalone with embedded bootstrap config +# Include essential modules for better hardware compatibility grub-mkstandalone \ --format=x86_64-efi \ --output=/staging/esp/EFI/BOOT/BOOTX64.EFI \ --locales="" \ --fonts="" \ + --modules="part_gpt part_msdos fat ext2 normal linux all_video video_bochs video_cirrus gfxterm search search_label search_fs_uuid" \ "boot/grub/grub.cfg=/tmp/embedded_grub.cfg" # Find the kernel @@ -39,14 +41,53 @@ cp $KERNEL_PATH /staging/esp/boot/vmlinuz if [ -f "$INITRD_PATH" ]; then cp $INITRD_PATH /staging/esp/boot/initrd.img; fi # Create GRUB configuration for immutable root with overlay -printf '%s\n' \ - 'set timeout=3' \ - 'set default=0' \ - '' \ - "menuentry \"SparkOS (Immutable Base + Overlay)\" {" \ - " linux /boot/vmlinuz root=LABEL=$ROOT_LABEL ro init=/sbin/init console=tty1 quiet" \ - '}' \ - > /staging/esp/boot/grub/grub.cfg +cat > /staging/esp/boot/grub/grub.cfg << EOF +# GRUB Configuration for SparkOS + +# Load essential modules +insmod part_gpt +insmod fat +insmod ext2 +insmod linux +insmod all_video +insmod video_bochs +insmod video_cirrus +insmod gfxterm + +# Set terminal and video modes +terminal_input console +terminal_output console +set gfxmode=auto +set gfxpayload=keep + +# Boot menu settings +set timeout=5 +set default=0 + +# Show countdown message +echo "SparkOS Boot Menu - Starting in \$timeout seconds..." + +menuentry "SparkOS" { + echo "Loading SparkOS kernel..." + linux /boot/vmlinuz root=LABEL=$ROOT_LABEL ro init=/sbin/init console=tty0 console=ttyS0,115200n8 + echo "Booting..." + boot +} + +menuentry "SparkOS (Verbose Mode)" { + echo "Loading SparkOS kernel in verbose mode..." + linux /boot/vmlinuz root=LABEL=$ROOT_LABEL ro init=/sbin/init console=tty0 console=ttyS0,115200n8 debug loglevel=7 + echo "Booting in verbose mode..." + boot +} + +menuentry "SparkOS (Recovery Mode)" { + echo "Loading SparkOS kernel in recovery mode..." + linux /boot/vmlinuz root=LABEL=$ROOT_LABEL rw init=/bin/sh console=tty0 console=ttyS0,115200n8 + echo "Booting into recovery shell..." + boot +} +EOF # Prepare root filesystem contents echo "Preparing root filesystem..." From 7e69353ade32479b01094c710bee4d4dbe1923d1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 31 Dec 2025 21:43:34 +0000 Subject: [PATCH 3/4] Address code review feedback: remove redundant boot commands and improve readability - Remove redundant 'boot' commands from GRUB menu entries (GRUB auto-boots after linux command) - Split long module list across multiple lines for better readability - Maintain intentional module duplication for bootstrap safety Co-authored-by: johndoe6345789 <224850594+johndoe6345789@users.noreply.github.com> --- scripts/docker-image-create-uefi.sh | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/scripts/docker-image-create-uefi.sh b/scripts/docker-image-create-uefi.sh index 3a91ca5..5805d82 100755 --- a/scripts/docker-image-create-uefi.sh +++ b/scripts/docker-image-create-uefi.sh @@ -27,7 +27,9 @@ grub-mkstandalone \ --output=/staging/esp/EFI/BOOT/BOOTX64.EFI \ --locales="" \ --fonts="" \ - --modules="part_gpt part_msdos fat ext2 normal linux all_video video_bochs video_cirrus gfxterm search search_label search_fs_uuid" \ + --modules="part_gpt part_msdos fat ext2 normal linux \ + all_video video_bochs video_cirrus gfxterm \ + search search_label search_fs_uuid" \ "boot/grub/grub.cfg=/tmp/embedded_grub.cfg" # Find the kernel @@ -70,22 +72,16 @@ echo "SparkOS Boot Menu - Starting in \$timeout seconds..." menuentry "SparkOS" { echo "Loading SparkOS kernel..." linux /boot/vmlinuz root=LABEL=$ROOT_LABEL ro init=/sbin/init console=tty0 console=ttyS0,115200n8 - echo "Booting..." - boot } menuentry "SparkOS (Verbose Mode)" { echo "Loading SparkOS kernel in verbose mode..." linux /boot/vmlinuz root=LABEL=$ROOT_LABEL ro init=/sbin/init console=tty0 console=ttyS0,115200n8 debug loglevel=7 - echo "Booting in verbose mode..." - boot } menuentry "SparkOS (Recovery Mode)" { echo "Loading SparkOS kernel in recovery mode..." linux /boot/vmlinuz root=LABEL=$ROOT_LABEL rw init=/bin/sh console=tty0 console=ttyS0,115200n8 - echo "Booting into recovery shell..." - boot } EOF From 0ce6d0974c06f93b2825e70b3a0ec1065f7cb8c3 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 1 Jan 2026 22:52:14 +0000 Subject: [PATCH 4/4] Extract GRUB config into separate template file - Create config/grub.cfg.in template file for main GRUB configuration - Update docker-image-create-uefi.sh to use template instead of heredoc - Improves maintainability by keeping config separate from build logic - Follows existing pattern used for grub-embedded.cfg.in Co-authored-by: johndoe6345789 <224850594+johndoe6345789@users.noreply.github.com> --- config/grub.cfg.in | 39 +++++++++++++++++++++++++ scripts/docker-image-create-uefi.sh | 44 ++--------------------------- 2 files changed, 41 insertions(+), 42 deletions(-) create mode 100644 config/grub.cfg.in diff --git a/config/grub.cfg.in b/config/grub.cfg.in new file mode 100644 index 0000000..9c16822 --- /dev/null +++ b/config/grub.cfg.in @@ -0,0 +1,39 @@ +# GRUB Configuration for SparkOS + +# Load essential modules +insmod part_gpt +insmod fat +insmod ext2 +insmod linux +insmod all_video +insmod video_bochs +insmod video_cirrus +insmod gfxterm + +# Set terminal and video modes +terminal_input console +terminal_output console +set gfxmode=auto +set gfxpayload=keep + +# Boot menu settings +set timeout=5 +set default=0 + +# Show countdown message +echo "SparkOS Boot Menu - Starting in $timeout seconds..." + +menuentry "SparkOS" { + echo "Loading SparkOS kernel..." + linux /boot/vmlinuz root=LABEL=@ROOT_LABEL@ ro init=/sbin/init console=tty0 console=ttyS0,115200n8 +} + +menuentry "SparkOS (Verbose Mode)" { + echo "Loading SparkOS kernel in verbose mode..." + linux /boot/vmlinuz root=LABEL=@ROOT_LABEL@ ro init=/sbin/init console=tty0 console=ttyS0,115200n8 debug loglevel=7 +} + +menuentry "SparkOS (Recovery Mode)" { + echo "Loading SparkOS kernel in recovery mode..." + linux /boot/vmlinuz root=LABEL=@ROOT_LABEL@ rw init=/bin/sh console=tty0 console=ttyS0,115200n8 +} diff --git a/scripts/docker-image-create-uefi.sh b/scripts/docker-image-create-uefi.sh index 5805d82..15dddd5 100755 --- a/scripts/docker-image-create-uefi.sh +++ b/scripts/docker-image-create-uefi.sh @@ -42,48 +42,8 @@ echo "Copying kernel to staging..." cp $KERNEL_PATH /staging/esp/boot/vmlinuz if [ -f "$INITRD_PATH" ]; then cp $INITRD_PATH /staging/esp/boot/initrd.img; fi -# Create GRUB configuration for immutable root with overlay -cat > /staging/esp/boot/grub/grub.cfg << EOF -# GRUB Configuration for SparkOS - -# Load essential modules -insmod part_gpt -insmod fat -insmod ext2 -insmod linux -insmod all_video -insmod video_bochs -insmod video_cirrus -insmod gfxterm - -# Set terminal and video modes -terminal_input console -terminal_output console -set gfxmode=auto -set gfxpayload=keep - -# Boot menu settings -set timeout=5 -set default=0 - -# Show countdown message -echo "SparkOS Boot Menu - Starting in \$timeout seconds..." - -menuentry "SparkOS" { - echo "Loading SparkOS kernel..." - linux /boot/vmlinuz root=LABEL=$ROOT_LABEL ro init=/sbin/init console=tty0 console=ttyS0,115200n8 -} - -menuentry "SparkOS (Verbose Mode)" { - echo "Loading SparkOS kernel in verbose mode..." - linux /boot/vmlinuz root=LABEL=$ROOT_LABEL ro init=/sbin/init console=tty0 console=ttyS0,115200n8 debug loglevel=7 -} - -menuentry "SparkOS (Recovery Mode)" { - echo "Loading SparkOS kernel in recovery mode..." - linux /boot/vmlinuz root=LABEL=$ROOT_LABEL rw init=/bin/sh console=tty0 console=ttyS0,115200n8 -} -EOF +# Create GRUB configuration from template +sed "s/@ROOT_LABEL@/$ROOT_LABEL/g" /build/config/grub.cfg.in > /staging/esp/boot/grub/grub.cfg # Prepare root filesystem contents echo "Preparing root filesystem..."