Verwendung von NixOS [Grundlagen]

Datum

NixOS ist eine Linux-Distribution auf Basis des Nix-Paketmanagers. Die Distribution basiert auf dem Ansatz deklarativer Systemkonfiguration, um reproduzierbare und zuverlässige Systemkonfiguration und in Folge reibungslose Systemaktualisierungen zu erlauben.

NixOS zeichnen einige spezifische Besonderheiten aus, welche die Distribution von anderen Linux-Distributionen unterscheiden:

  • Deklarative Systemkonfiguration
  • Atomare Upgrades und Rollbacks
  • Reproduzierbare Systemkonfiguration
  • Multi-user-fähige Paketverwaltung

Quelle: wikipedia.org

Nix (Paketmanager): wikipedia.org


Homepage: nixos.org
Download: nixos.org

Wie eine Installation von NixOS surchgeführt werden kann, findet man im folgenden techgoat-Artikel: Installation von NixOS auf einer verschlüsselten Partition (LUKS).
Von daher gehe ich direkt auf einzelne Beispiele bzgl. der Verwendung von NixOS ein…

Ich habe bisher wenige Tutorials gesehen in denen es um die eigentliche An- bzw. Verwendung von Nix(OS) geht. Von daher ist es nicht so leicht und schnell herauszufinden welche Features Nix(OS) bietet und wie man diese benutzt. Darum liste ich nachfolgend mal ein paar grundlegende Besonderheiten und Arbeitsabläufe auf um die Arbeit mit Nix(OS) zu erleichtern.

Pakete suchen

Um nach einem bestimmten Paket zu suchen, verwendet man:
nix search <Paketname>

Beispiel:

[rasputin@nixos:~]$ nix search ansible
* nixpkgs.ansible (python2.7-ansible)
  A simple automation tool
...

Es gibt auch eine Onlinedatenbank mit allen Nix(OS) Paketen, welche durchsuchbar ist. Diese findet sich unter: nixos.org

schauen welche Paketversionen verfügbar sind

Um zu schauen welche Paketversionen angeboten werden verwendet man:
nix-env -qaP <Paketname>

Beispiel:

[rasputin@nixos:~]$ nix-env -qaP go
nixos.go_1_10       go-1.10.8
nixos.go            go-1.11.6
nixos.go_1_12       go-1.12.1
nixos.go_bootstrap  go-1.4-bootstrap-20161024
ein Paket in das persönliche Environment installieren

In Nix(OS) hat man auch als einfacher (nicht-sudo) Benutzer die Möglichkeit Programme zu installieren und zu nutzen und das ohne andere Benutzer davon beeinflusst werden. Hierbei spricht man von einer weiteren „Generation“ die erzeugt wird.

Wenn man das entsprechende Paket installieren möchte, welches Nix(OS) als Standardpaket bereitstellt, so verwendet man:
nix-env -i <Paketname>

Stehen mehrere Paketversionen zur Ausahl, dann kann man diese mit dem zusätzlichen Parameter -A angeben.

Beispiel:

[rasputin@nixos:~]$ nix-env -iA nixos.go_1_12
installing 'go-1.12.1'
these paths will be fetched (95.92 MiB download, 373.67 MiB unpacked):
  /nix/store/9kd1prwr5kkn36x9gw2q62ma24m142db-go-1.12.1
copying path '/nix/store/9kd1prwr5kkn36x9gw2q62ma24m142db-go-1.12.1' from 'https://cache.nixos.org'...
building '/nix/store/g5dj50cagil5anc46vypww5hr7kdz5f6-user-environment.drv'...
created 108 symlinks in user environment

Nun kann ich go in der gewünschten Version verwenden:

[rasputin@nixos:~]$ go version
go version go1.12.1 linux/amd64
anzeigen der im persönlichen Environment installierten Programme

Wenn man prüfen möchte was so alles im persönlichen Environment installiert ist, macht man dies mit:
nix-env -q

Beispiel:

[rasputin@nixos:~]$ nix-env -q
encfs-1.9.5
go-1.12.1
python2.7-ansible-2.7.6
...
ein Programm aus dem persönlichen Environment entfernen

Der Parameter -e entfernt das enstsprechende Programm:

[rasputin@nixos:~]$ nix-env -e go
uninstalling 'go-1.12.1'
Pakete global installieren

Möchte man bestimmte Tools, eventl. sogar mit einer bestimmten Konfiguration, systemweit verfügbar machen, so geschieht das über entsprechende Anpassungen in der /etc/nixos/configuration.nix.

Wenn ein Nix(OS) Paket von einem bestimmten Programm vorhanden ist, dann besteht meist auch die Möglichkeit der Konfiguration per configuration.nix.

Welche möglichen Optionen es gibt erfährt man, wenn man in der entsprechenden Onlinedatenbank (nixos.org) nachschaut. Leider ist mir kein Weg bekannt dies im Terminal durchzuführen.

Hier mal am Beispiel von tmux:

 programs.tmux = {
    enable = true;
    clock24 = true;
    extraTmuxConf = ''
      bind | split-window -h
      bind - split-window -v
...
    '';
  };

Anschließend werden durch den Befehl nixos-rebuild switch die Anpassungen in der configuration.nix ausgerollt und ein entsprechender Boot-Eintrag wird angelegt.

Möchte man eine Änderung vornehmen, aber ohne entsprechenden Boot-Eintrag, so verwendet man:
nix-rebuild test

Sollte man das System dann neu starten oder sollten abstürzen sind nach einem Neustart alle gemachten Änderungen automatisch tückgängig gemacht.

Anpassungen rückgängig machen

Gemachte Änderungen nach einem nixos-rebuild switch kann man mit nixos-rebuild rollback wieder rückgängig machen.

Sollten mal ausgerollte Anpassungen (im persönlichen Environment) wieder zurückgebaut werden müssen, so verwendet man:
nix-env --rollback

[rasputin@nixos:~]$ nix-env --rollback
switching from generation 10 to 9
ein Programm in einer interaktiven Shell testen

NixOS bietet die Möglichkeit sich relativ schnell und einfach eine Entwicklungsumgebung zu bauen um neue Sachen zu testen oder kurz bestimmte Programme zu nutzen ohne diese dauerhaft zu installieren.

Hierfür verwendet man den Befehl nix-shell -p <Programmname>

Im folgenden Beispiel kompiliere ich ein „Hello World“ go Programm…

[rasputin@nixos:~]$ cat hello_world.go 
package main
import "fmt"
func main() {
    fmt.Println("hello world")
}

In meiner bisherigen Umgebung gibt es noch kein go:

[rasputin@nixos:~]$ go version
go: command not found

Nun starte ich mit dem Befehl nix-shell eine interaktive Shell, welche das bzw. die entsprechenden Programme enthält:

[rasputin@nixos:~]$ nix-shell -p libcap go gcc
these paths will be fetched (83.81 MiB download, 332.44 MiB unpacked):
  /nix/store/7mmn8ri08z48vfj69c2h66f3g349ilq1-mailcap-2.1.48
  /nix/store/8lnmg3zapkyhfg4vfp8lv8w1cw84738p-go-1.11.6
  /nix/store/9z1b1ldrhxh7brsi6fxnyjm7gk8kiynv-bash-interactive-4.4-p23-dev
  /nix/store/kqqcclygdzvgyrm4lgq7hma2xi7f8v5s-libcap-2.26-dev
  /nix/store/yz9ynfpyylnpmly7pjnc32qwbj8wq4ki-attr-2.4.48-dev
copying path '/nix/store/7mmn8ri08z48vfj69c2h66f3g349ilq1-mailcap-2.1.48' from 'https://cache.nixos.org'...
copying path '/nix/store/yz9ynfpyylnpmly7pjnc32qwbj8wq4ki-attr-2.4.48-dev' from 'https://cache.nixos.org'...
copying path '/nix/store/9z1b1ldrhxh7brsi6fxnyjm7gk8kiynv-bash-interactive-4.4-p23-dev' from 'https://cache.nixos.org'...
copying path '/nix/store/8lnmg3zapkyhfg4vfp8lv8w1cw84738p-go-1.11.6' from 'https://cache.nixos.org'...
copying path '/nix/store/kqqcclygdzvgyrm4lgq7hma2xi7f8v5s-libcap-2.26-dev' from 'https://cache.nixos.org'...

Ich habe hierbei neben go noch gcc und libcap eingefügt um zu zeigen das man sich beliebig viele Programme in die Shell ziehen kann…
Nun startet sich automatisch die entsprechende shell und hier ist nun go verfügbar:

[nix-shell:~]$ go version
warning: GOPATH set to GOROOT (/nix/store/8lnmg3zapkyhfg4vfp8lv8w1cw84738p-go-1.11.6/share/go) has no effect
go version go1.11.6 linux/amd64

Da hier auch bereits alle Dateien weiterhin vorhanden sind kann ich go auch direkt anwenden:

[nix-shell:~]$ go run hello_world.go 
warning: GOPATH set to GOROOT (/nix/store/8lnmg3zapkyhfg4vfp8lv8w1cw84738p-go-1.11.6/share/go) has no effect
hello world

Natürlich kann man den go Quellcode auch zu einer Binärdatei kompilieren:

[nix-shell:~]$ go build hello_world.go 
warning: GOPATH set to GOROOT (/nix/store/8lnmg3zapkyhfg4vfp8lv8w1cw84738p-go-1.11.6/share/go) has no effect

Nachdem die Shell mit einem exit verlassen wird ist auch go aus unseren Pfaden verschwunden, aber die die eben kompilierte Binärdatei ist noch da und bereit zum ausführen:

[rasputin@nixos:~]$ ll | grep hello_world
-rwxr-xr-x 1 rasputin users 1915137 29. Aug 17:42 hello_world
-rw-r--r-- 1 rasputin users      74 29. Aug 17:42 hello_world.go
[rasputin@nixos:~]$ ./hello_world 
hello world
alte „Generationen“ entfernen

mit nix-env --delete-generations old werden alle „Generationen“, außer der aktuell laufenden, entfernt.

[rasputin@nixos:~]$ nix-env --delete-generations old                                                                                                                                                                                          
removing generation 1                                                                                                                                                                                                                         
removing generation 2                                                                                                                                                                                                                         
...

zusätzlich:

[root@nixos01:~]#  nix-env -p /nix/var/nix/profiles/system --list-generations
   1   2019-09-07 19:57:36
   2   2019-09-07 20:08:40
   3   2019-09-07 20:37:54
   4   2019-09-07 20:55:04
   ...
  62   2019-12-08 04:40:38
  63   2019-12-09 04:41:51   (current)
[root@nixos01:~]#  nix-env -p /nix/var/nix/profiles/system --delete-generations old
removing generation 1
removing generation 2
removing generation 3
...
removing generation 61
removing generation 62
alte nix-storage Pfade entfernen

Nix(OS) hat auch einen eigenen „Garbage Collector“, welcher nach nicht mehr verwendeten Nix-Store Pfaden sucht und diese entfernt.

[rasputin@nixos:~]$ nix-collect-garbage                                                                                                                                                                                                       
finding garbage collector roots...                                                                                                                                                                                                            
removing stale link from '/nix/var/nix/gcroots/auto/cih1v4mvwi86vp5fw5wasr6192c2vywd' to '/tmp/nix-build-19665-0/result'                                                                                                                      
removing stale link from '/nix/var/nix/gcroots/auto/lpq7zmz9l2ir390ppx42hxb4mqnxdw0y' to '/tmp/nixos-rebuild.txpoN4/nix.drv'                                                                                                                  
removing stale link from '/nix/var/nix/gcroots/auto/b1753jgkb6qqnb6aq5cqrnj8p2kkbpi5' to '/tmp/nixos-rebuild.DDZl9B/nix'                      
...
deleting '/nix/store/9abz1ynjdckkbx40gdnhr03skfjb740b-ghc-paths-0.1.0.9.tar.gz.drv'
deleting '/nix/store/trash'
deleting unused links...
note: currently hard linking saves -0.00 MiB
1308 store paths deleted, 435.76 MiB freed

Autor
Kategorien Linux, NixOS

PRTG Map