From 5875725ca235fe7d402876d90028e1c50d7b62d1 Mon Sep 17 00:00:00 2001 From: UGA Innovation Factory Date: Wed, 7 Jan 2026 18:11:19 -0500 Subject: [PATCH] refactor: reorganize directory structure (variants -> hw, glue -> fleet) - Rename variants/ to hw/ for clearer hardware module naming - Rename glue/ to fleet/ for more intuitive fleet management - Move boot/fs configuration from glue/boot.nix to separate fleet/boot.nix and fleet/fs.nix - Improve separation of concerns between boot, filesystem, and common config --- fleet/boot.nix | 48 ++++++++ fleet/common.nix | 51 ++++++++ fleet/fs.nix | 90 ++++++++++++++ fleet/user-config.nix | 276 ++++++++++++++++++++++++++++++++++++++++++ glue/boot.nix | 137 --------------------- glue/common.nix | 99 --------------- hw/default.nix | 28 +++++ hw/nix-desktop.nix | 50 ++++++++ hw/nix-ephemeral.nix | 66 ++++++++++ hw/nix-laptop.nix | 63 ++++++++++ hw/nix-lxc.nix | 61 ++++++++++ hw/nix-surface.nix | 57 +++++++++ hw/nix-wsl.nix | 53 ++++++++ hw/nix-zima.nix | 49 ++++++++ 14 files changed, 892 insertions(+), 236 deletions(-) create mode 100644 fleet/boot.nix create mode 100644 fleet/common.nix create mode 100644 fleet/fs.nix create mode 100644 fleet/user-config.nix delete mode 100644 glue/boot.nix delete mode 100644 glue/common.nix create mode 100644 hw/default.nix create mode 100644 hw/nix-desktop.nix create mode 100644 hw/nix-ephemeral.nix create mode 100644 hw/nix-laptop.nix create mode 100644 hw/nix-lxc.nix create mode 100644 hw/nix-surface.nix create mode 100644 hw/nix-wsl.nix create mode 100644 hw/nix-zima.nix diff --git a/fleet/boot.nix b/fleet/boot.nix new file mode 100644 index 0000000..b2ef67c --- /dev/null +++ b/fleet/boot.nix @@ -0,0 +1,48 @@ +# ============================================================================ +# Boot configuration module +# ============================================================================ +# This module defines: +# - Bootloader configuration (systemd-boot with Plymouth) +# - Timezone and locale settings +# - Systemd sleep configuration + +{ config, lib, ... }: +{ + boot = { + loader.systemd-boot.enable = lib.mkDefault true; + loader.efi.canTouchEfiVariables = lib.mkDefault true; + plymouth.enable = lib.mkDefault true; + + # Enable "Silent boot" + consoleLogLevel = 3; + initrd.verbose = false; + + # Hide the OS choice for bootloaders. + # It's still possible to open the bootloader list by pressing any key + # It will just not appear on screen unless a key is pressed + loader.timeout = lib.mkDefault 0; + }; + + # Set your time zone. + time.timeZone = "America/New_York"; + + # Select internationalisation properties. + i18n.defaultLocale = "en_US.UTF-8"; + + i18n.extraLocaleSettings = { + LC_ADDRESS = "en_US.UTF-8"; + LC_IDENTIFICATION = "en_US.UTF-8"; + LC_MEASUREMENT = "en_US.UTF-8"; + LC_MONETARY = "en_US.UTF-8"; + LC_NAME = "en_US.UTF-8"; + LC_NUMERIC = "en_US.UTF-8"; + LC_PAPER = "en_US.UTF-8"; + LC_TELEPHONE = "en_US.UTF-8"; + LC_TIME = "en_US.UTF-8"; + }; + + systemd.sleep.extraConfig = '' + SuspendState=freeze + HibernateDelaySec=2h + ''; +} diff --git a/fleet/common.nix b/fleet/common.nix new file mode 100644 index 0000000..8bcbb4d --- /dev/null +++ b/fleet/common.nix @@ -0,0 +1,51 @@ +# ============================================================================ +# Common Host Module +# ============================================================================ +# This module contains all the common configuration shared by all host types. +# It is automatically imported by the fleet generator for every host. + +{ + inputs, + config, + lib, + ... +}: +{ + imports = [ + ./fs.nix + ./boot.nix + ./user-config.nix + ../sw + ../users.nix + ]; + + options.athenix = { + forUser = lib.mkOption { + type = lib.types.nullOr lib.types.str; + default = null; + description = '' + Convenience option to configure a host for a specific user. + Automatically enables the user (sets athenix.users.username.enable = true). + Value should be a username from athenix.users.accounts. + ''; + }; + host.useHostPrefix = lib.mkOption { + type = lib.types.bool; + default = true; + description = "Whether to prepend the host prefix to the hostname (used in inventory and hosts/default.nix)."; + }; + }; + + config = lib.mkMerge [ + (lib.mkIf (config.athenix.forUser != null) { + athenix.users.${config.athenix.forUser}.enable = true; + }) + { + system.stateVersion = "25.11"; + nix.settings.experimental-features = [ + "nix-command" + "flakes" + ]; + } + ]; +} diff --git a/fleet/fs.nix b/fleet/fs.nix new file mode 100644 index 0000000..97fd6d0 --- /dev/null +++ b/fleet/fs.nix @@ -0,0 +1,90 @@ +# ============================================================================ +# FS & Storage Configuration +# ============================================================================ +# This module defines: +# - Disko partition layout (EFI, swap, root) +# - Filesystem options (device, swap size) + +{ config, lib, ... }: + +{ + options.athenix = { + host.filesystem = { + device = lib.mkOption { + type = lib.types.nullOr lib.types.str; + default = null; + description = "The main disk device to use for installation."; + }; + useSwap = lib.mkOption { + type = lib.types.bool; + default = true; + description = "Whether to create and use a swap partition."; + }; + swapSize = lib.mkOption { + type = lib.types.nullOr lib.types.str; + default = null; + description = "The size of the swap partition."; + }; + }; + }; + + config = { + # ========== Disk Partitioning (Disko) ========== + disko.enableConfig = lib.mkDefault (config.athenix.host.filesystem.device != null); + + disko.devices = { + disk.main = { + type = "disk"; + device = config.athenix.host.filesystem.device; + content = { + type = "gpt"; + partitions = { + # EFI System Partition + ESP = { + name = "ESP"; + label = "BOOT"; + size = "1G"; + type = "EF00"; + content = { + type = "filesystem"; + format = "vfat"; + mountpoint = "/boot"; + mountOptions = [ "umask=0077" ]; + extraArgs = [ + "-n" + "BOOT" + ]; + }; + }; + + # Swap Partition (size configurable per host) + swap = lib.mkIf config.athenix.host.filesystem.useSwap { + name = "swap"; + label = "swap"; + size = config.athenix.host.filesystem.swapSize; + content = { + type = "swap"; + }; + }; + + # Root Partition (takes remaining space) + root = { + name = "root"; + label = "root"; + size = "100%"; + content = { + type = "filesystem"; + format = "ext4"; + mountpoint = "/"; + extraArgs = [ + "-L" + "ROOT" + ]; + }; + }; + }; + }; + }; + }; + }; +} diff --git a/fleet/user-config.nix b/fleet/user-config.nix new file mode 100644 index 0000000..299acef --- /dev/null +++ b/fleet/user-config.nix @@ -0,0 +1,276 @@ +{ + pkgs, + config, + lib, + inputs, + ... +}: + +# ============================================================================ +# User Configuration Module +# ============================================================================ +# This module defines the schema for user accounts and handles their creation. +# It bridges the gap between the data in 'users.nix' and the actual NixOS +# and Home Manager configuration. + +let + # Load users.nix to get account definitions + usersData = import ../users.nix { inherit pkgs; }; + accounts = usersData.athenix.users or { }; + + # Helper: Resolve external module path from fetchGit/fetchTarball/path + resolveExternalPath = + external: + if external == null then + null + else if builtins.isAttrs external && external ? outPath then + external.outPath + else + external; + + # Helper: Check if path exists and is valid + isValidPath = + path: + path != null + && (builtins.isPath path || (builtins.isString path && lib.hasPrefix "/" path)) + && builtins.pathExists path; + + # Extract athenix.users options from external user.nix modules + # First, build a cache of options per user from their external user.nix (if any). + externalUserModuleOptions = lib.genAttrs (lib.attrNames accounts) ( + name: + let + user = accounts.${name}; + externalPath = resolveExternalPath (user.external or null); + userNixPath = if externalPath != null then externalPath + "/user.nix" else null; + in + if isValidPath userNixPath then + let + # Import and evaluate the module with minimal args + outerModule = import userNixPath { inherit inputs; }; + evaluatedModule = outerModule { + config = { }; + inherit lib pkgs; + osConfig = null; + }; + # Extract just the athenix.users. options + athenixUsers = evaluatedModule.athenix.users or { }; + in + athenixUsers.${name} or { } + else + { } + ); + + # externalUserOptions only contains users that actually have options defined + externalUserOptions = lib.filterAttrs ( + _: moduleOptions: moduleOptions != { } + ) externalUserModuleOptions; + + # Submodule defining the structure of a user account + userSubmodule = lib.types.submodule { + options = { + isNormalUser = lib.mkOption { + type = lib.types.bool; + default = true; + }; + description = lib.mkOption { + type = lib.types.nullOr lib.types.str; + default = null; + }; + extraGroups = lib.mkOption { + type = lib.types.listOf lib.types.str; + default = [ ]; + }; + hashedPassword = lib.mkOption { + type = lib.types.str; + default = "!"; + }; + extraPackages = lib.mkOption { + type = lib.types.listOf lib.types.package; + default = [ ]; + }; + excludePackages = lib.mkOption { + type = lib.types.listOf lib.types.package; + default = [ ]; + }; + homePackages = lib.mkOption { + type = lib.types.listOf lib.types.package; + default = [ ]; + }; + extraImports = lib.mkOption { + type = lib.types.listOf lib.types.path; + default = [ ]; + }; + external = lib.mkOption { + type = lib.types.nullOr ( + lib.types.oneOf [ + lib.types.path + lib.types.package + lib.types.attrs + ] + ); + default = null; + description = '' + External user configuration module. Can be: + - A path to a local module directory + - A fetchGit/fetchTarball result pointing to a repository + + The external module can contain: + - user.nix (optional): Sets athenix.users. options AND home-manager config + - nixos.nix (optional): System-level NixOS configuration + + Example: builtins.fetchGit { url = "https://github.com/user/dotfiles"; rev = "..."; } + ''; + }; + opensshKeys = lib.mkOption { + type = lib.types.listOf lib.types.str; + default = [ ]; + description = "List of SSH public keys for the user."; + }; + shell = lib.mkOption { + type = lib.types.nullOr lib.types.package; + default = null; + description = "The shell for this user."; + }; + editor = lib.mkOption { + type = lib.types.nullOr lib.types.package; + default = null; + description = "The default editor for this user."; + }; + useZshTheme = lib.mkOption { + type = lib.types.bool; + default = true; + description = "Whether to apply the system Zsh theme."; + }; + useNvimPlugins = lib.mkOption { + type = lib.types.bool; + default = true; + description = "Whether to apply the system Neovim configuration."; + }; + enable = lib.mkOption { + type = lib.types.bool; + default = false; + description = "Whether this user account is enabled on this system."; + }; + }; + }; +in +{ + + options.athenix.users = lib.mkOption { + type = lib.types.attrsOf userSubmodule; + default = { }; + description = "User accounts configuration. Set enable=true for users that should exist on this system."; + }; + + config = { + # Merge user definitions from users.nix with options from external user.nix modules + # External options take precedence over users.nix (which uses lib.mkDefault) + athenix.users = lib.mapAttrs ( + name: user: + user + // { + description = lib.mkDefault (user.description or null); + shell = lib.mkDefault (user.shell or null); + extraGroups = lib.mkDefault (user.extraGroups or [ ]); + } + // (externalUserOptions.${name} or { }) + ) accounts; + + # Generate NixOS users + users.users = + let + enabledAccounts = lib.filterAttrs (_: user: user.enable) config.athenix.users; + in + lib.mapAttrs ( + name: user: + let + isPlasma6 = config.services.desktopManager.plasma6.enable; + defaultPackages = lib.optionals (isPlasma6 && name != "root") [ pkgs.kdePackages.kate ]; + finalPackages = lib.subtractLists user.excludePackages (defaultPackages ++ user.extraPackages); + in + { + inherit (user) isNormalUser extraGroups hashedPassword; + description = if user.description != null then user.description else lib.mkDefault ""; + openssh.authorizedKeys.keys = user.opensshKeys; + packages = finalPackages; + shell = if user.shell != null then user.shell else pkgs.bash; + } + ) enabledAccounts; + + # Home Manager configs per user + home-manager = { + useGlobalPkgs = true; + useUserPackages = true; + extraSpecialArgs = { + osConfig = config; + inherit inputs; + }; + + users = + let + enabledAccounts = lib.filterAttrs (_: user: user.enable) config.athenix.users; + in + lib.mapAttrs ( + name: user: + let + # Resolve external module paths + hasExternal = user.external != null; + externalPath = resolveExternalPath user.external; + userNixPath = if externalPath != null then externalPath + "/user.nix" else null; + hasExternalUser = isValidPath userNixPath; + + # Import external user.nix for home-manager (filter out athenix.* options) + externalUserModule = + if hasExternalUser then + let + fullModule = import userNixPath { inherit inputs; }; + in + # Only pass through non-athenix options to home-manager + { + config, + lib, + pkgs, + osConfig, + ... + }: + let + evaluated = fullModule { + inherit + config + lib + pkgs + osConfig + ; + }; + in + lib.filterAttrs (attrName: _: attrName != "athenix") evaluated + else + { }; + + # Common imports based on user flags + commonImports = lib.optional user.useZshTheme ../sw/theme.nix ++ [ + (import ../sw/nvim.nix { inherit user; }) + ]; + + # Build imports list + allImports = user.extraImports ++ commonImports ++ lib.optional hasExternalUser externalUserModule; + in + lib.mkMerge [ + { + imports = allImports; + + # Always set these required options + home.username = name; + home.homeDirectory = if name == "root" then "/root" else "/home/${name}"; + home.stateVersion = "25.11"; + } + (lib.mkIf (!hasExternal) { + # For local users only, add their packages + home.packages = user.homePackages; + }) + ] + ) enabledAccounts; + }; + }; +} diff --git a/glue/boot.nix b/glue/boot.nix deleted file mode 100644 index 8e81434..0000000 --- a/glue/boot.nix +++ /dev/null @@ -1,137 +0,0 @@ -# ============================================================================ -# Boot & Storage Configuration -# ============================================================================ -# This module defines: -# - Disko partition layout (EFI, swap, root) -# - Bootloader configuration (systemd-boot with Plymouth) -# - Filesystem options (device, swap size) -# - Build method options (used by installer/artifacts.nix) -# - Convenience options (forUser, useHostPrefix) - -{ config, lib, ... }: - -{ - options.athenix = { - host = { - useHostPrefix = lib.mkOption { - type = lib.types.bool; - default = true; - description = "Whether to prepend the host prefix to the hostname (used in inventory and hosts/default.nix)."; - }; - filesystem = { - device = lib.mkOption { - type = lib.types.str; - description = "The main disk device to use for installation."; - }; - useSwap = lib.mkOption { - type = lib.types.bool; - default = true; - description = "Whether to create and use a swap partition."; - }; - swapSize = lib.mkOption { - type = lib.types.str; - description = "The size of the swap partition."; - }; - }; - }; - }; - - config = { - # ========== Disk Partitioning (Disko) ========== - disko.enableConfig = lib.mkDefault true; - - disko.devices = { - disk.main = { - type = "disk"; - device = config.athenix.host.filesystem.device; - content = { - type = "gpt"; - partitions = { - # EFI System Partition - ESP = { - name = "ESP"; - label = "BOOT"; - size = "1G"; - type = "EF00"; - content = { - type = "filesystem"; - format = "vfat"; - mountpoint = "/boot"; - mountOptions = [ "umask=0077" ]; - extraArgs = [ - "-n" - "BOOT" - ]; - }; - }; - - # Swap Partition (size configurable per host) - swap = lib.mkIf config.athenix.host.filesystem.useSwap { - name = "swap"; - label = "swap"; - size = config.athenix.host.filesystem.swapSize; - content = { - type = "swap"; - }; - }; - - # Root Partition (takes remaining space) - root = { - name = "root"; - label = "root"; - size = "100%"; - content = { - type = "filesystem"; - format = "ext4"; - mountpoint = "/"; - extraArgs = [ - "-L" - "ROOT" - ]; - }; - }; - }; - }; - }; - }; - - # Bootloader Configuration - boot = { - loader.systemd-boot.enable = true; - loader.efi.canTouchEfiVariables = true; - plymouth.enable = true; - - # Enable "Silent boot" - consoleLogLevel = 3; - initrd.verbose = false; - - # Hide the OS choice for bootloaders. - # It's still possible to open the bootloader list by pressing any key - # It will just not appear on screen unless a key is pressed - loader.timeout = lib.mkDefault 0; - }; - - # Set your time zone. - time.timeZone = "America/New_York"; - - # Select internationalisation properties. - i18n.defaultLocale = "en_US.UTF-8"; - - i18n.extraLocaleSettings = { - LC_ADDRESS = "en_US.UTF-8"; - LC_IDENTIFICATION = "en_US.UTF-8"; - LC_MEASUREMENT = "en_US.UTF-8"; - LC_MONETARY = "en_US.UTF-8"; - LC_NAME = "en_US.UTF-8"; - LC_NUMERIC = "en_US.UTF-8"; - LC_PAPER = "en_US.UTF-8"; - LC_TELEPHONE = "en_US.UTF-8"; - LC_TIME = "en_US.UTF-8"; - }; - - systemd.sleep.extraConfig = '' - SuspendState=freeze - HibernateDelaySec=2h - ''; - }; -} diff --git a/glue/common.nix b/glue/common.nix deleted file mode 100644 index c7ad4ae..0000000 --- a/glue/common.nix +++ /dev/null @@ -1,99 +0,0 @@ -# ============================================================================ -# Common Host Module -# ============================================================================ -# This module contains all the common configuration shared by all host types. -# It is automatically imported by the fleet generator for every host. - -{ inputs }: -{ - config, - lib, - ... -}: -{ - imports = [ - ./boot.nix - ./user-config.nix - ../sw - ../users.nix - inputs.home-manager.nixosModules.home-manager - inputs.agenix.nixosModules.default - inputs.disko.nixosModules.disko - ]; - - # Define garbage collection options here since they're consumed in this module - options.athenix = { - forUser = lib.mkOption { - type = lib.types.nullOr lib.types.str; - default = null; - description = '' - Convenience option to configure a host for a specific user. - Automatically enables the user (sets athenix.users.username.enable = true). - Value should be a username from athenix.users.accounts. - ''; - }; - - system.gc = { - enable = lib.mkOption { - type = lib.types.bool; - default = true; - description = "Whether to enable automatic garbage collection."; - }; - frequency = lib.mkOption { - type = lib.types.str; - default = "weekly"; - description = "How often to run garbage collection (systemd timer format)."; - }; - retentionDays = lib.mkOption { - type = lib.types.int; - default = 30; - description = "Number of days to keep old generations before deletion."; - }; - optimise = lib.mkOption { - type = lib.types.bool; - default = true; - description = "Whether to automatically optimize the Nix store."; - }; - }; - - host.buildMethods = lib.mkOption { - type = lib.types.listOf lib.types.str; - default = [ "installer-iso" ]; - description = '' - List of allowed build methods for this host (used by installer/artifacts.nix). - Supported methods: - - "installer-iso": Generates an auto-install ISO that installs this configuration to disk. - - "iso": Generates a live ISO (using nixos-generators). - - "ipxe": Generates iPXE netboot artifacts (kernel, initrd, script). - - "lxc": Generates an LXC container tarball. - - "proxmox": Generates a Proxmox VMA archive. - ''; - }; - }; - - config = lib.mkMerge [ - # Enable forUser if specified - (lib.mkIf (config.athenix.forUser != null) { - athenix.users.${config.athenix.forUser}.enable = true; - }) - - { - system.stateVersion = "25.11"; - - nix.settings.experimental-features = [ - "nix-command" - "flakes" - ]; - - # Automatic Garbage Collection - nix.gc = lib.mkIf config.athenix.system.gc.enable { - automatic = true; - dates = config.athenix.system.gc.frequency; - options = "--delete-older-than ${toString config.athenix.system.gc.retentionDays}d"; - }; - - # Optimize storage - nix.optimise.automatic = config.athenix.system.gc.optimise; - } - ]; -} diff --git a/hw/default.nix b/hw/default.nix new file mode 100644 index 0000000..0b95ad2 --- /dev/null +++ b/hw/default.nix @@ -0,0 +1,28 @@ +# ============================================================================ +# Host Types Module +# ============================================================================ +# This module exports all available host types as an attribute set. +# Each type is a NixOS module (a function suitable for lib.types.submodule). + +{ inputs }: +let + lib = inputs.nixpkgs.lib; + inherit (builtins) readDir attrNames; + inherit (lib) filterAttrs removeSuffix genAttrs; + + files = readDir ./.; + + # Keep only regular *.nix files except default.nix + nixFiles = filterAttrs ( + name: type: + type == "regular" + && lib.hasSuffix ".nix" name + && name != "default.nix" + ) files; + + moduleNames = map (name: removeSuffix ".nix" name) (attrNames nixFiles); +in +# Export: { name = ; } +genAttrs moduleNames (name: + import (./. + ("/" + name + ".nix")) +) \ No newline at end of file diff --git a/hw/nix-desktop.nix b/hw/nix-desktop.nix new file mode 100644 index 0000000..d7116f9 --- /dev/null +++ b/hw/nix-desktop.nix @@ -0,0 +1,50 @@ +# ============================================================================ +# Desktop Configuration +# ============================================================================ +# Hardware and boot configuration for standard desktop workstations. +# Includes Intel CPU support and NVMe storage. + +{ + config, + lib, + modulesPath, + ... +}: +{ + imports = [ + (modulesPath + "/installer/scan/not-detected.nix") + ]; + + # ========== Boot Configuration ========== + + boot.initrd.availableKernelModules = [ + "xhci_pci" # USB 3.0 support + "nvme" # NVMe SSD support + "usb_storage" # USB storage devices + "sd_mod" # SD card support + "sdhci_pci" # SD card host controller + ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ "kvm-intel" ]; # Intel virtualization support + boot.extraModulePackages = [ ]; + boot.kernelParams = [ + "quiet" # Minimal boot messages + "splash" # Show Plymouth boot splash + "boot.shell_on_fail" # Emergency shell on boot failure + "udev.log_priority=3" # Reduce udev logging + "rd.systemd.show_status=auto" # Show systemd status during boot + ]; + + # ========== Filesystem Configuration ========== + athenix.host.filesystem.swapSize = lib.mkDefault "16G"; + athenix.host.filesystem.device = lib.mkDefault "/dev/nvme0n1"; + athenix.host.buildMethods = lib.mkDefault [ "installer-iso" ]; + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + + # ========== Hardware Configuration ========== + hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; + + # ========== Software Profile ========== + athenix.sw.enable = lib.mkDefault true; + athenix.sw.type = lib.mkDefault "desktop"; +} diff --git a/hw/nix-ephemeral.nix b/hw/nix-ephemeral.nix new file mode 100644 index 0000000..3d71a81 --- /dev/null +++ b/hw/nix-ephemeral.nix @@ -0,0 +1,66 @@ +# ============================================================================ +# Ephemeral/Diskless System Configuration +# ============================================================================ +# Configuration for systems that run entirely from RAM without persistent storage. +# Suitable for kiosks, netboot clients, and stateless workstations. +# All data is lost on reboot. + +{ + config, + lib, + modulesPath, + ... +}: +{ + imports = [ + (modulesPath + "/installer/scan/not-detected.nix") + ]; + + # ========== Boot Configuration ========== + boot.initrd.availableKernelModules = [ + "xhci_pci" # USB 3.0 support + "nvme" # NVMe support + "usb_storage" # USB storage devices + "sd_mod" # SD card support + "sdhci_pci" # SD card host controller + ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ "kvm-intel" ]; # Intel virtualization support + boot.extraModulePackages = [ ]; + boot.kernelParams = [ + "quiet" # Minimal boot messages + "splash" # Show Plymouth boot splash + "boot.shell_on_fail" # Emergency shell on boot failure + "udev.log_priority=3" # Reduce udev logging + "rd.systemd.show_status=auto" # Show systemd status during boot + ]; + + # ========== Ephemeral Configuration ========== + # No persistent storage - everything runs from RAM + athenix.host.filesystem.swapSize = lib.mkForce "0G"; + athenix.host.filesystem.device = lib.mkForce "/dev/null"; # Dummy device + athenix.host.buildMethods = lib.mkDefault [ + "iso" # Live ISO image + "ipxe" # Network boot + ]; + + # Disable disk management for RAM-only systems + disko.enableConfig = lib.mkForce false; + + # Define tmpfs root filesystem + fileSystems."/" = { + device = "none"; + fsType = "tmpfs"; + options = [ + "defaults" + "size=50%" + "mode=755" + ]; + }; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; + + athenix.sw.enable = lib.mkDefault true; + athenix.sw.type = lib.mkDefault "stateless-kiosk"; +} diff --git a/hw/nix-laptop.nix b/hw/nix-laptop.nix new file mode 100644 index 0000000..ec0e60e --- /dev/null +++ b/hw/nix-laptop.nix @@ -0,0 +1,63 @@ +# ============================================================================ +# Laptop Configuration +# ============================================================================ +# Hardware and boot configuration for laptop systems with mobile features. +# Includes power management, lid switch handling, and Intel graphics fixes. + +{ + config, + lib, + modulesPath, + ... +}: +{ + imports = [ + (modulesPath + "/installer/scan/not-detected.nix") + ]; + + # ========== Boot Configuration ========== + + boot.initrd.availableKernelModules = [ + "xhci_pci" # USB 3.0 support + "thunderbolt" # Thunderbolt support + "nvme" # NVMe SSD support + "usb_storage" # USB storage devices + "sd_mod" # SD card support + "sdhci_pci" # SD card host controller + ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ "kvm-intel" ]; # Intel virtualization support + boot.extraModulePackages = [ ]; + boot.kernelParams = [ + "quiet" # Minimal boot messages + "splash" # Show Plymouth boot splash + "boot.shell_on_fail" # Emergency shell on boot failure + "udev.log_priority=3" # Reduce udev logging + "rd.systemd.show_status=auto" # Show systemd status during boot + "i915.enable_psr=0" # Disable Panel Self Refresh (stability) + "i915.enable_dc=0" # Disable display power saving + "i915.enable_fbc=0" # Disable framebuffer compression + ]; + + # ========== Hardware Configuration ========== + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; + + # ========== Filesystem Configuration ========== + athenix.host.filesystem.device = lib.mkDefault "/dev/nvme0n1"; + athenix.host.filesystem.swapSize = lib.mkDefault "34G"; # Larger swap for hibernation + athenix.host.buildMethods = lib.mkDefault [ "installer-iso" ]; + + # ========== Power Management ========== + services.upower.enable = lib.mkDefault true; + services.logind.settings = { + Login = { + HandleLidSwitch = "suspend"; + HandleLidSwitchExternalPower = "suspend"; + HandleLidSwitchDocked = "ignore"; + }; + }; + + athenix.sw.enable = lib.mkDefault true; + athenix.sw.type = lib.mkDefault "desktop"; +} diff --git a/hw/nix-lxc.nix b/hw/nix-lxc.nix new file mode 100644 index 0000000..a5b161d --- /dev/null +++ b/hw/nix-lxc.nix @@ -0,0 +1,61 @@ +# ============================================================================ +# Proxmox LXC Container Configuration +# ============================================================================ +# Configuration for lightweight Linux containers running in Proxmox. +# Disables boot/disk management and enables remote development support. + +{ + config, + lib, + modulesPath, + inputs, + ... +}: +{ + imports = [ + inputs.vscode-server.nixosModules.default + "${modulesPath}/virtualisation/proxmox-lxc.nix" + ]; + + # ========== Nix Configuration ========== + nix.settings.trusted-users = [ + "root" + "engr-ugaif" + ]; + nix.settings.experimental-features = [ + "nix-command" + "flakes" + ]; + + # ========== Container-Specific Configuration ========== + boot.isContainer = true; + boot.loader.systemd-boot.enable = lib.mkForce false; # No bootloader in container + disko.enableConfig = lib.mkForce false; # No disk management in container + console.enable = true; + + # Allow getty to work in containers + systemd.services."getty@".unitConfig.ConditionPathExists = [ + "" + "/dev/%I" + ]; + + # Suppress unnecessary systemd units for containers + systemd.suppressedSystemUnits = [ + "dev-mqueue.mount" + "sys-kernel-debug.mount" + "sys-fs-fuse-connections.mount" + ]; + + # ========== Remote Development ========== + services.vscode-server.enable = true; + + # ========== System Configuration ========== + system.stateVersion = "25.11"; + athenix.host.buildMethods = lib.mkDefault [ + "lxc" # LXC container tarball + "proxmox" # Proxmox VMA archive + ]; + + athenix.sw.enable = lib.mkDefault true; + athenix.sw.type = lib.mkDefault "headless"; +} diff --git a/hw/nix-surface.nix b/hw/nix-surface.nix new file mode 100644 index 0000000..4452f88 --- /dev/null +++ b/hw/nix-surface.nix @@ -0,0 +1,57 @@ +# ============================================================================ +# Microsoft Surface Tablet Configuration +# ============================================================================ +# Hardware configuration for Surface Go tablets in kiosk mode. +# Uses nixos-hardware module and older kernel for Surface-specific drivers. + +{ + config, + lib, + modulesPath, + inputs, + ... +}: +{ + imports = [ + (modulesPath + "/installer/scan/not-detected.nix") + inputs.nixos-hardware.nixosModules.microsoft-surface-go + ]; + + # ========== Boot Configuration ========== + + boot.initrd.availableKernelModules = [ + "xhci_pci" # USB 3.0 support + "nvme" # NVMe support (though Surface uses eMMC) + "usb_storage" # USB storage devices + "sd_mod" # SD card support + "sdhci_pci" # SD card host controller + ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ "kvm-intel" ]; # Intel virtualization support + boot.extraModulePackages = [ ]; + boot.kernelParams = [ + "quiet" # Minimal boot messages + "splash" # Show Plymouth boot splash + "boot.shell_on_fail" # Emergency shell on boot failure + "udev.log_priority=3" # Reduce udev logging + "rd.systemd.show_status=auto" # Show systemd status during boot + "intel_ipu3_imgu" # Intel camera image processing + "intel_ipu3_isys" # Intel camera sensor interface + "fbcon=map:1" # Framebuffer console mapping + "i915.enable_psr=0" # Disable Panel Self Refresh (breaks resume) + "i915.enable_dc=0" # Disable display power saving + ]; + + # ========== Filesystem Configuration ========== + athenix.host.filesystem.swapSize = lib.mkDefault "8G"; + athenix.host.filesystem.device = lib.mkDefault "/dev/mmcblk0"; # eMMC storage # eMMC storage + athenix.host.buildMethods = lib.mkDefault [ "installer-iso" ]; + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + + # ========== Hardware Configuration ========== + hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; + + # ========== Software Profile ========== + athenix.sw.enable = lib.mkDefault true; + athenix.sw.type = lib.mkDefault "tablet-kiosk"; # Touch-optimized kiosk mode +} diff --git a/hw/nix-wsl.nix b/hw/nix-wsl.nix new file mode 100644 index 0000000..6e9e6e4 --- /dev/null +++ b/hw/nix-wsl.nix @@ -0,0 +1,53 @@ +# ============================================================================ +# Windows Subsystem for Linux (WSL) Configuration +# ============================================================================ +# Configuration for NixOS running in WSL2 on Windows. +# Integrates with nixos-wsl for WSL-specific functionality. + +{ + lib, + config, + inputs, + ... +}: +{ + imports = [ + inputs.nixos-wsl.nixosModules.default + inputs.vscode-server.nixosModules.default + ]; + + # ========== Options ========== + options.athenix.host.wsl.user = lib.mkOption { + type = lib.types.str; + default = "engr-ugaif"; + description = "The default user to log in as in WSL."; + }; + + config = { + # ========== WSL Configuration ========== + wsl.enable = true; + # Use forUser if set, otherwise fall back to wsl.user option + wsl.defaultUser = + if config.athenix.forUser != null then config.athenix.forUser else config.athenix.host.wsl.user; + + # ========== Software Profile ========== + athenix.sw.enable = lib.mkDefault true; + athenix.sw.type = lib.mkDefault "headless"; + + # ========== Remote Development ========== + services.vscode-server.enable = true; + + # ========== Disable Irrelevant Systems ========== + # WSL doesn't use traditional boot or disk management + disko.enableConfig = lib.mkForce false; + boot.loader.systemd-boot.enable = lib.mkForce false; + boot.loader.grub.enable = lib.mkForce false; + + # WSL manages its own networking + systemd.network.enable = lib.mkForce false; + + # Provide dummy values for required options from boot.nix + athenix.host.filesystem.device = "/dev/null"; + athenix.host.filesystem.swapSize = "0G"; + }; +} diff --git a/hw/nix-zima.nix b/hw/nix-zima.nix new file mode 100644 index 0000000..a87ef60 --- /dev/null +++ b/hw/nix-zima.nix @@ -0,0 +1,49 @@ +# ============================================================================ +# Desktop Configuration +# ============================================================================ +# Hardware and boot configuration for standard desktop workstations. +# Includes Intel CPU support and NVMe storage. + +{ + config, + lib, + modulesPath, + ... +}: +{ + imports = [ + (modulesPath + "/installer/scan/not-detected.nix") + ]; + + # ========== Boot Configuration ========== + + boot.initrd.availableKernelModules = [ + "xhci_pci" # USB 3.0 support + "usb_storage" # USB storage devices + "sd_mod" # SD card support + "sdhci_pci" # SD card host controller + ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ "kvm-intel" ]; # Intel virtualization support + boot.extraModulePackages = [ ]; + boot.kernelParams = [ + "quiet" # Minimal boot messages + "splash" # Show Plymouth boot splash + "boot.shell_on_fail" # Emergency shell on boot failure + "udev.log_priority=3" # Reduce udev logging + "rd.systemd.show_status=auto" # Show systemd status during boot + ]; + + # ========== Filesystem Configuration ========== + athenix.host.filesystem.useSwap = lib.mkDefault false; + athenix.host.filesystem.device = lib.mkDefault "/dev/mmcblk0"; + athenix.host.buildMethods = lib.mkDefault [ "installer-iso" ]; + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + + # ========== Hardware Configuration ========== + hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; + + # ========== Software Profile ========== + athenix.sw.enable = lib.mkDefault true; + athenix.sw.type = lib.mkDefault "desktop"; +}