Flakes gegen den "Snowflake-Effekt"
Sicher erinnert ihr euch noch an den brillanten Starkoch Nixos aus dem letzten Teil. Eigentlich kann er mehr als zufrieden sein. Die Restaurantküche läuft seit dem Paradigmenwechsel (funktional und deklarativ), also mit der Speisekarte als einziger Quelle der Wahrheit, wie geölt. Trotzdem fehlt das letzte Bisschen Kontinuität, Beständigkeit und 100‑%ige Reproduzierbarkeit. Trotz unveränderter Karte schmecken die Speisen nicht immer ganz genau gleich. Mit dem Traum vom Sternekoch wird es so natürlich nichts.
Dabei steht doch in dem numerisch verschlüsseltem Rezept (dem Hash) ganz genau: "Nimm 500ml frische Milch und 200g Weizenmehl" - damit ist doch alles beschrieben, oder? Irgendwann fällt der Groschen. Starkoch Nixos greift zur Tastatur und legt eine zusätzliche Datei zur Speisekarte an. In diese schreibt er: „Nimm 500ml frische Bio-Milch der Molkerei Demet und 200g Weizenmehl Typ 1050 von der Müller-Mühle“. Alles klar?!
Wenn du momentan nach der Festsetzung der Konfiguration
sudo nixos-rebuild switchtippst, holt sich dein Rechner die jetzt gerade aktuellen Pakete. Wenn du denselben Befehl auf einem anderen Rechner mit der gleichen Konfiguration ausführst, aber mit zwei Tagen Abstand, gibt es eventuell schon neuere, unterschiedliche Versionen von z. B. Firefox oder dem Kernel. Das Ergebnis: Deine Konfiguration ist zwar identisch, aber das Ergebnis (die installierte Software) ist es nicht. Das hält das Versprechen von Nix, „exakt gleich“, nicht zu 100 %.
Und genau das ist die bahnbrechende Weiterentwicklung von NixOS: Die normalen Update-Channels werden ergänzt und ersetzt durch Flakes. Und by the way: Nixos ist jetzt endlich Sternekoch.
Zwei Schneeflocken
- Die
flake.nix(Die Einkaufsliste): Hier schreibst du z. B. rein (in der Regel nur ein einziges Mal, danach muss dieflake.nixnie wieder angetastet werden), woher Nix die Programme holen soll (stable, unstable etc.). - Die
flake.lock(Das Frische-Siegel): Sobald du dein System einmal gebaut hast, schreibt Nix hier den exakten "Fingerabdruck" jedes Programms rein. Das ist übrigens wieder so eine Datei, die wir als User nie antasten (dürfen).
Das Ergebnis: Ab jetzt schaut Nix in das Siegel (flake.lock) und weiß: „Aha, ich darf exakt nur diese Bausteine nehmen." Und so richtig cool wird das, wenn du deine Konfiguration mit deinen anderen Geräten über Git bzw. Codeberg synchronisierst (kommt in Teil 3).
Technisch bedeutet das: Ohne Flakes ist NixOS ein (mindestens) sehr gutes Linux, weil es die "Dependency-Hell" durch den Nix-Store ausschaltet. Mit Flakes wird es zu einer überragenden Zeitmaschine, die du verlustfrei vor- und zurückspulen kannst. Die Schneeflocke kann ruhig schmelzen, wir können sie jederzeit nachbauen – und zwar jetzt wirklich Bit-genau.
Erfahrung schlägt Erkenntnis
Bevor wir hier als Trockenübung weiter machen, biete ich an, dass du an diesem Punkt meine Systemdateien übernimmst, damit wir schauen können, wo die Flakes auf fruchtbaren Boden fallen.
Das sind Lernmaterialien! Klar, es ist gleichzeitig auch eine Basis und bietet ein erstes schönes Fundament für das eigene System. Aber ich habe extra sehr intensiv in den Dateien kommentiert, damit vorrangig das Lernen erleichtert wird.
Und noch ein Hinweis:
Ich liebe nun mal die schlichte Eleganz und Usability von GNOME. Wenn du jetzt meine Konfigurationsdateien übernimmst, dann wird dadurch dein System zwangsläufig auf GNOME umgestellt werden. Du bekommst initial: GNOME mit Erweiterungen zu einem Manjaro-EndeavourOS-Style-Mix, das Terminal mit Fish und Starship, Firefox, Thunderbird, LibreOffice-Fresh und zwei eingebaute Skripte (beschreibe ich noch); den Rest habe ich auskommentiert.
Du hast einen anderen Lieblingsdesktop? Kein Problem – das sind deine Ressourcen:
- Bei der Installation hattest du schon deinen Liebling gewählt und somit wurde dieser vom Installationsprogramm in der korrekten Syntax deiner
configuration.nixhinzugefügt. Kopiere diesen Block einfach in die heruntergeladeneconfiguration.nix, welche ja dann in ~/Downloads liegt, sofern du dem Angebot gefolgt bist. Gleichzeitig löschst du in meinem Original den Gnome-Block und alle Komfortfunktionen von Gnome. Achtung: Auch in meinerhome.nixsind Gnome-Erweiterungen etc. Diese Blöcke ebenfalls komplett entfernen (zähle die Klammern mit! Schnell bleibt mal eine zu viel stehen oder es wird eine zu viel gelöscht – passiert!). - Die Nix-Dokumentation ist richtig gut. (Früher muss das mal anders gewesen sein, im Netz liest man viel Gegenteiliges.) Erste Anlaufstation ist eigentlich immer das Wiki und spezielle Befehle findet man mit einem Klick über Search Options. (In den Links hatte ich 'Xfce' als Beispiel gewählt.)
So kannst du meine Systemdateien einspielen und anpassen
1. Download
Ohne über eine der Dateien (home.nix) bisher gesprochen zu haben, bitte alle drei herunterladen:
2. Anpassung
Vor dem Editieren möchte ich dich aus didaktischen Gründen dazu motivieren die Dateien komplett zu lesen. Du wirst sehen, dass du den Syntax sehr gut verstehst (die Skripte dabei zunächst gerne überlesen). Schließlich möchte man ja wissen, was man dem System deklarativ als Bauanleitung übergibt.
In der flake.nix folgenden Block anpassen. Hier 2 × deinen Hostnamen (wenn nicht geändert, ist es "nixos") eintragen. Und 1x deinen Benutzernamen. Beides ist im Terminal ersichtlich. Dort steht vor dem Eingabeprompt benutzername@hostname.
# Gemeinsame Konfiguration für alle Systeme
common-modules = [
./configuration.nix
home-manager.nixosModules.home-manager
{
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
home-manager.backupFileExtension = "backup";
home-manager.users.DEIN-USERNAME = import ./home.nix; # <==
}
];
in {
nixosConfigurations = {
# --- Konfiguration für den Erstrechner ---
DEIN-HOSTNAME = nixpkgs.lib.nixosSystem { # <==
system = "x86_64-linux";
modules = common-modules ++ [
./hardware-configuration.nix
{ networking.hostName = "DEIN-HOSTNAME"; } # <==
];
};
In der home.nix im gezeigten Block 3 × den Benutzernamen deines Systems und 1 × die E-Mail-Adresse (diejenige, welche du für Codeberg benutzt oder später benutzen möchtest) editieren.
home.username = "DEIN-USERNAME"; # <==
home.homeDirectory = "/home/DEIN-USERNAME"; # <==
programs.git = {
enable = true;
settings = {
user.email = "deine@email.de"; # <==
user.name = "DEIN-USERNAME"; # <==
};
};
In den Block der configuration.nix deinen Echtnamen angeben (hattest du auch bei der Installation angegeben) und 1 × den Benutzernamen deines Systems einbauen.
users.users.DEIN-USERNAME = { # <==
isNormalUser = true;
description = "Dein Name"; # <==
extraGroups = [ "networkmanager" "wheel" ];
shell = pkgs.fish;
};
3. Konfiguration einspielen
Die Dateien liegen wahrscheinlich noch in ~/Downloads:
sudo cp ~/Downloads/configuration.nix /etc/nixos/
sudo cp ~/Downloads/home.nix /etc/nixos/
sudo cp ~/Downloads/flake.nix /etc/nixos/
4. Git einrichten
Git wird zwingend benötigt damit NixOS Flakes verwenden kann. Du brauchst zunächst kein Codeberg-Konto.
Hier, mitten in die Befehle rein, muss ich noch etwas zu git ergänzen, was für das Verständnis wichtig ist.
Git ist ein Versionsverwaltungssystem. Es wurde von Linus Torvalds (dem Erfinder von Linux) entwickelt, weil er ein Werkzeug brauchte, um die Zusammenarbeit von tausenden Programmierern am Linux-Kernel zu koordinieren.
- Die Zeitmaschine: Git merkt sich jede kleinste Änderung an einer Datei. Wenn du Mist baust, kannst du mit einem Befehl (
sudo nixos-rebuild switch --rollback) zu dem Moment, zu der Version zurückkehrenn, als noch alles funktionierte.- Der Team-Player: Mehrere Leute können gleichzeitig an derselben Datei arbeiten. Git führt diese Änderungen später intelligent zusammen.
Und identische Anforderungen stellt NixOS ja auch, um die Idee mit den "Flakes" umzusetzen: Versionierbarkeit (
flake.lock) und Multi-Hosts (flake.nix). Daher ist git und NixOS das perfekte 'Match'.
Welche Versionen deiner Konfiguration git bekannt sind, zeigt dir dann späternix-env --list-generations --profile /nix/var/nix/profiles/system.
4.1 Git temporär installieren
nix-shell -p git
In der neuen
configuration.nixdie du dann einspielst, istgitschon enthalten und bleibt dadurch dauerhaft im System.
4.2 Git minimal konfigurieren
sudo git config --global user.name "DEIN-USERNAME"
sudo git config --global user.email "deine@email.de"
4.3 Repository initialisieren
Hier stellen wir git unsere vier "Nixen" vor:
cd /etc/nixos
sudo git init
sudo git add configuration.nix home.nix flake.nix hardware-configuration.nix
sudo git commit -m "initiales Setup"
Das ist zunächst nur ein lokales Repository – nichts wird ins Internet hochgeladen. Es dient nur dazu, dass Flakes die Dateien "sehen" können.
5. System bauen
5.1 Flakes aktivieren
Einmal System bauen:
sudo nixos-rebuild test
Schritt 5.1 ist nötig, weil
nix.settings.experimental-features = [ "nix-command" "flakes" ]erst durch diesen Rebuild aktiviert wird. Ohne diesen Schritt kennt NixOS den--flake-Parameter noch nicht und Schritt 5.2 schlägt sofort fehl.
5.2 System mit Flakes bauen
# Paketversionen aktualisieren und neu bauen
sudo nix flake update
sudo nixos-rebuild switch --flake /etc/nixos#DEIN-HOSTNAME
Die Befehle unter 5.2 sind ab jetzt deine neuen Update-Befehle und ersetzt den schon bekannten (unter 5.1)! Das
#ist hier übrigens ausnahmsweise echter Teil des Befehls und weist auf den zu verwendenden Host.
Der Zusatz --flake /etc/nixos#DEIN-HOSTNAME sorgt ab jetzt dafür, dass die Informationen aus der flake.nix bzw. der flake.lock für den nun Bit-genauen Bau deines Systems (DEIN-HOSTNAME) herangezogen werden.
Beim ersten Mal wird dabei auch die flake.lock automatisch angelegt. Dieser Schritt dauert etwas, da alle Programme heruntergeladen und installiert werden.
Konfiguration sichern
Selbstverständlich kannst du die vier Dateien auch konventionell sichern. Zum Beispiel auf einer mobilen Festplatte. Dabei würdest du aber die „Zeitmaschine“ aushebeln! Wir nutzen daher einen "Git-Hub", ich empfehle Codeberg.org.
Wenn Git deine „Zeitmaschine“ ist, dann ist Codeberg das sichere Archiv, in dem du deine Zeitreisen und Rezepte aufbewahrst.
Um es kurz zu machen: Codeberg ist eine Plattform, auf der du deine NixOS-Konfigurationen speichern und mit anderen Hosts teilen kannst. Es ist quasi deine Cloud für git. Ausschließlich nur mit einem solchen "Git-Hub" kanngitkommunizieren.
Also, sofern noch nicht geschehen, richte dir jetzt einen Account bei Codeberg ein und dort ein neues Repo mit dem Namen "NixOS".
Im letzten Teil beschreibe ich dann, wie du damit deine Konfiguration auf andere Rechner nicht nur spiegelst, sondern auch synchronisiert. Aber egal, ob dich der eigene Rechner wegen Defekt oder Diebstahl verlässt oder ob du weitere Maschinen mit dieser Konfiguration betreiben möchtest: Neu aufsetzen, Bit-genau-gleich: 30 Minuten!
1. Codeberg als Remote einrichten
cd /etc/nixos # Vorab ins Verzeichnis zu wechseln wird gerne vergessen!
sudo git remote add origin https://codeberg.org/DEIN-USERNAME/NixOS.git
sudo git push -u origin master
2. Nach jeder Änderung sichern
Sei akkurat und sichere nach jeder Änderung deine Konfiguration:
cd /etc/nixos
sudo git add .
sudo git commit -m "kurze Beschreibung der Änderung"
sudo git push origin master
Home, sweet home.nix
Unser frisch gebackener Sternekoch Nixos möchte sich fortan nicht mehr selbst die Hände schmutzig machen und bereitet daher die Einstellung weiterer Köche vor. Die wollen aber jeweils unbedingt ihren eigenen Satz Kochmesser nutzen … schneller Switch auf die Systemebene:
Vielleicht nutzen deinen Rechner ja zusätzlich auch unterschiedliche Familienmitglieder? Oder du richtest einen zusätzlichen Gastzugang ein. Genau an diesem Punkt stößt man mit der Konfiguration ausschließlich über die configuration.nix an eine Grenze. Ebenso bei einem Set-up mit mehreren Rechnern (kommt in Teil 3) ist man damit limitiert. Und da kommt die home.nix ins Spiel.
Die configuration.nix stößt den Systembau- und die Systemverwaltung an. Die neue home.nix macht dasselbe für die Benutzerumgebung – sie aktiviert das dafür zuständige NixOS-Modul, den Home-Manager.
Bei NixOS hat jeder User die Möglichkeit, einen Teil der Konfiguration zu individualisieren – über seine eigene home.nix. Vielleicht hast du beim Editieren der configuration.nix und der home.nix schon bemerkt, dass z. B. die Benutzerprogramme alle in die home.nix gewandert sind. Und das macht ja auch absolut Sinn. Was schert andere Nutzer meine Fotosoftware, wenn es nicht auch deren Hobby ist? Vielleicht wollen auch nicht alle User die gleichen GNOME‑Erweiterungen. Und der riesige Vorteil ist eben, dass die Updates viel schneller durchlaufen, da jeder User nur seine Programme in den Nix-Store eingelagert bekommt.
In der Zusammenschau wird NixOS also durch vier Dateien in /etc/nixos/ gesteuert. Die Quelle der Wahrheit hat nun diese sehr logisch abgegrenzten Kapitel:
| Datei | Zuständig für |
|---|---|
flake.nix |
Schaltzentrale: Paketversionen, Hostnamen, Multi-Host-Setup |
configuration.nix |
System, Dienste, systemweite Programme (identisch auf allen Rechnern) |
home.nix |
Benutzerprogramme, Theme, Desktop-Einstellungen |
hardware-configuration.nix |
Gerätespezifisch, automatisch generiert |
Die ersten drei Dateien sind ja zum Editieren vorgesehen und sind vom Syntax her identisch, gleich aufgebaut und gleich zu bedienen. Es sind immer normale Textdateien, was super zur Linux-Philosophie passt. Und mittlerweile sind mir diese Dateien schon so ans Herz gewachsen, dass ich sie "Nixen" nenne. :)
Ich werde das Multi-User-Setup (jeder User pflegt seine eigene
home.nix) erst nach den drei Teilen dieser Setup Reihe beschreiben, das ist dann gleich der erste Folgebeitrag.
„Aber ich bin alleine auf meinem System und habe nur den einen Rechner. Mir reicht meine configuration.nix ..." Ja, geht – aber: Es gibt viele technische Gründe für die "Gewaltenteilung" im System, mich persönlich überzeugt aber ein eher philosophischer Grund am meisten: Semantische Klarheit: configuration.nix beschreibt, was das System ist, home.nix beschreibt, was Du bist. Das ist keine technische Notwendigkeit, sondern eine gedankliche Ordnung, die sich auszahlt, sobald die Konfiguration dann doch mal wächst. Technische Gegenüberstellung:
nur configuration.nix |
mit home.nix |
|
|---|---|---|
| Funktioniert | ✅ | ✅ |
| Übersichtlichkeit | nimmt ab | bleibt hoch |
| Rebuild-Geschwindigkeit | langsamer | schneller |
| Portabilität | mein PC only | überall |
| Mehrbenutzer-fähig | nicht wirklich | elegant |
| Unabhängige Rollbacks | ❌ | ✅ |
Der Zugewinn ist also auch klar technisch begründet.
Belohnung
Wenn du bis hierhin durchgehalten hast, möchte ich dich mit einem Skript belohnen (es ist direkt in die home.nix geschrieben, also schon aktiv).
update-push # Skript 1
Du hast etwas an der Konfiguration geändert, z. B. die home.nix um ein neues Programm ergänzt, dann wäre jetzt sudo nixos-rebuild switch --flake /etc/nixos#DEIN-HOSTNAME fällig und danach noch das ganze oben beschriebene Prozedere zur Sicherung auf Codeberg. All das nimmt dir ab jetzt das Skript ab. Nach Eingabe von update-push (ohne sudo) musst du dich nur noch identifizieren.
Vorschläge zur Weiterarbeit
(1) Schau dir die home.nix und die configuration.nix an und vergleiche die Elemente hinsichtlich System und Du (siehe oben). Lies die Dateien in der für dich noch fremden Sprache und nutze als "Wörterbuch" Search Options, sowie das Wiki.
(2) Konfiguriere dir dein System nach deinem Wunsch, indem du (so wie in Teil 1 beschrieben) nun z. B. weitere Programme durch Ergänzen der home.nix hinzufügst. Meine z. T. auskommentierten und für dich evtl. nutzlosen Programme kannst du dann auch gleich durch Löschen der entsprechenden Zeilen entfernen. Etwas aufpassen musst du in der configuration.nix bei den Gnome-Programmen: Auskommentieren heißt hier „Ich darf bleiben“.
Danach immer update-push!
(3) Wieder der Tipp: Solltest du schon wild experimentieren oder Fragen haben: einfach Terminal-Ausgaben oder Fragen z. B. in claude.ai (Empfehlung, da Claude auch .nix-Dateien lesen kann!).

Super Artikel, Teil 1 hatte mich schon sehr neugierig gemacht, ob da evtl. ein etwas anderer Ansatz für ein "Nix HowTo" kommt. Nun nach Teil 2 sehe ich das bereits bestätigt und werde wohl (zum dann 3ten Mal) einen neuen Anlauf starten mich ausführlicher und "ausdauernder" mit NixOS zu befassen.
Mir scheint, dem Autor kommt bei seiner Begeisterung für NixOS ein wenig die kritische Distanz abhanden. "Das Ergebnis: Ab jetzt schaut Nix in das Siegel (flake.lock) und weiß: „Aha, ich darf exakt nur diese Bausteine nehmen." Und so richtig cool wird das, wenn du deine Konfiguration mit deinen anderen Geräten über Git bzw. Codeberg synchronisierst (kommt in Teil 3)." Ist das wirklich erstrebenswert, wenn man dann nur um der Einheitlichkeit willen auf allen seinen Geräten z. B. veraltete Browserversionen mit bekannten und womöglich schon aktiv ausgenutzten Sicherheitslücken hat? Oder übersehe ich da etwas?
Ich finde das Konzept sehr interessant, persönlich bin ich aber auch ein großer Fan von Flatpak und systemd-homed, letzteres ist für mich eine sehr elegante Variente zur user-verwaltung. Flatpak sollte ja eigentlich kein Problem darstellen, evtl gibt es eine Möglichkeit Programme vorzuinstallieren?
Es wäre super wenn du in deinem Folgebeitrag zur home.nix (oder würde das in die config.nix gehören?) erklären könntest ob/wie man das System mit systemd-homed aufsetzen kann / aufsetzt.
Ich freue mich über den tollen Guide, allerdings ist mein Hauptknoten im Kopf noch nicht ganz gelöst. In welchem Detailgrad konfiguriere ich mein System in den Dateien? Schreibe ich jede kleine Einstellung (zum Beispiel vom Desktop) in die config? Was passiert wenn ich ein bestimmtes Hintergrundbild in der Config setze, aber dieses auf dem neuen System nicht vorhanden ist, da dort die Datei fehlt? Komme ich nicht wieder in eine Update-Hölle wenn sich die Syntax der Konfiguration ändert und ich dann friemelig die Nix dateien alle bearbeiten um die Syntax bei einer Änderung wieder an die neue Version anzugleichen?
Danke für deinen Kommentar - er berührt nämlich eine Frage, die auch mich umgetrieben hat. Du konfigurierst deklarativ in jedem Fall das, was du bewusst für alle Rechner gemeinsam festlegen möchtest - du musst es damit also nur ein einziges mal tun. Alles andere kannst du auch wie üblich machen, also manuell über die (in meinem Fall) GNOME-Einstellungen anpassen, ohne es in die Config schreiben zu müssen. Was du über Desktop-Einstellungen änderst, wird in deinem persönlichen Benutzerprofil (~/.config, ~/.local, dconf-Datenbank) gespeichert – nicht in den NixOS-Konfigurationsdateien. Diese Einstellungen überleben jeden Neustart problemlos, weil dein Home-Verzeichnis nicht bei jedem Boot neu erzeugt wird. Nur im Falle einer Neuinstallation wären diese verloren, wenn du auf die Deklaration in einer "Nixe" verzichtest. Dass du in der Update-Hölle schmoren musst, wird dir also erspart bleiben. Generell: Manche Fragen werde ich sicher noch in den kommenden vier Artikeln beantworten können - und dort ist es leichter, weil das im richtigen Zusammenhang viel verständlicher wird als in ein paar vorweggenommenen Sätzen.
Auf der NixOS Webseite gibt es den "Nix - Package Manager" für Linux, MacOS und Windows. Ich vermute jetzt mal das dies der Kern von NixOS (= die Linux Distribution) ist? Jedenfalls ist mir das in der Serie noch nicht klar geworden, genauso nicht wie sich NixOS zu Ansible, Chef, Puppet oder Salt abgerenzt, die ebenfalls deklarative Systembechreibungen und wiederherstellbare Systemzustände erzeugen.
Moin Moin!
Vielen Danke, dass du uns Nix bzw. NixOS näher bringst. Sobald ich etwas Luft habe, werde ich das mal ausprobieren, ein wirklich interessantes System. Ich freu mich schon auf Teil 3 und den (die) nachfolgenden Artikel.
Mfg: evilware666