Welche Ressourcen gibt es, um sich über Nix zu informieren?

Der Zugang zum Nix-Ökosystem ist nicht unbedingt einfach. Henrik Lissner bringt die vielen Fallstricke und Hürden wunderbar auf den Punkt, wenn er sich vehement gegen die Nutzung von NixOS ausspricht. Schwer zu lernen, oberflächliche Dokumentation, unintuitive Sprache, zu viel Aufwand wenn es nur um die Verwaltung weniger Systeme geht - alles Erfahrungen, die ich in den letzten Wochen auch gemacht habe.

Diese Situation ist gerade deshalb frustrierend, weil sich Nix in aktiver Entwicklung befindet. Es ist zum Teil nicht immer leicht zu erkennen, ob Ausführungen überholten Prinzipien folgen oder Code-Listings veraltet sind. Das offenkundigste Beispiel dafür ist der Bruch, den die Einführung von Flakes bedeutete. Kanäle (channels) haben damit ihre Bedeutung verloren. Einige Kommandozeilen-Werkzeuge wurden im Wesentlichen durch andere ersetzt, die ähnlichen Zwecken dienen. Für einen Überlick über Änderungen, siehe einen Abschnitt im NixOS & Flakes Book.

Man muss also wirklich wollen. Ich will, und deshalb habe ich – primär für mich for future reference – in kommentierter Form all die Quellen zusammengetragen, die mir bisher geholfen haben, Nix und NixOS zumindest ein bisschen besser zu verstehen. Vielleicht hilft der Überblick auch anderen Einsteigern.

Ian Henry hat 2021 eine Artikel-Serie veröffentlicht, die mir völlig von der Seele spricht. Ich glaube wenn ich ein besserer Autor wäre, würde dieser Beitrag so ziemlich jeden Absatz daraus reproduzieren.

Die offizielle Webseite und Dokumentation

Die offizielle Webseite vom NixOS-Projekt gibt einen guten Überblick darüber, wie Nix funktioniert und was den Paketmanager gegenüber ähnlichen Systemen auszeichnet. Dadurch lernt man zwar, warum es gute Gründe dafür gibt, Nix und NixOS zu lernen und professionell oder privat einzusetzen. Klare Richtungsangaben für den weiteren Lernprozess sucht man aber leider vergebens.

Zugegeben, es gibt da die offizielle Dokumentation, sogar mit Tutorial und First Steps-Anleitung. Doch ich muss gestehen, dass ich es zum Einstieg eher entmutigend fand. Viele Neulinge wollen vielleicht einfach erstmal ihren Daily Driver mit VS Code und Firefox einrichten. Docker, virtuelle Maschinen, Terraform und Raspberry Pis haben zweifelos ihren Platz, aber suchen die meisten nicht zunächst etwas Bodenständigeres?

Deutlich hilfreicher ist das offizielle Bedienungshandbuch (reference manual). Die Einträge zum Nix-Paketmanager, zu NixOS, zum Nixpkgs-Repo und zur Nix-Sprache sind hervorragend, um erste Grundkenntnisse zu vertiefen. Wie so oft bei Software-Dokumentationen wird ein Wissen über Grundbegriffe und Zwecke aber leider vorausgesetzt, um sich in den umfassenden Dokumenten zurechtzufinden.

Literatur

Ich weiß nicht, wie es anderen geht, aber mir persönlich fällt es schwer, das notwendige Grundverständnis der zugrundeliegenden Konzepte und Ansätze zu erwerben. Für gewöhnlich mag ich zum Einstieg in ein neues Thema die systematischen Darstellungen, wie Einführungsbücher sie geben. Mich überrascht, dass es trotz zunehmender Popularität (noch immer) keine Literatur dieser Art zu Nix und NixOS zu geben scheint. Nicht nur keine gute; Wissen scheint prinzipiell allein über Blog-Posts, Dokumentationen und Mouth-to-Mouth weitergegeben zu werden.

Die vielleicht beste Grundlage bietet The Purely Functional Deployment Model, einer 2006 von Eelco Dolstra verteidigten Dissertation. Die Arbeit präsentiert die Ergebnisse eines 2003 begonnenen Forschungsprojekts, das in NixOS resultierte.

Es liegt in der Natur der Sache, dass sich viele Kapitel und Abschnitte an ein spezialisiertes Fachpublikum richten. Dennoch gibt insbesondere das Einleitungskapitel eine nicht allzu technische Erklärung vieler Grundideen des funktionalen Ansatzes. Vereinfachte Beispiele illustrieren, wie Pakete und Build-Vorgänge durch Nix-Ausdrücke beschrieben werden können.

Die Nix-Sprache ist vergleichsweise einfach aufgebaut. Wer sich für Computersprachen interessiert, findet einen erfrischend praktisch orientierte Darstellung ihrer Syntax und Semantik. Sie abstrahiert von Details über ihre konkrete Implementierung und ist deshalb denke ich bereits mit soliden Grundkenntnissen theoretischer Informatik zugänglich.

Auf Tweag gibt Dolstra eine sehr gute Einführung in die fast schon revolutionäre Idee von Flakes. Die dreiteilige Artikelserie motiviert zunächst die neue Herangehensweise gegenüber der traditionellen Nutzung von Kanälen und zeigt die damit verbundenen Vorteile auf. Die weiteren Ausführungen gehen dann auf präzise Weise auf viele Details ein, die bei den knappen Darstellungen anderer Seiten keine Erwähnung finden.

Blogs und andere Community-Beiträge

Das inoffizielle NixOS-Wiki gehört zu den leserlicheren Ressourcen, um sein Verständnis zu zentralen Themen zu vertiefen. Leider ist es nicht so umfassend und regelmäßig gewartet, wie man vielleicht erwarten oder hoffen würde. Zwischen dem traditionellen Ansatz und einer Flakes-orientierten Herangehensweise wird nicht strikt unterschieden (wie etwa der Artikel über den Nix-Paketmanager demonstriert).

Ich habe oben bereits kurz das NixOS & Flakes Book von Ryan Yin angesprochen. Dabei handelt es sich um einen Einstieg in die Verwendung von NixOS und der Systemkonfiguration mit Flakes. Ich finde das “Buch” gerade hilfreich, um Flake Flake Inputs und die verschiedenen Arten von Flake Outputs zu verstehen. Wer bereits weiß, was die Nixpkgs-Collection ist, findet auf der Seite auch Erklärungen für eine fortgeschrittene Interaktion mit dem Repo.

Für mich neu war, dass Flakes nicht nur Systemkonfigurationen ausgeben können. Sie können so aufgebaut werden, dass bestimmte Versionen von Anwendungen mit bestimmten Versionen ihrer Dependencies ausgeführt werden können. Besonders faszinierend finde die Erklärung von Entwicklungsumgebungen und der intendierten Logik dabei. Zur Interaktion mit den erstellten Flakes dient ein neues Kommandozeileninterface.

Einen ähnlichen Zweck verfolgt Rohit Goswamis “A Tutorial Introduction to Nix”. Der Artikel erklärt, wie Pythons virtuelle Umgebungen durch Nix’ mkShell ersetzt werden können. Der Artikel folgte auf einen Fachkongress (CarpentryCon@Home 2020), der von einer renommierten Bildungseinrichtung veranstaltet wird. Das spiegelt sich in der Qualität der Veröffentlichung.

Nix-Konfigurationen und Paket-Definitionen werden in der Nix-Programmiersprache geschrieben. Ein gutes Verständnis der Sprache ist deshalb für alle Zwecke unabdingbar. Yin nennt drei Seiten, mit deren Hilfe man sich in gut zwei Stunden up-to-speed bringen kann. Die Seiten sind Nix Language Basics (die offizielle NixOS-Dokumentation), Nix: A One Pager und der umfassende Eintrag im NixOS-Bedienungshandbuch. Empfehlenswert finde ich die Auswahl vor allem deshalb, weil sie verschiedene Aspekte der Sprache hervorheben und das überschaubare Material auf verschiedene Weisen strukturieren.

Die sogenannten Nix Pills bilden eine Serie von Blog-Posts, die Luca Bruno 2014 und 2015 geschrieben hat und die später nochmal in leichter zugänglicher Form wiederveröffentlicht wurden. Sie richtet sich primär an Leute, die selbst auf aktive Weise zu Nix beitragen wollen. Gerade die späteren Artikel sind nicht unbedingt die leichteste Kost, aber wie der Name nahelegt, bekommt man sie in kleinen Happen serviert. Sehr gut, um sich ein Hintergrundwissen zu den Abläufen und zu Ideen wie den wichtigen Derivations anzueignen.

Einen ähnlichen Zweck verfolgt Justin Woo mit seinen Nix-Shorts. Die Anzahl von Artikeln in der Serie ist überschaubar und die thematisierten Fragestellungen dürften für Anfänger von keinem unmittelbaren Interesse sein. Doch sie sind kurz, klar und betreffen Dinge, die später wahrscheinlich wichtig werden.

Pakete und Optionen

Die Namensgebung populärer Anwendungen folgt generell einem intuitiven Schema. Das Paket für Neovim heißt neovim, das Paket für Firefox heißt firefox, das Paket für Emacs heißt emacs, you get the idea. Dennoch wird man sich häufig fragen, unter welchem Namen man ein bekanntes Paket in Nix findet. Dazu gibt es auf der offiziellen Seite eine Suchmaschine. Über einen weiteren Tab kann man auch nach Namen und Erklärungen der vielen Optionen suchen, die bei der NixOS-Konfiguration zur Verfügung stehen. Für die Optionen, die im Kontext von Flakes verwendet werden können, gibt es einen eigenen Tab.

Vorlagen und Beispiele

Cole Mickens präsentiert eine Minimalkonfiguration für NixOS. Im Wesentlichen werden nur flake.nix und configuration.nix verwendet. In der README werden einige hilfreiche Erklärungen über die Verwendung von Flakes gegeben. Die vorangestellten Warnungen erscheinen mir aber eher ein wenig kryptisch.

Einem ähnlichen Zweck dient die Nix Starter Config. In der Standard-Version erhöht sie den Komplexitätsgrad dadurch, dass der Home-Manager eingebunden und Overlays verwendet werden. In der README werden ausgewählte Aspekte ausgiebig erklärt und einige Vorschläge gemacht, wie man sie weiter ausbauen könnte.

Ein weiteres Starter-Pack hat LGUG2Z speziell für WSL (dem Windows Subsystem for Linux) zusammengestellt. Anders als das Beispiel von Misterio77 werden dabei richtige Anwendungen eingebunden, insbesondere eine durch LunarVim vorkonfigurierte Version von Neovim. Das Projekt wird von Jeezy in einem Video erläutert. In einem anderen Video wird die Konfiguration ausgeweitet, um zugleich (lokal) für WSL und (remote) für NixOS in einer Hetzner-Cloud genutzt werden zu können. Sehr illustrativ, um einen Eindruck davon zu gewinnen, welche Rolle Abstraktionen bei Nix spielen.

Digga nennt sich eine NixOS-Konfiguration, die von vielen weitaus fortgeschritteneren Techniken Gebrauch macht. Alles andere als einsteigerfreundlich, doch ein großer Schritt in Richtung wahres Leben (eines qualifiizierten Nix-Nutzers). Die Anmerkungen sind hilfreich, aber leider wieder nicht sehr umfangreich.

Der Home-Manager wird genutzt, um Dotfiles auf eine ähnliche Weise mit Nix zu verwalten wie das Kernsystem. Es versteht sich, dass sich der Komplexitätsgrad dadurch nochmal deutlich erhöht, gerade in Bezug auf umfassend konfigurierbare Anwendungen wie Neovim, Emacs oder ein Fenster-Manager.

Im NixOS & Flakes Book wird erläutert, wie ein System mit i3 konfiguriert werden kann. Dabei kommen Funktionen aus der lib-Standardbibliothek zur Anwendung und der modulare Aufbau spiegelt sich in einer komplexen Verzeichnisstruktur. Die verwendeten Techniken und Operationen werden sicher nicht in allen Details motiviert, aber trotzdem eine sehr gute Vorlage, wenn man selbst i3 oder eine vergleichbare Anwendung verwenden möchte.

Matúš Beňko erklärt in einem kürzlich veröffentlichten Blog-Post, wie ein Flake für Neovim erstellt werden kann. Von Interesse ist die Konfiguration vor allem deshalb, weil sie auch auf die Verwaltung von Plugins eingeht. Nebenbei wird auch gezeigt, wie man ausführbare Flakes erstellt. Flakes dieser Art repräsentieren in jeder Hinsicht bestimmte Versionen eines Software-Pakets und können in dieser Form an andere Nix-Nutzer weitergegeben werden.

Eine Konfiguration von LibrePhoenix zeigt, wie verschiedene Profile (Persönlich, Arbeit, WSL, Homelab) in einer Konfiguration integriert werden können. Er verwendet Emacs und Stylix, ein Modul, mit dem ein einheitliches Farbschema für verschiedene Anwendungen und Umgebungen gesetzt werden kann.

Oben habe ich Henrik Lissner für seine negative Haltung gegenüber NixOS zitiert. In Wahrheit hat er aber selbst eine der wohl als Vorlage meistgenutzen Beispiel-Konfigurationen für NixOS veröffentlicht. Das Alleinstellungsmerkmal ist sein eigenes CLI-Werkzeug, hey, das die verschiedenen Befehle zur Interaktion mit Flakes vereinigt. Ich weiß nicht, ob er selbst seine Konfiguration einsetzt, sie scheint mir aber für den täglichen Gebrauch völlig geeignet zu sein. Leider gibt es keinerlei Dokumentation zu ihren Komponenten.

Henrik führt eine Reihe von “echten” Konfigurationen an, die ihm bei der Erstellung seiner eigenen geholfen haben:

Im NixOS-Wiki gibt es eine Sammlung von Konfigurationsdateien.

YouTube

Einige YouTuber veröffentlichen sehr guten Content zum Thema Nix. Dabei handelt es sich um sehr kleine Kanäle und die Produktionsqualität und Ausrichtung variiert. Sie sind jedoch durchweg sehr sehenswert. Persönlich bevorzuge ich eher kürzere und eher geskriptete Videos, weshalb ich Live-Streams hier nicht aufgenommen habe.

LibrePhoenix hat vor kurzem zwei tolle Einführungsvideos zur Konfiguration von NixOS mit Flakes und dem Home-Manager veröffentlicht. Sie umschiffen gekonnt all die frustrierenden technischen Details ohne den Eindruck dummer Toy-Beispiele zu erwecken. Er geht auch kurz darauf ein, wie man eine virtuelle Maschine nutzen kann, um seine Konfiguration vorab zu testen. Emmet hat bereits fast 800 Abonnenten, was denke ich zeigt, dass viele Neulinge seine Videos etwas abgewinnen können.

Oben habe ich bereits über die Videos von Jeezy/LGUG2Z gesprochen. Seine Videos zeichnet sich vor allem dadurch aus, dass er nicht lange um den heißen Brei herumredet. Das Problem des Tages wird klar umgrenzt und im Anschluss daran ohne Umwege gelöst. Die fertigen Lösungen werden als GitHub-Repo verpackt. Perfekt für diejenigen, die Anwendungen zum Laufen bringen wollen, ohne sich mit dem Klein-Klein herumärgern zu müssen.

Wem es demgegenüber vor allem um die Hintergründe geht, dem wird der Kanal von Jon Ringer gefallen. Man bekommt augenblicklich den Eindruck, dass Jon wirklich weiß, wovon er redet. Er widmet sich einzelnen Spezialgebieten in zumeist kurzen Videos. Auf abstrakte Aussagen folgen fast beiläufig Kommentare dazu, was daraus in der Praxis folgt. Es liegen Monate zwischen seinen Videos, aber noch gibt es Hoffnung, dass er nochmal wiederkommt.