# This module defines a systemd service that automatically installs NixOS to the disk. # It is intended to be used in an installation ISO. # It expects `targetSystem` (the closure to install), `diskoScript` (the partitioning script), # and `closureExport` (the pre-built NAR archive) to be passed as arguments. { config, lib, pkgs, inputs, hostName, hostPlatform, targetSystem, diskoScript, closureExport, ... }: { # Ensure the entire system closure and all dependencies are included in the ISO environment.systemPackages = [ pkgs.git pkgs.bashInteractive pkgs.curl targetSystem ]; # Explicitly include the pre-built closure export and system in the ISO image isoImage.contents = [ { source = closureExport; target = "/closure-export"; } { source = targetSystem; target = "/system"; } ]; nixpkgs.hostPlatform = hostPlatform; systemd.services.auto-install = { description = "Automatic NixOS install for ${hostName}"; after = [ "network-online.target" "systemd-udev-settle.service" ]; wants = [ "network-online.target" ]; wantedBy = [ "multi-user.target" ]; serviceConfig = { Type = "oneshot"; StandardOutput = "journal+console"; StandardError = "journal+console"; Environment = "PATH=/run/current-system/sw/bin"; }; script = '' echo "=== AUTO INSTALL START for ${hostName} ===" echo ">>> Running disko script..." ${diskoScript} echo ">>> Importing pre-built closure into target store..." # Import the closure that was exported at build time ${pkgs.nix}/bin/nix-store --store /mnt --import < /closure-export/closure.nar > /dev/null echo ">>> Running nixos-install..." # Install with pre-built closure already imported (no evaluation or fetching needed) ${pkgs.nix}/bin/nixos-install \ --no-root-passwd \ --root /mnt \ --system ${targetSystem} \ --option substitute false echo ">>> Done. Rebooting." systemctl reboot ''; }; }