NixOS macht den Einstieg nicht eben leicht. Nach einer steilen Lernkurve wartet aber ein robustes und reproduzierbares Betriebssystem auf den Anwender.
Die seit rund 20 Jahren entwickelte und für Neueinsteiger zunächst sperrig wirkende NixOS basiert auf dem Paketmanager Nix. Sie macht mit ihrer deklarativen Herangehensweise bei Dateisystem und Systemverwaltung einiges anders. Dieser Ansatz erleichtert, hat man erst einmal die Einstiegshürden überwunden, sowohl die Systemkonfiguration als auch die Reproduzierbarkeit. Dieser Artikel versucht ein wenig Licht ins Dunkel zu bringen, kann aber nur einen Einstieg in das NixOS-Universum bieten. Weitergehende Informationen hält unter anderem das NixOS-Wiki bereit [1].
NixOS [2] rückt in letzter Zeit vermehrt in den Fokus von Anwendern, die sich für neue Entwicklungen bei Linux interessieren. Nicht, dass es neu wäre – im Gegenteil: Es verkörpert bereits seit Langem einige der Techniken, die gern als Pluspunkte bei den gerade überall gehypten Immutable-Systemen herausgestellt werden. So unterstützt es unter anderem atomare Updates und bietet eine Rollback-Funktion.
NixOS entstand aus dem Paketmanager Nix, den die beiden Niederländer Eelco Dolstra und Armijn Hemel im Rahmen eines universitären Forschungsprojekts erstellten. Dolstra strebte damit eine verbesserte Auslieferung und Installation von Software an [3]. Nix verwendet eine eigene Ordnerstruktur, in der es die Pakete installiert. Das ist auch der Hauptgrund, warum NixOS von dem bei den meisten Distributionen verwendeten Filesystem Hierarchy Standard (FHS) abweicht [4]. Der FHS bietet unter anderem die Struktur, in der die einzelnen Dateien eines Pakets bei dessen Installation abgelegt werden. Inwieweit Nix davon abweicht, sehen wir uns später noch genauer an.
Das Prinzip
Der deklarative Ansatz von NixOS, der das gesamte System in einer einzigen Konfigurationsdatei beschreibt, hat mehrere Vorteile. Zum einen ermöglicht er eine vollständige und reproduzierbare Konfiguration des Betriebssystems, die man unkompliziert versionieren und replizieren kann. Das macht es einfacher, das Betriebssystem auf verschiedenen Maschinen zu installieren und zu aktualisieren. Da die gesamte Konfiguration in einer einzigen Datei gespeichert ist, lässt sich das Betriebssystem in einer virtuellen Maschine oder einem Container ausführen, ohne dass es zu Konflikten mit anderen Systemen kommt. Auf diese Weise kann man problemlos neue Konfigurationen testen und Fehler beheben, bevor man sie auf produktiven Systemen einsetzt.
Deklarativ bedeutet in diesem Zusammenhang, dass die beiden Dateien configuration.nix und hardwareconfiguration.nix die komplette Konfiguration in allen Einzelheiten beschreiben. Als Nutzer editiert man die Datei configuration.nix, um das gewünschte Setup widerzuspiegeln.
Um beispielsweise eine bestehende NixOS-Installation auf eine andere reale oder virtuelle Maschine zu übertragen, installieren Sie NixOS auf der Wunschhardware und übertragen anschließend die Nix-Konfigurationsdatei configuration.nix auf die neue Instanz. Der Befehl sudo nixos-rebuild switch erledigt den Rest in wenigen Minuten. Sie erhalten nach dem Rebuild eine 2. Generation, die exakt der Installation auf dem ursprünglichen Host entspricht. Müssen Sie solche Aufgaben häufiger erledigen, versionieren Sie die Datei configuration.nix in einem Git-Repository, sodass Sie später jederzeit beliebige frühere Konfigurationen wiederherstellen können.
Darüber hinaus bietet der deklarative Ansatz eine hohe Flexibilität und Modularität. NixOS teilt die Konfiguration des Betriebssystems in kleinere, wiederverwendbare Einheiten auf, die man als Module bezeichnet. Jedes Modul beschreibt eine bestimmte Komponente oder Funktion des Betriebssystems, wie zum Beispiel den Netzwerk-Stack, den Webserver oder die Benutzerverwaltung. Durch die Kombination verschiedener Module lässt sich die Konfiguration des Betriebssystems anpassen und erweitern, ohne dazu Änderungen an der zugrunde liegenden Infrastruktur vornehmen zu müssen.
Installation
Aber genug der Theorie: Wie sieht die Installation in der Praxis aus? NixOS ist in den vergangenen Jahren wesentlich zugänglicher bei der Bereitstellung geworden. Damals gab es noch keine Installationsroutine, heute macht der seit NixOS 22.05 verfügbare, auf Calamares basierte Installer die Systemeinrichtung zum Kinderspiel.
Er erlaubt die Auswahl verschiedener Benutzeroberflächen wie Gnome, KDE Plasma, XFCE, Pantheon, Cinnamon, Mate, Enlightenment, LXQt und Budgie. Gegebenenfalls können Sie auch komplett auf eine Desktop-Umgebung verzichten. Der Installer erlaubt zudem die vollständige Verschlüsselung des Systems sowie die Entscheidung, ob unfreie Software genutzt werden soll (Abbildung 1).

Abbildung 1: Bereits im Installer legen Sie fest, ob Sie unfreie Software auf dem System nutzen möchten.
Doch zunächst benötigen Sie ein ISO-Image vom NixOS-Download-Portal [5]. Die Webseite bietet ganz oben den Paketmanager Nix zum Herunterladen an, darunter finden Sie die NixOS-Abbilder mit Gnome und KDE Plasma. Sie müssen sich lediglich entscheiden, ob Sie ein Image für x86 oder ARM benötigen.
Nach der Installation, die standardmäßig als Dateisystem Ext4 verwendet, booten Sie in ein System, das sich zunächst grafisch nicht von anderen Distributionen unterscheidet. Im Kern von NixOS befindet sich der bereits erwähnte Paketmanager Nix, der sich auch unter anderen Distributionen installieren lässt und mittlerweile über 80 000 Pakete bereitstellt. Er läuft auch unter MacOS oder dem Windows Subsystem for Linux (WSL2).
Neben den KDE-Plasma-Apps richtet der Installer als Anwendungen lediglich Firefox und das englischsprachige NixOS Manual ein. Damit kommt er Anwendern entgegen, die sich ihr System gern selbst zusammenstellen. Den NixOS-Neuling hindert es allerdings daran, gleich loszulegen, denn er muss zunächst lernen, wie er an die benötigte Software kommt. Dabei hilft das im Hauptmenü unter System zu findende NixOS Manual.
Erste Schritte
Wir entschieden uns im Test für eine Testinstallation mit dem Plasma-Desktop. Bei der Suche nach dem Paket Discover, mit dem man unter Plasma Software grafisch installiert, wurden wir nicht fündig: Es ist in NixOS standardmäßig nicht vorinstalliert. Also versuchen wir, das System auf der Konsole zu aktualisieren.
Dabei kommt der Begriff Channels ins Spiel. Das Konzept der Kanäle lässt sich am ehesten mit den aus anderen Distributionen bekannten Repositories vergleichen. Wenn Sie NixOS zum ersten Mal einrichten, verwendet es automatisch den NixOS-Channel, der der Version der Installationsquelle entspricht. Das war in unserem Fall NixOS 23.05. Welchen Kanal Sie abonniert haben, finden Sie mit dem Befehl sudo nix-channel --list heraus (Abbildung 2). Eine eigene, stets aktuelle Webseite [6] listet die verfügbaren Channels auf.

Abbildung 2: Die Channels bei NixOS entsprechen in etwa den Repositories bei anderen Distributionen. Standard ist im Moment der stabile Channel NixOS 23.05.
Die Standardinstallation abonniert automatisch den Stable Channel, der relativ konservativ mit Aktualisierungen umgeht. Wollen Sie auf möglichst aktuelle Software zugreifen, abonnieren Sie stattdessen den Unstable Channel. Daneben gibt es noch sogenannte Small Channels für Stable und Unstable, die weniger Software anbieten als die regulären Kanäle. Sie eignen sich eher für Server-Installationen, die keine grafischen Anwendungen benötigen.
Um nun etwa in den Unstable-Kanal zu wechseln und das System anschließend darüber zu aktualisieren, führen Sie die Kommandos aus Listing 1 aus. Der Weg zurück ist so lange möglich, wie es keine neue NixOS-Version gibt – in unserem Fall also, so lange NixOS 23.05 aktuell bleibt. Beim Wechsel eines Kanals baut das System zunächst alle Pakete neu, aktiviert nach dem Anhalten der Dienste die neue Konfiguration und fährt zu guter Letzt die Services wieder hoch.
Listing 1
Unstable-Kanal
$ sudo nix-channel --add https://channels.nixos.org/nixos-unstable nixos $ sudo nixos-rebuild switch upgrade
Die Aktualisierung des jeweils abonnierten Kanals lässt sich auch automatisieren. Dazu öffnen Sie mit administrativen Rechten die Konfigurationsdatei von NixOS in einem Texteditor. Dann fügen Sie am Dateiende, aber vor der abschließenden geschweiften Klammer, die Zeilen aus Listing 2 ein. Steht auch die zweite Zeile auf true, startet das System nach dem Upgrade komplett neu, sofern ein neuer Kernel installiert wurde. Wann die nächste automatische Aktualisierung angestoßen wird, erfahren Sie mit dem Kommando systemctl list-timers.
Listing 2
Kanalaktualisierung
system.autoUpgrade.enable = true; system.autoUpgrade.allowReboot = true;
Bessere Übersicht
Generell kann man theoretisch alle Änderungen in die globale Konfigurationsdatei configuration.nix schreiben. Der besseren Übersicht wegen ist es jedoch sinnvoller, umfangreiche Konfigurationen auf mehrere Dateien zu verteilen, sie in der configuration.nix unter import= einzubinden und von dort zu laden. So können Sie etwa die systemweit zu installierenden Pakete in eine Datei wie packages.nix schreiben, die Sie dann in die configuration.nix einbinden. In einer Datei users.nix tragen Sie die Benutzer des Systems sowie die jeweils nur für den jeweiligen User verfügbaren Pakete ein.
Anschließend geht es an die Ausgestaltung des Systems mit den bevorzugten Anwendungen. In unserem Beispiel sollen das die Versionsverwaltung Git, der Screenshooter Flameshot und CopyQ für eine vernünftige Handhabung der Zwischenablage sein. Zunächst sehen Sie im Paketverzeichnis nach, ob die Anwendungen für NixOS vorliegen [7]. Wie nicht anders zu erwarten, ist das der Fall. Sobald Sie unter der Ausgabe zum gesuchten Paket auf show package details klicken, sehen Sie, dass es drei verschiedene Wege gibt, Pakete unter NixOS zu installieren. Der Standard steht auf nix-shell. Damit installieren Sie ein Paket nur für die laufende Terminalsitzung, was sehr praktisch sein kann (Abbildung 3). Sobald Sie die Konsole schließen, ist auch das Paket weg.

Abbildung 3: Die Installation über den Befehl nix-shell stellt ein Paket nur temporär bereit. So können Sie es beispielsweise ohne weitere Nachwirkungen testen.
Besser deklarativ
Die beiden anderen Installationswege über nix-env und NixOS Configuration installieren Pakete permanent, unterscheiden sich jedoch in der Methodik. Dabei unterscheidet man zwischen einer Ad-hoc-Installation und einer deklarativen Installation. Die Ad-hoc-Installation bedient sich des Befehls nix-env, der die Pakete einrichtet und mit dem Suchpfad ($PATH) verknüpft. Bei der deklarativen Methode schreiben Sie die zu installierenden Pakete in die Datei configuration.nix.
Bei der Ad-hoc-Methode nutzen Sie den Befehl, den die Paketsuche bei Auswahl der Installationsmethode nix-env vorgibt. In Beispiel aus Abbildung 4 lautet er sudo nix-env iA nixos.flameshot. Die Installation dauert nur einen Wimpernschlag, danach ist das Paket permanent verfügbar. Das Kommando sudo nix-env -e nixos.flameshot entfernt das Paket wieder.

Abbildung 4: Die Paketinstallation per nix-env installiert Pakete so, wie Sie das von anderen Distributionen kennen. Der Unterschied: Alle Bestandteile landen in einem Verzeichnis.
Diese Methode ist zwar einfach, aber die am wenigsten empfohlene. An erster Stelle steht der deklarative Ansatz, der die Vorteile von NixOS umsetzt. Dazu gehört unter anderem die Reproduzierbarkeit inklusive der installierten Pakete. Eine nicht zu unterschätzende Eigenschaft des Nix-Paketmanagers, die sich in anderen Distributionen meist schwer umzusetzen lässt, ist der jedem Softwarepaket zugeordnete eindeutige Hash: Er wird in den Installationspfad aufgenommen und ermöglicht, mehrere Versionen einer Software nebeneinander zu installieren.
Gehen Sie also besser den NixOS-Weg und schreiben Sie die zu installierenden Pakete in die Datei configuration.nix (Abbildung 5). Dazu öffnen Sie diese mit administrativen Rechten in einem Texteditor und suchen die Zeile, die mit environment.systemPackages beginnt. Dort tragen wir die gewünschten Pakete ein (Abbildung 6). Die korrekte Bezeichnung der Pakete entnehmen Sie der Paketsuche. Wenn Sie sich diesen Umweg sparen möchten, geben Sie einfach den Namen der Anwendung an. Nix sucht dann die korrekte Bezeichnung des Pakets, was etwas dauert. Nach dem Speichern der Datei aktualisieren Sie das System mit sudo nixos-rebuild switch. Möchten Sie zunächst einen Testlauf machen, ersetzen Sie switch durch test.

Abbildung 5: Am Anfang der Datei configuration.nix lassen sich weitere, vom Anwender erstellte Konfigurationsdateien einbinden. Standardmäßig wird dort nur die Hardwarekonfiguration geladen.

Abbildung 6: Hier eingetragene, systemweit zu installierende Pakete werden bei einem Umzug der configuration.nix auf ein anderes System wieder installiert.
Bei einem Neustart haben Sie nun die Wahl zwischen Generation 1 ohne die soeben installierten Pakete und der entsprechend erweiterten Generation 2 (Abbildung 7). Bei jeder Rebuild-Aktion entsteht eine weitere Generation, von der Sie booten können. Der Befehl rebuild kann aber noch viel mehr, wie das NixOS-Wiki beschreibt. So lässt sich mit sudo nixos-rebuild build-vm aus der Datei configuration.nix eine virtuelle Maschine mit einem exakten Abbild Ihrer Installation erstellen [8].

Abbildung 7: Änderungen erzeugen neue Generationen, die grob den von Btrfs bekannten Snapshots entsprechen und sich beim Neustart in Grub auswählen lassen.
Um das Verzeichnis /nix/store/ sauber zu halten, das alle installierten Pakete enthält, sollten Sie es regelmäßig bereinigen (Listing 3, erste Zeile). Das können Sie nach einem einmaligen manuellen Anstoßen über die Direktive nix.optimise.automatic = true; in der Konfiguration auch automatisieren. Zusätzlich schadet es nicht, ab und zu alte Versionen via Garbage Collection zu entsorgen (zweite Zeile).
Listing 3
Store bereinigen
$ nix-store --optimise $ sudo nix-collect-garbage --delete-older-than 30d
Home Manager
Der Home Manager bietet im Zusammenspiel mit dem Nix-Paketmanager einen alternativen Weg, die Benutzerkonten und die Systemumgebung zu verwalten. Über den Home Manager, der sich eher an erfahrene Anwender richtet, können Sie Software deklarativ in Benutzerprofilen installieren, anstatt nix-env zu verwenden. Des Weiteren können Sie damit versteckte Dateien (die sogenannten Dotfiles) im Home-Verzeichnis der Benutzer verwalten und über mehrere Installationen und Rechner identisch halten [9].
Aus Platzgründen haben wir den Paketmanager Nix (Abbildung 8) hier geradezu sträflich vernachlässigt. Nix [10] installiert, sofern vorhanden, vorbereitete Pakete oder kompiliert die Software samt der nötigen Abhängigkeiten. Wie bereits erwähnt, ist er nicht an NixOS gebunden. Auch eine weitere bahnbrechende, mit Nix 2.4 eingeführte Entwicklung ist hier zu kurz gekommen: Es geht um die optionalen Nix Flakes [11]. Diese leistungsstarke Methode zum Verwalten von Nix-Paketen bietet eine weitere einfache und flexible Möglichkeit der Konfiguration und Bereitstellung.

Abbildung 8: Der Paketmanager Nix kann auf über 80 000 Pakete zurückgreifen, die er in mehreren Kanälen organisiert. Auf der Webseite http://search.nixos.org sehen Sie bei Bedarf auch den Quellcode von Paketen ein.
Fazit
Wenn Sie die Zeit investieren, die anfänglich steile Lernkurve von NixOS zu absolvieren, winkt als Belohnung ein ideales, leicht reproduzierbares System, an dem Sie lange Spaß haben werden: Es ist nicht leicht, das robuste NixOS irreparabel zu zerstören. Haben Sie das Prinzip erst einmal verstanden und das System individuell eingerichtet, unterscheidet sich die Handhabung kaum von der anderer Distributionen.
Bei innovativen Systemen wie NixOS spielt gute Dokumentation eine entscheidende Rolle. Eben hier liegt einer der Schwachpunkte der Distribution. Zwar gibt es reichlich offizielle und inoffizielle Dokumentation, der es allerdings an Organisation mangelt. Sie verstreut sich über verschiedene Stellen und widerspricht sich gelegentlich. Daher tun sich gerade Einsteiger damit schwer.
Recht neu ist das kostenlose E-Book “NixOS & Flakes” [12], das wir Ihnen für den Einstieg nur wärmstens ans Herz legen können. Es liegt allerdings nur in Englisch (und Chinesisch) vor. Ähnliches gilt für das Blog [13] des österreichischen NixOS-Einsteigers Karl Voit, das wertvolle Tipps bereithält. (jlu)
Infos
-
NixOS-Wiki: https://nixos.wiki
-
NixOS: https://nixos.org
-
FHS: https://de.wikipedia.org/wiki/Filesystem_Hierarchy_Standard
-
Download: https://nixos.org/download.html
-
Channels: https://channels.nixos.org
-
VM bauen: https://nixos.wiki/wiki/NixOS:nixos-rebuild_build-vm
-
Home Manager: https://github.com/nix-community/home-manager
-
Nix Package Manager: https://itsfoss.com/ubuntu-install-nix-package-manager/
-
NixOS Flakes: https://nixos.wiki/wiki/Flakes
-
E-Book “NixOS & Flakes”: https://nixos-and-flakes.thiscute.world





