Nix - der funktionale Packagemanager
Die Installation von Software und Programmen erfolgt unter Linux in der Regel mittels eines Packagemanagers. Die Definition von Wikipedia beschreibt umfassend die Eigenschaften eines Paketmanagmentsystems.
"A package manager or package management system is a collection of software tools that automates the process of installing, upgrading, configuring, and removing computer programs for a computer's operating system in a consistent manner." - wikipedia
Der Packagemanager Nix erfüllt alle der aufgeführten Eigenschaften und wer mit klassischen Paketmanagern wie z. B. rpm oder apt vertraut ist, wird den Umgang mit nix leicht erlernen können. Beispielsweise erfolgt die Installation, ein Update und die Deinstallation des Programms htop mit folgendem Befehlen:
# Installation $ nix-env -i htop # Update $ nix-env -u htop # Deinstallation $ nix-env -e htop
Wenn mit Nix ein Paket installiert wird, verändert sich das Nix Environment. Deshalb heißt der Befehl nix-env. Zum Suchen von Paketen wird z. B. nix search <paketname> verwendet. Nix verhält sich somit ähnlich wie APT (Advanced Packaging Tool), bei dem mit apt-cache search nach einem Paket gesucht aber mit apt-get install ein Paket installiert werden kann.
Funktionaler Package Manager
In funktionalen Programmiersprachen verhalten sich Funktionen bei identischen Übergabeparametern in allen Fällen gleich und das Ergebnis unterscheidet sich nicht. Nix verhält sich wie Funktionen in funktionalen Programmiersprachen. Pakete können mit den Ergebnissen einer Funktion verglichen werden. Um dies zu erreichen, werden die Pakete unter einem eindeutigem Dateipfad installiert. Dieser beginnt in der Regel mit /nix/store. Das Paket htop wurde z. B. unter dem Pfad /nix/store/k56i2gxa7g9ff8g8bcqiv9wnqxkycb05-htop-2.2.0/ installiert. Dabei ist k56... ein kryptographischer Hash über die Inhalte und Abhängigkeiten des Paketes. So wird garantiert, dass eine Neuinstallation nicht eine bestehende Installation überschreibt. Die folgenden Features basieren auf diesem Verhalten:
- Unprivilegierte Installationen
- Mehrere Versionen
- Multi-User-Installationen
- Atomare Updates
- Rollbacks
Unprivilegierte Installationen
Ein großer Vorteil von Nix ist, dass es Softwareinstallationen durch unprivilegierte Benutzer erlaubt. Dies ist möglich, da ein Programm nicht unter Systempfaden wie /bin, /usr/bin usw. installiert wird, sondern in einem zentralen Verzeichnis (z. B. /nix/store). Der vollwertige Pfad für das Programm htop kann wie folgt aussehen.
$ which htop
/home/benedikt/.nix-profile/bin/htop
$ ls -la /home/benedikt/.nix-profile/bin/htop
lrwxrwxrwx 15 root root 63 Jan 1 1970 /home/benedikt/.nix-profile/bin/htop -> /nix/store/k56i2gxa7g9ff8g8bcqiv9wnqxkycb05-htop-2.2.0/bin/htop
Das installierte Programm wird über das Home-Verzeichnis des jeweiligen Benutzers aufgelöst. Dies ist ein symbolischer Link auf den Installationspfad unter /nix/store. Dies wird durch eine Anpassung der PATH-Variablen des Benutzers erreicht, die auf einem NixOS folgendermaßen aussehen kann:
$ echo $PATH | tr ":" "\n" /home/benedikt/bin /run/wrappers/bin /home/benedikt/.nix-profile/bin /nix/var/nix/profiles/default/bin /run/current-system/sw/bin /etc/profiles/per-user/benedikt/bin
Multi-User-Installationen
Nix kann als Multi-User-Installation genutzt werden. In diesem Fall wird der Software-Store nicht vom jeweiligen Benutzer gepflegt, sondern durch einen Systembenutzer, der die installierte Software für jeden Benutzer in einem persönlichen Profil zusammenfasst. Das Profil eines Nutzers wird zentral gespeichert und über einen symbolischen Link aufgelöst. In diesem Profil befinden sich wie oben ersichtlich die Links zu den für diesen Benutzer installierten Programmen.
$ ls -l /home/benedikt/.nix-profile lrwxrwxrwx 1 benedikt nogroup 47 Feb 5 14:27 /home/benedikt/.nix-profile -> /nix/var/nix/profiles/per-user/benedikt/profile
Wenn Nix als Multi-User-Installation genutzt wird, wird für jeden Benutzer, der z. B in der nix-user Gruppe ist, ein eigenes Nix-Profil angelegt. Dies bedeutet aber nicht, dass ein Programm auch automatisch zur Verfügung steht, wenn es durch einen anderen Benutzer installiert wird. Dies muss durch jeden Benutzer individuell erfolgen. Dabei wird durch nix-env der Nix Daemon angesprochen, der die Installation mit den Rechten des Systembenutzers durchführt. Wenn z. B. Alice und Bob auf einem System beide das Programm htop in der gleichen Version mittels nix-env installieren, verweisen sie im Hintergrund auf dieselbe Installation.
$ alice~: ls -la ~/.nix-profile/bin/htop lrwxrwxrwx 16 root root 63 Jan 1 1970 /home/alice/.nix-profile/bin/htop -> /nix/store/k56i2gxa7g9ff8g8bcqiv9wnqxkycb05-htop-2.2.0/bin/htop $ bob~: ls -la ~/.nix-profile/bin/htop lrwxrwxrwx 16 root root 63 Jan 1 1970 /home/bob/.nix-profile/bin/htop -> /nix/store/k56i2gxa7g9ff8g8bcqiv9wnqxkycb05-htop-2.2.0/bin/htop
Atomare Update und Nix-Profile
Durch die Verlinkung ist es leicht möglich, mehrere Versionen gleichzeitig auf einem System zu installieren. Dies ermöglicht atomare Updates, Updates die in sich abgeschlossen sind und die bestehende Installation nicht beeinflussen. Bei der Veränderung des Environments mittels nix-env (wie z. B. bei einem Update) wird eine neue Generation des Nix-Profils erstellt. Die vorherige Generation des Profils inklusive der zugehörigen Paket-Versionen existiert weiterhin. Mit Hilfe des Befehls nix-env --list-generations können alte Generationen des Nix-Profils aufgelistet werden.
$ nix-env --list-generations
...
58 2019-02-08 13:26:35
59 2019-02-08 13:54:11
60 2019-02-08 13:59:58 (current)
Rollbacks und Garbage Collection
Mit dem Befehl nix-env --rollback kann zurück in die vorherige Generation gewechselt werden. Wenn z. B. ein Update des Paketes htop durchgeführt wurde, macht der Rollback die alte Version wieder zugänglich.
$ htop --version htop 2.2.0 - (C) 2004-2018 Hisham Muhammad Released under the GNU GPL. $ nix-env --rollback switching from generation 60 to 59 $ htop --version htop 2.1.0 - (C) 2004-2018 Hisham Muhammad Released under the GNU GPL.
Zusätzlich zu einem Rollback, der die vorherige Generation aktiviert, kann auch mit der Option --switch-generation in jede andere verfügbare Generation gewechselt werden. Diese parallele Datenhaltung birgt aber auch einen der größten Nachteile von Nix. Da mehrere Versionen eines Paketes zur Verfügung stehen, benötigt Nix mehr Speicherplatz als andere Paketmanager. Um einer übermäßigen Datensammlung vorzubeugen, sollten ältere Generationen in regelmäßigen Abständen gelöscht werden.
Für die Garbage Collection müssen zunächst die Generationen gelöscht werden die nicht mehr benötigt werden, da bei der Garbage Collection nur Pakete gelöscht werden die nicht mehr mit einer Generation verbunden sind. Um alte Generationen zu Löschen, bietet der nix-env Befehl den Schalter --delete-generations.
# Alle Generationen bis auf die aktive löschen $ nix-env --delete-generations old # Die Generationen 11, 12 und 13 löschen $ nix-env --delete-generations 11 12 13 # Alle Generationen löschen die älter wie/als 14 Tage sind. $ nix-env --delete-generations 14d
Anschließend kann die Garbage Collection mit dem Befehl nix-store --gc aufgerufen werden, um den nix-store zu verkleinern.
Fazit
Durch seinen funktionalen Ansatz löst Nix Probleme anderer Packagemanager. Z. B. bietet er Lösungsansätze für Multi-User-Installationen und die Installation von Software durch unprivilegierte Benutzer. Durch den einfach zu nutzenden Rollback-Mechanismus können Updates eingespielt werden, ohne bei fehlerhaften Versionen auf z. B. Backups zurückgreifen zu müssen. Wer die Features von Nix testen möchte, ohne komplett zu wechseln, kann Nix parallel zu dem bestehenden Packagemanager des Systems (Linux und MacOS) installieren und nutzen.
Bei Updates im Blog, informieren wir per E-Mail.
Kommentare