NixOS Teil 1 - Ein deklaratives Betriebssystem

Fr, 12. November 2021, @65536@troet.cafe

NixOS ist eine Linuxdistribution, die viele Dinge bei der Systemverwaltung anders handhabt als die meisten anderen Distributionen. Wie es funktioniert und weshalb es anders gemacht wird, darum soll es in dieser Artikelserie gehen.
Im ersten Teil wird es einen Überblick über die Ideen, die hinter NixOS stehen, geben. Im zweiten werden die Installation und grundlegende Konfiguration behandelt, und der dritte Teil befasst sich mit Details der Softwareverwaltung. Im vierten Teil folgen ein paar Empfehlungen und sonstige Details.

Imperativ

Klassischerweise wird Linux zu grossen Teilen imperativ verwaltet. Das bedeutet, einzelne Befehle werden nacheinander angewandt, um das System Schritt für Schritt in den gewünschten Zustand zu bringen. NixOS erlaubt zwar diesen imperativen Ansatz, versucht jedoch, soweit irgend möglich, stattdessen deklaratives Verwalten anzubieten.

Der Grund dafür ist die mangelnde Reproduzierbarkeit beim imperativen Ansatz. Zwei Instanzen eines Betriebssystems unterscheiden sich in der Regel, weil sie unterschiedliche Vergangenheiten haben. Vielleicht wurde auf einem System eine Software getestet, auf dem anderen jedoch nicht. Auch nach Deinstallation hinterliess es Spuren auf dem ersten. Vielleicht wurde Software in unterschiedlichen Abständen aktualisiert, oder in unterschiedlichen Versionen erstmals installiert, weshalb kleine Unterschiede auftreten.

Selbst wenn man sich bemüht, mehrere Betriebssysteminstanzen immer gleich zu verwalten, werden sich durch kleine Zufälle und Versehen die Unterschiede anhäufen, bis auf einem System ein Befehl gelingt und auf dem anderen scheitert, und man sich fragt, warum.

Deklarativ

NixOS wurde konzipiert in der Bemühung, möglichst viele Dinge deklarativ konfigurieren zu können, sodass lange Zeit zurückliegende imperative Befehle keinen Einfluss darauf haben, was man jetzt erreichen will. Hierzu wird eine in /etc/nixos/ abgelegte Datei configuration.nix bearbeitet. In der nix-eigenen Syntax lassen sich die gewünschten Pakete angeben, zahlreiche Optionen von der Zeitzone über automatische Updates bis hin zu Benutzereinstellungen deklarieren und bei Bedarf weitere Konfigurationsdateien mit mehr Details einbinden.

Mit einem einzigen Befehl kann dann - nach jeder Änderung der Konfigurationsdatei - diese auf das komplette System angewandt werden, wahlweise bei Neustart oder - soweit ohne diesen möglich - sofort. Jede solche Neukonfiguration sowie jedes Systemupdate erzeugt einen neuen Booteintrag, was bei Problemen und Fehlkonfigurationen Rollbacks sehr leicht macht.

Anstatt sein System mit Einzelbefehlen kontinuierlich umzuformen, hat man nun eine Datei als Bauanleitung, die knapp und deutlich definiert, wie das System auszusehen hat.

Reproduzierbar

Ein resultierender grosser Vorteil ist die Reproduzierbarkeit. Stattet man mehrere Rechner mit derselben Konfiguration aus, so gilt diese für alle. Andernfalls müssten eine ganze Reihe an Befehlen zum Einrichten eines Programms oder zum Setzen bestimmter Einstellungen auf sämtlichen Rechnern jeweils identisch durchgeführt werden, was wesentlich fehleranfälliger ist.

Auch für einzeln zu verwaltende Rechner ist die Reproduzierbarkeit nützlich. Um sein System wiederherzustellen oder um einen neuen Rechner einzurichten, braucht es weder ein vollständiges Backup der Festplatte noch eine Liste aller bislang vorgenommenen Installationen von Software. Das Sichern und Einfügen der Konfigurationsdatei reicht, was Speicherplatz im Backup und Zeit bei der Einrichtung spart.

Lediglich die hardwarespezifischen Konfigurationsteile könnten eine Änderung benötigen.

Funktional

Damit die Konfiguration wirklich reproduzierbar angewandt werden kann, muss ein funktionaler Paketmanager eingesetzt werden. Dieser wird Nix genannt. Um zu garantieren, dass das Installieren eines Paketes überall dasselbe Resultat bewirkt, werden alle Abhängigkeiten unabhängig von bereits installierter Software berechnet und alles unter /nix/store/ installiert, in einem Ordner mit einem Hashwert als Präfix. Der Hashwert ändert sich, wenn das Paket in irgendeiner Weise anders erstellt und installiert wird, im einfachsten Fall bei einer Versionsänderung. Nix ist rein funktional: die Installation desselben Paketes in derselben Version resultiert immer in einem identischen Eintrag im Nix-Store, unabhängig von jeder Eigenschaft der NixOS-Instanz.

Unkonventionell

All diese Eigenschaften zu haben, bedeutet für NixOS, in einigen Dingen ungewöhnliche Wege gehen zu müssen. Insbesondere sind zahlreiche Ordner und Dateien nicht dort, wo sie üblicherweise zu erwarten sind, sondern sind Verknüpfungen auf den Nix-Store. Die Tatsache, dass zum Systemstart lediglich /nix/ und /boot/ zwingend nötig sind, erlaubt auch interessante Ansätze, um Systemzustand noch weiter zu verringern.

Wie oben erwähnt soll im weiteren Verlauf der Artikelserie konkreter auf die Handhabung von NixOS eingegangen werden. Von all den Möglichkeiten und Werkzeugen wird allerdings nur an der Oberfläche gekratzt werden, um Interessierten den Einstieg in NixOS zu erleichtern.

Links

https://nixos.org/
https://nixos.wiki/