NixOS Teil 3 - Die Besonderheiten der Paketverwaltung

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

Dieser dritte Teil der NixOS-Artikelserie befasst sich mit einigen und doch längst nicht allen der grossen und kleinen Tricks, die der Paketmanager Nix im Ärmel hat.

Kurz vorab: was er im Gegensatz zu den meisten anderen Paketmanagern wie apt, pacman, dnf und Flatpak leider nicht bietet, ist die Integration in GUI-Softwaremanager wie Gnome Software. Doch wer sich bereits durch die Installation und Konfiguration von NixOS gearbeitet hat, den wird das vermutlich nicht abschrecken.

Systemkonfiguration

Der auf NixOS wichtigste Weg, um Software zu installieren oder zu entfernen ist, sie in der Systemkonfiguration /etc/nixos/configuration.nix zu deklarieren. Viele Optionen, die hier gesetzt werden können, implizieren bereits die Installation der benötigten Software. Darüber hinaus können in environment.systemPackages = [ ... ] weitere gewünschte Softwarepakete gelistet werden.

Updates

NixOS wird beim Ausführen des Befehls sudo nixos-rebuild switch --upgrade nicht nur, wie aus Teil 2 bekannt, die Konfiguration neu anwenden, sondern auch alle Software auf den neuesten Stand aktualisieren.

Anstatt dies immer wieder neu auszuführen, kann auch ein automatischer Dienst dafür in der Konfigurationsdatei aktiviert werden, mit der Zeile:

system.autoUpgrade.enable = true;

nix-shell

Nix ermöglicht es, mit dem Befehl nix-shell eine Shell zu starten, in der bestimmte gewünschte Software ohne Installation zum Ausprobieren zur Verfügung steht. nix-shell -p htop öffnet diese Shell beispielsweise mit htop als zusätzlich verfügbarem Befehl. nix-shell startet in diesem Beispiel htop, ohne es systemweit oder auch nur, wie im Folgenden beschrieben, im Benutzer-Kontext verfügbar zu machen.

Auf -p dürfen auch mehrere Paketnamen folgen. Die zwei Befehle lassen sich auch zu einem verbinden: nix-shell -p htop --run htop.

nix-env

NixOS erlaubt auch das dauerhafte Installieren von Software, ohne sie in die Systemkonfiguration einzutragen. Allerdings sollte man sich gut überlegen, ob man das tun möchte, denn nix-env ist ein einzelner Befehl, der Zustand ändert, und widerspricht somit dem deklarativen Ansatz.

Bei nix-env wird nur das jeweilige Profil geändert, das bedeutet, dass nur der jeweilige Nutzer beeinflusst ist. nix-env -iA nixos.htop installiert htop somit nur für den einzelnen Nutzer. Installieren zwei Nutzer dasselbe Paket, wird es nicht den doppelten Speicherplatz benötigen, sondern derselbe Nix-Store-Eintrag einfach beiden Nutzern zur Verfügung gestellt.

Weitere Optionen sind -u '*' für Updates in dem Profil, -e htop zum deinstallieren, sowie --rollback. Führt man nix-env mit sudo bzw. mit dem Rootaccount durch, wird das Systemprofil bearbeitet. Dessen Pakete stehen allen Nutzern zur Verfügung.

nix-collect-garbage

Der Nix-Store behält alle Softwareversionen, Systemgenerationen, Profile und per nix-shell genutzte Software im Hintergrund. Mit nix-collect-garbage lässt sich ein wenig aufräumen: alles, was von keinem Profil und keiner Systemgeneration mehr gebraucht wird, wird gelöscht.

Wichtiger ist die Variante nix-collect-garbage -d. Hier werden vor dem Löschen alle Systemgenerationen bis auf die aktuelle aus den Bootoptionen entfernt. Dabei ist zu bedenken, dass man anschliessend nicht mehr zurückrollen kann. Nun resultiert das Löschen in potenziell sehr viel mehr frei werdenden Speicherplatz, weil die alten Generationen alle nicht mehr behalten werden müssen.

Beides lässt sich automatisieren. Beispielsweise wird mit der folgenden Konfiguration täglich gelöscht, was seit 30 Tagen von keiner Konfiguration genutzt wurde:

nix.gc = {
    automatic = true;
    dates = "daily";
    options = "--delete-older-than 30d";
};

Und die folgende Option (hier bei einer UEFI-Installation) limitiert die Bootoptionen auf die neuesten 10:

boot.loader.systemd-boot.configurationLimit = 10;

Ältere Generationen werden aus den Bootoptionen entfernt, und die entsprechenden Nix-Store-Inhalte können vom Garbagecollector gelöscht werden.

Optimierung

Der sehr zeitintensive Befehl nix-store --optimize dedupliziert den Nix-Store auf Dateiebene, was in einigen Fällen ebenfalls beträchtliche Speicherplatzeinsparung bedeuten kann. Auch er kann als Hintergrunddienst eingerichtet werden, mit der Konfigurationsoption

nix.optimise.automatic = true;

Links

https://nixos.org
https://nixos.org/manual/nixos/stable/
https://nixos.org/manual/nix/stable/
https://nixos.wiki
https://search.nixos.org