Erfahrungen und Empfehlungen für NixOS

  Nikolaus Thiel   Lesezeit: 11 Minuten  🗪 3 Kommentare

In dieser Woche gab es bereits zwei Artikel zu NixOS. Diese behandeln die Installation und die ersten Schritte. In diesem Artikel möchte ich ein paar Ratschläge und Anregungen für die Konfiguration des Systems geben.

erfahrungen und empfehlungen für nixos

Vor fünf Monaten wechselte ich meine Distro von TuxedoOS nach NixOS. Die Hauptgründe für mich waren:

  • Deklarative Konfiguration
  • Die Nix Expression Language folgt den Paradigmen pure, funktional und lazy
  • Reproduzierbarkeit: Das gleiche System mit gleicher Konfiguration lässt sich auf mehreren Rechnern aufsetzen.
  • Versionierung: Die Systemkonfiguration sollte einfach in einem Git-Repository zu speichern sein.
  • Für meine Familie, die Computer nur benutzen, möchte ich Grundeinstellung bei der Installation festlegen.
  • Mache ich Fehler, so kann ich meine Änderungen zurückrollen (siehe unten :)

In diesem Artikel möchte ich einige Tipps geben, wie man das frisch installierte NixOS an seine Bedürfnisse anpasst. Hierbei werde ich einige Punkte meiner Konfiguration hervorheben. Meine Konfiguration kann gerne als Anregung genommen werden: https://codeberg.org/klt/configurations

In bin kein Experte, und dieser Artikel ist weder vollständig noch ein Manual. Er soll den Einstieg erleichtern und Anregungen geben.

Anwenden der System-Konfiguration: nixos-rebuild

Nach erfolgreicher Installation möchte man das System an seine Bedürfnisse anpassen. Das komplette System wird über die Dateien im Ordner /etc/nixos/ konfiguriert, siehe nächster Abschnitt. Diese passt man seinen Wünschen an und wendet sie dann auf das System an: `sudo nixos-rebuild switch`. Besser ist es aber, zuerst die neue Konfiguration zu testen `sudo nixos-rebuild test`.

`nixos-rebuild` produziert eine sehr detaillierte Ausgabe. Um diese nicht zu verlieren, kann man sie in eine Datei umleiten. Hierfür habe ich den Ordner ~/nixos angelegt und verwendet diesen Einzeiler:

cmd="test";cd ~/nixos;pwd;sudo ls;sudo nixos-rebuild ${cmd} 1> nixos-rebuild-${cmd}.out 2> nixos-rebuild-${cmd}.err ; echo $?

Der Befehl sudo ls dient dazu, die Passwortabfrage für sudo zu forcieren, denn durch die Ausgabeumleitung wird das mit der Eingabe des Passwortes etwas schwierig. Die Variable cmd kann auf "test" oder "switch" gesetzt werden.

Anpassen der System.Konfiguration: /etc/nixos

Nach der Neuinstallation gibt es nur zwei Konfigurationsdateien:

  • hardware-configuration.nix sollte man nicht anfassen, oder nur wenn man dazu aufgefordert wird.
  • configuration.nix ist die Hauptdatei, die die anderen Konfigurationsdateien lädt.

Man kann all seine Änderungen in configuration.nix erfassen, aber es empfiehlt sich, die Konfiguration in mehrere Dateien aufzuteilen und diese von der configuration.nix laden zu lassen:

imports =
[ # Include the results of the hardware scan.
./hardware-configuration.nix
# Include machine specific settings
./maxiTower.nix
# Bootloader
./boot.nix
# Services
./services.nix
# System D
./systemd.nix
# Include the package list.
./packages.nix
# Include the user list.
./users.nix
# Include Home Manager Config
./home.nix
];

Ich werde nicht alle Dateien im Detail, sondern nur einige Punkte vorstellen. Interessierte Lesende können die Dateien sich auf Codeberg ansehen.

Achtung: Sichert die beiden durch die Installation erstellten Dateien bevor ihr etwas ändert, z.B. unter /etc/nixos/ORIG. Dies kann eine Neuinstallation ersparen, siehe Abschnitt Rollback.

maxiTower.nix
Mein Rechner ist in einem Towergehäuse und wurde von seiner Herstellerin als Maxi-System kategorisiert. Daher der Name maxiTower. In maxiTower.nix wird der Hostname, die Wifi-Schnittstelle, die Filesysteme (fstab) und weitere Rechner-spezifische Einstellungen deklariert.

packages.nix
Hier definiert man die zu installierenden Pakete, die allen Nutzern zur Verfügung stehen sollen.

Wie Ralf in seinem Artikel schildert, kann man Pakete auch mit nix-shell -p zum Testen installieren. Das empfiehlt sich insbesondere, wenn man noch nicht weiss, welche Anwendung (z.B. PDF-Viewer) man haben möchte und die verschiedenen Optionen ausprobieren möchte.

users.nix
Hier definiert man die User, inklusive der User-spezifischen Pakete. So sieht mein User klt das Paket Thunderbird nicht, aber die anderen drei User sehen es. Das Passwort muss man nach einem nixos-rebuild wie gehabt mit passwd für die
User festlegen. Diese können dies auch selbständig ändern.

home.nix
Diese Datei bindet den Home-Manager ein. Mit diesem kann man Konfigurationen für die einzelnen User anlegen. Hierfür gibt es zum Teil vorgefertigte Nix-Module, die die Konfiguration erleichtern, z.B. für emacs und git:

programs = {
emacs = {
enable = true;
extraPackages = epkgs: [
epkgs.nix-mode
epkgs.magit
];
};
git = {
userName = "Nikolaus Thiel";
userEmail = "klt@fsfe.org";
};
};

Durch nixos-rebuild test/switch wird die Datei ~/.config/git/config für den/die User angelegt.

Beliebige Dateien kann man wie folgt im Home-Verzeichnis generieren lassen:

file = {
".config/pqivrc" = {
enable = true ;
text = ''
[options]
fullscreen=1
hide-info-box=1
sort=1
'' ;

Mit den Ausdrücken home-manager.sharedModules werden Konfigurationen einheitlich für alle User angelegt, siehe
https://codeberg.org/klt/configurations/src/branch/main/nixos/home_sharedModules.nix

Es lassen sich sogar Firefox-Addons und Einstellungen zentral definieren, siehe https://codeberg.org/klt/configurations/src/branch/main/nixos/home_firefox.nix

Man kann auch nur einen Teil der User-spezifichen Konfigurationen vom Home-Manager vornehmen lassen und den Rest wie gehabt durch editieren der Dateien im Home-Verzeichnis. Dadurch kann man nach und nach seine User-Konfiguration zentralisieren und dies für private Configs (z.b. secret keys) unterlassen. Home-Manager überschreibt keine bereits existierenden Konfigurationen, sondern wirft in diesem Falle einen Fehler.

Reproduzierbarkeit

Möchte ich auf einem weiteren Computer ein NixOS mit der gleichen Konfiguration aufsetzen, so muss man nach der Installation einfach nur die Konfigurationsdateien kopieren und mit nixos-rebuild anwenden. Nach ein paar Minuten hat man ein (fast) identisches System. Fast, denn die Hardware unterscheidet sich: siehe nächster Abschnitt.

Rollback

Ich wollte die NixOS Konfiguration von meinem Hauptrechner "maxiTower" auf mein MacBook Air aus dem Jahr 2010 übertragen. Nach der Installation kopierte ich die Konfigurationsdateien, importierte die Rechner-spezifische Datei:

imports =
[ # Include the results of the hardware scan.
./hardware-configuration.nix
# Include machine specific settings
./luftbuch.nix
...
];

und lies nixos-rebuild test laufen. Nach ein paar Minuten verschwand mein KDE Plasma und ich sah Folgendes:

Hups, da hab ich wohl gründlich was kaputt gemacht! Aber kein Problem. Ich habe einfach den Rechner ausgeschaltet und neu gestartet. Das System fuhr mit der vorherigen Konfiguration hoch, denn ich habe nur ein nixos-rebuild test,
anstatt switch, gemacht.

Was habe ich kaputt gemacht? Ich hatte auch die hardware-configuration.nix vom maxiTower auf das MacBookAir
(luftbuch) kopiert, und damit auch das Pendant zu /etc/fstab et al. Das muss ja zu einem Absturz führen. Zum Glück hatte ich die originale hardware-configuration.nix gesichert.

Rollback trotz switch

Stellt man nach einem nixos-rebuild switch (anstatt test) fest, dass etwas nicht stimmt, so kann man beim Start des Rechners eine ältere Version auswählen. Der switch überschreibt nicht, sondern generiert einen neuen Eintrag im Boot Loader:

Garbage Collection

Damit das Rollback funktionieren kann, auch nach einem automatischen Update oder Upgrade, werden alte Versionen und Konfigurationen nicht gelöscht, sondern neue Versionen im Ordner /nix/store abgelegt. Dieser belegt 114 GiB auf meiner Platte.

Mit dem Garbage Collector lassen sich alte Versionen löschen:

sudo nix-collect-garbage --delete-older-than 14d

Versionierung

Weil das System mithilfe von Dateien, die sich in einem Ordner befinden, konfiguriert wird, ist es einfach seine Systemkonfiguration in einem GIT-Repo zu versionieren.

Viel Spass

Ich hoffe, das Interesse an NixOS bei einigen geweckt zu haben und wünsche viel Freude am Erkunden.

Quellen:
https://codeberg.org/klt/configurations
https://discourse.nixos.org/
https://gnulinux.ch/nix-mit-nixos
https://gnulinux.ch/nixos-zweiter-versuch
https://nixos.org
https://nixos.org/manual/nix/stable/
https://nixos.wiki/wiki/Home_Manager

Tags

Distros, NixOS

Naja
Geschrieben von Naja am 21. Juli 2023 um 12:28

Vielen Dank für deine hilfreichen Alltags-Tipps! Die reduzieren etwas die Schwellenangst :-)

Klaus
Geschrieben von Klaus am 21. Juli 2023 um 12:53

OK, Nikolaus und Ralf, es ist euch gelungen mein Interesse an NixOS zu wecken. Den deklartiven Ansatz finde ich interessant. Danke, Niklaus, für die Tipps zum Umgang mit den Konfigurationsdateien. Klaus

👓
Geschrieben von 👓 am 21. Juli 2023 um 16:51

Kann man sich von einem bestehenden System einen Konfig Vorschlag erzeugen lassen? Ich würde gerne ein biologisch gewachsenes Ubuntu System, dass nicht mir gehört migrieren. Ich habe aktuell etwas Angst etwas Wichtiges zu vergessen.