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.

1
Git Shortcuts für mehr Effizienz in der täglichen ...
MATSE und AMI – der neue duale Studiengang bei der...

Unsere Autoren

Axel Röber
4 post(s)
Andre Dirr
4 post(s)
Dr. Stefan Koch
5 post(s)
Carsten Griese
3 post(s)

Technologie Blogs

Tutorials

4 members

Webentwicklung

3 members

Java

3 members

Archiv | Blog-Beiträge

Login