Files
nixfiles/docs/misc/installer.md
T
jackos1998 05918ec2ce
Installer / Build installer (push) Has been cancelled
CI / Check, build and cache nixfiles (push) Has been cancelled
Update docs / update (push) Has been cancelled
nixos/installer: Refresh against upstream
The ISO target had drifted from nixpkgs and no longer evaluated:
`iso-image.nix` now defines `image.baseName` itself, which conflicts
with ours, so force it.

Drop the `boot.initrd.systemd.enable = false` override from the
`asISO` build target. The missing `/dev/root` it worked around is no
longer an issue, and scripted initrd is deprecated for removal in
26.11.

Replace the wpa_supplicant stanza, which upstream's
`installation-device.nix` no longer carries, with NetworkManager.
Keep it out of `multi-user.target` so nothing network-related starts
until asked; NetworkManager enables wpa_supplicant as its backend,
which is D-Bus activated on demand.

Pick up three more bits from that profile: the installer
`variant_id`, the pstore drop-in that stops an install evacuating the
target's persistent entries, and the mdadm `PROGRAM` stub that
silences the unset-mail warning.

Built and booted as an ISO to confirm.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 22:45:28 +01:00

2.3 KiB

installer

The custom NixOS installer image used to bootstrap new boxes.

Role

  • Defines nixos.systems.installer, a minimal server system rendered as a bootable ISO via config.my.buildAs.iso (my.asISO); the same base can also be built as a kexec or netboot tree.
  • Build it with the devshell commands: build-iso installer (or build-kexec installer / build-netboot installer). The update-installer command force-tags installer to trigger a release rebuild in CI.

Image contents

  • Broad hardware support (my.build.allHardware pulls in the nixpkgs all-hardware profile); EFI- and USB-bootable, zstd-compressed squashfs. Volume ID jackos-<release>-<arch>, menu label "/dev/player0 Installer", image base name jackos-installer.
  • Root SSH with the deploy key authorized (PermitRootLogin prohibit-password); a random installer-<hex> hostname is set at boot.
  • INSTALL_ROOT=/mnt in the session environment, plus a show-hw-config alias wrapping nixos-generate-config --show-hardware-config --root $INSTALL_ROOT.
  • NixOS documentation enabled, NetworkManager available but not started at boot (run systemctl start NetworkManager, then nmtui), GC and memory-overcommit tuning for low-memory targets, LVM thin and NFS support.
  • Identifies itself as VARIANT_ID=installer in /etc/os-release, and leaves the target's persistent pstore entries alone (Unlink=no) so an install doesn't evacuate them.
  • No regular user (my.user.enable = false), no tmpfs-root management, no NAT, and not a deploy target (my.deploy.enable = false).

Installing a box

The devshell's installer commands (devshell/install.nix) drive an install over SSH against a booted installer reachable at $INSTALLER:

  • installer-shell — get a shell on the installer.
  • do-install <system> — builds the system's toplevel, nix copys the closure to the installer's $INSTALL_ROOT remote store, sets the system profile, touches /etc/NIXOS, and runs switch-to-configuration boot with NIXOS_INSTALL_BOOTLOADER=1 (skip the bootloader with --no-bootloader, skip substitution with --no-substitute).