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