Einleitung
Ab der nächsten Lesson editierst du NixOS-Module. Dafür brauchst du
zwei Bilder: Was macht NixOS anders als „apt und Config-Dateien von
Hand“? Und wie liest man die Sprache Nix grob, die in
groupdir-infra überall vorkommt?
Primärquellen: How Nix Works und nix.dev: Nix language.
NixOS vs. gängiges Linux
Auf einem typischen Server änderst du laufend Zustand: Pakete
installieren, Dateien unter /etc editieren, Dienste
neu starten. Zwei Maschinen „gleich“ zu halten ist Arbeit; Config
Drift entsteht leicht.
Unter NixOS ist das gesamte System (Kernel, Pakete, viele Configs, Dienste) das Ergebnis einer deklarativen Beschreibung. Du beschreibst den gewünschten Endzustand; Nix baut daraus eine Systemkonfiguration. Siehe How does NixOS work?.
Besonderheiten (Merkliste)
- Deklarativ: Die Config sagt, was gelten soll, nicht eine lange Liste imperativer Schritte.
-
Reproduzierbar: Dieselbe Beschreibung (plus
gepinnte Inputs wie in einem Flake) zielt auf dasselbe System. Was
an einer Stelle baut und läuft, lässt sich an anderer Stelle
nachbauen (mutable State unter
/varausgenommen). - Kein klassischer Config-Drift: Der gewünschte Zustand steht im Repo. Abweichungen „mal schnell auf dem Host editiert“ sind der Anti-Pattern; der nächste Deploy setzt die Deklaration wieder durch.
- Atomare Updates: Ein Wechsel der Generation ist atomar. Es gibt kein längeres Fenster mit halb alter, halb neuer Systemdatei. Bei Unterbrechung landet das System in einem konsistenten alten oder neuen Zustand.
- Rollback: Alte Generationen bleiben erreichbar (Boot-Menü / Rollback). Fehlgeschlagene Änderungen sind zurücknehmbar, statt „Server mit Schraubenzieher retten“.
-
Store statt globales /usr: Pakete liegen unter
/nix/store/…-namemit Hash der Build-Eingaben. Mehrere Versionen können koexistieren; Upgrades überschreiben fremde Abhängigkeiten nicht.
In groupdir-infra heißt „System anwenden“ im Alltag
typischerweise Colmena
(Lesson 0007).
Lokal prüfst du mit nix build
(Lesson 0000,
an Modulen in
Lesson 0006).
Nix-Sprache: nur das Nötigste
Nix ist eine funktionale Sprache für Build- und Systembeschreibungen. Zum Lesen im Repo reichen wenige Bausteine (Details: nix.dev Tutorial):
# Kommentar
"string" # Zeichenkette
true # Bool
42 # Zahl
[ "a" "b" ] # Liste
{ # Attrset: Namen → Werte
name = "lab-gateway";
enable = true;
}
# Verschachtelt (wie labEdge.* in Host-Configs):
{
labEdge.ssh.permitRootLogin = "prohibit-password";
}
Am Anfang vieler Modul-Dateien steht etwas wie
{ config, lib, ... }: { … }.
Das ist eine Funktion: links die Argumente (u. a.
config, lib), rechts das Ergebnis, meist
ein Attrset mit options und config.
Wie du selbst Optionen deklarierst, kommt in
Lesson 0006.
Brücke zu groupdir-infra
Üben
Retrieval
Was beschreibt NixOS im Kern?
Was bedeutet „atomare Updates“ hier?
Was ist ein Attrset in Nix?
Primärquelle
How Nix Works (Abschnitte zu NixOS, atomic upgrades, reproducible configs) und Nix language.
Kompakt: Referenz: Nix und NixOS.