From 0ca8dd3929d280dfd29d3161f1dab015a51de25f Mon Sep 17 00:00:00 2001 From: Padreug Date: Sun, 28 Jun 2026 06:48:07 +0200 Subject: [PATCH] feat(modules): boot loader, kernel, plymouth, console Co-Authored-By: Claude Opus 4.8 --- modules/boot.nix | 268 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 268 insertions(+) create mode 100644 modules/boot.nix diff --git a/modules/boot.nix b/modules/boot.nix new file mode 100644 index 0000000..70132d6 --- /dev/null +++ b/modules/boot.nix @@ -0,0 +1,268 @@ +{ + config, + pkgs, + lib, + ... +}: + +# Omnixient Boot Configuration +# Plymouth theming and seamless boot experience + +let + inherit (lib) mkIf; + cfg = config.omni; + omni = config.omni.lib; + + # Import our custom Plymouth theme package + plymouth-themes = pkgs.callPackage ../packages/plymouth-theme.nix { }; +in +{ + config = mkIf (cfg.enable or true) { + # Plymouth boot splash configuration + boot.plymouth = { + enable = true; + theme = "omni-${cfg.theme}"; + themePackages = [ plymouth-themes ]; + + # Logo configuration + logo = "${plymouth-themes}/share/plymouth/themes/omni-${cfg.theme}/logo.png"; + }; + + # Boot optimization and theming + boot = { + # Try 7.0 — 6.18/6.19 have SMU deadlocks on Strix Halo (aiolabs/omnixient#26) + # Fallback: linuxPackages_6_12 (LTS) if 7.0 is also unstable + kernelPackages = pkgs.linuxPackages_latest; + + # Kernel parameters for smooth boot + kernelParams = [ + # Quiet boot (suppress most messages) + "quiet" + # Splash screen + "splash" + # Reduce log level + "loglevel=3" + # Disable systemd status messages on console + "rd.systemd.show_status=false" + "rd.udev.log_level=3" + "udev.log_priority=3" + # Faster boot + "boot.shell_on_fail" + # Hide cursor + "vt.global_cursor_default=0" + # Security: Disable emergency shell access + "systemd.debug-shell=0" + # Strix Halo GPU stability (aiolabs/omnixient#26) + "amdgpu.gfxoff=0" # disable gfxoff power state + "amdgpu.ppfeaturemask=0xffff7fff" # disable GFXOFF at PowerPlay level + "amdgpu.gpu_recovery=1" # auto-recover from GPU hangs + "amdgpu.cwsr_enable=0" # disable CWSR to prevent MES firmware hangs + "iommu=pt" # AMD-recommended pass-through for iGPU + ]; + + # Console configuration for seamless experience + consoleLogLevel = 0; + + # Boot loader configuration + loader = { + timeout = 3; + efi.canTouchEfiVariables = true; + + systemd-boot = { + enable = true; + editor = false; + configurationLimit = 10; + consoleMode = "auto"; + }; + }; + + # Initial ramdisk + initrd = { + verbose = false; + includeDefaultModules = true; + }; + }; + + # Plymouth transition is handled natively by systemd/plymouth integration. + + # Theme switching integration + environment.systemPackages = [ + plymouth-themes + + # Plymouth theme switching script + (omni.makeScript "omni-plymouth-theme" "Switch Plymouth boot theme" '' + if [ -z "$1" ]; then + echo "🎨 Current Plymouth theme: omni-${cfg.theme}" + echo + echo "Available themes:" + ls ${plymouth-themes}/share/plymouth/themes/ | grep "omni-" | sed 's/omni-/ - /' + echo + echo "Usage: omni-plymouth-theme " + exit 0 + fi + + THEME="omni-$1" + THEME_PATH="${plymouth-themes}/share/plymouth/themes/$THEME" + + if [ ! -d "$THEME_PATH" ]; then + echo "❌ Theme '$1' not found!" + echo "Available themes:" + ls ${plymouth-themes}/share/plymouth/themes/ | grep "omni-" | sed 's/omni-/ - /' + exit 1 + fi + + echo "🎨 Setting Plymouth theme to: $1" + + # Update Plymouth theme + sudo ${pkgs.plymouth}/bin/plymouth-set-default-theme "$THEME" + + # Regenerate initrd + echo "🔄 Regenerating initrd..." + sudo nixos-rebuild boot --flake /etc/nixos#omni + + echo "✅ Plymouth theme updated!" + echo "⚠️ Reboot to see the new boot theme" + '') + + # Plymouth management utilities + (omni.makeScript "omni-boot-preview" "Preview Plymouth theme" '' + if [ "$EUID" -ne 0 ]; then + echo "❌ This command must be run as root (use sudo)" + exit 1 + fi + + echo "🎬 Starting Plymouth preview..." + echo " Press Ctrl+Alt+F1 to return to console" + echo " Press Ctrl+C to stop preview" + + # Kill any running Plymouth instances + pkill plymouthd 2>/dev/null || true + + # Start Plymouth in preview mode + ${pkgs.plymouth}/bin/plymouthd --debug --debug-file=/tmp/plymouth-debug.log + ${pkgs.plymouth}/bin/plymouth --show-splash + + # Simulate boot progress + for i in $(seq 0 5 100); do + ${pkgs.plymouth}/bin/plymouth --update="boot-progress:$i/100" + sleep 0.1 + done + + echo "Plymouth preview running. Check another TTY to see the splash screen." + echo "Press Enter to stop..." + read -r + + ${pkgs.plymouth}/bin/plymouth --quit + pkill plymouthd 2>/dev/null || true + + echo "✅ Plymouth preview stopped" + '') + + # Boot diagnostics + (omni.makeScript "omni-boot-info" "Show boot information and diagnostics" '' + echo "🚀 Omnixient Boot Information" + echo "═══════════════════════════" + echo + + echo "🎨 Plymouth Configuration:" + echo " Current Theme: ${cfg.theme}" + echo " Theme Package: ${plymouth-themes}" + echo " Plymouth Status: $(systemctl is-active plymouth-start.service 2>/dev/null || echo 'inactive')" + echo + + echo "⚙️ Boot Configuration:" + echo " Boot Loader: $(bootctl status 2>/dev/null | grep 'systemd-boot' || echo 'systemd-boot')" + echo " Kernel: $(uname -r)" + echo " Boot Time: $(systemd-analyze | head -1)" + echo + + echo "📊 Boot Performance:" + systemd-analyze blame | head -10 + echo + + echo "🔧 Boot Services:" + echo " Display Manager: $(systemctl is-active display-manager 2>/dev/null || echo 'inactive')" + echo " Plymouth: $(systemctl is-active plymouth-*.service 2>/dev/null || echo 'inactive')" + echo " Omnixient Transition: $(systemctl is-active omni-boot-transition 2>/dev/null || echo 'inactive')" + + if [ -f "/tmp/plymouth-debug.log" ]; then + echo + echo "🐛 Plymouth Debug Log (last 10 lines):" + tail -10 /tmp/plymouth-debug.log + fi + '') + ]; + + # Plymouth theme is set declaratively via boot.plymouth.theme above. + + # Font configuration for Plymouth + fonts = { + packages = with pkgs; [ + jetbrains-mono + cantarell-fonts + liberation_ttf + dejavu_fonts + ]; + + # Ensure fonts are available early in boot + fontDir.enable = true; + }; + + # Security settings are now included in boot.kernelParams above + + # Optional: LUKS integration for encrypted systems + # Plymouth will automatically handle LUKS password prompts when LUKS devices are configured + + # Console and TTY configuration + console = { + keyMap = "us"; + earlySetup = true; + colors = [ + # Custom console color palette matching current theme + # This will be used before Plymouth starts + ] + ++ ( + if cfg.theme == "tokyo-night" then + [ + "1a1b26" + "f7768e" + "9ece6a" + "e0af68" + "7aa2f7" + "bb9af7" + "7dcfff" + "c0caf5" + "414868" + "f7768e" + "9ece6a" + "e0af68" + "7aa2f7" + "bb9af7" + "7dcfff" + "a9b1d6" + ] + else if cfg.theme == "gruvbox" then + [ + "282828" + "cc241d" + "98971a" + "d79921" + "458588" + "b16286" + "689d6a" + "a89984" + "928374" + "fb4934" + "b8bb26" + "fabd2f" + "83a598" + "d3869b" + "8ec07c" + "ebdbb2" + ] + else + [ ] + ); + }; + }; +}