Ich baue gerade alles um. Bereits (wieder) funktionierend:
- home-manager: trillian
[TOC]
Nix deckt eine große Bandbreite ab:
- Paketmanager:
- Nix alleine benutzt sich wie ein normaler imperativer Paketmanager, wie z.B. APT.
- Ermöglicht deklarative Development-Environments
- Systemkonfiguration:
- NixOS: Konfigurationsmodule die aus Nix eine eigenständige voll-deklarative Linux-Distri machen.
- nix-darwin: Konfigurationsmodule, analog zu NixOS, deklarative Systemkonfiguration für macOS.
- system-manager: Konfigurationsmodule, analog zu NixOS, deklarative Systemkonfiguration für systemd-Linux-Distributionen
- Nutzerkonfiguration:
- home-manager: Konfigurationsmodule, um alle Nutzer-Aspekte zu konfigurieren.
Nix läuft auf macOS und den mmeisten Linux-Distributionen. Native Windows- und FreeBSD-Unterstützung ist in Arbeit. Nix sollte als Daemon installiert werden, kann aber auch ohne installiert werden. (Auf die Nachteile gehe ich hier nicht ein.) Die instzallierten Pakete landen in /nix/store.
NixOS, nix-darwin und system-manager, als auch home-manager können separat betrieben. In diesem Fall updatet man System und Nutzer getrennt voneinander. Man kann allerdings auch home-manager in der jeweiligen Systemkonfiguration einhängen. Beide Varianten sind gleich gut. Die meisten Nix-User binden den home-manager in die System-Konfig ein.
(macOS, Linux und Win/WSL)
Ich verwende hier den DetSys Nix Installer. Erstens, weil es einfacher zu deinstallieren ist und zweitens, weil die experimentellen Funktionen "nix-command" und "flakes" standardmäßig aktiv sind. Nix kann natürlich auch mit dem original installer installiert werden. Dann müssen aber die beiden experimentellen Funktionen manuell aktiviert werden.
# Nur macOS: xcode command line tools installieren
xcode-select --install
# Installation via DetSys Installer, disable sending telemetry via --diagnostic-endpoint
curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install --diagnostic-endpoint=""
# Neue Shell öffnen
exec $SHELL
# Optional: Nix-Installation testen
nix-shell -p nix-info --run "nix-info -m"
Leider überschreibt macOS bei Aktualisierungen immer die Datei /etc/zshrc. Das ist insofern ein Problem, als der Hook für Nix hier steht (und stehen muss). Um dieses Problem zu umgehen, kann man einen launchd-Job verwenden, der bei jedem Systemstart prüft, ob dieser Hook noch vorhanden ist und ihn ggf. neu schreibt:
-
Kopiere die Datei ./darwin/org.nixos.darwin.check-zshrc-nix-hook.plist nach
/Library/LaunchDaemons/
-
Setze den korrekten Nutzer und Zugriffsrechte:
sudo chown root:wheel /Library/LaunchDaemons/org.nixos.darwin.check-zshrc-nix-hook.plist sudo chmod u=rw,go=r /Library/LaunchDaemons/org.nixos.darwin.check-zshrc-nix-hook.plist
-
Lade den launchd job:
sudo launchctl load /Library/LaunchDaemons/org.nixos.darwin.check-zshrc-nix-hook.plist
Using Nix only as a package manager is very like using imperative package manager like apt.
Paket suchen
nix search <search string>
Paket installieren
nix profile install <package>
Installierte Pakete auflisten
nix profile list
Paket deinstallieren
nix profile remove <package>
Pakete updaten
nix profile update <package>
Alte Pakete aufräumen (alle)
Aufgrund der Funktionsweise von Nix, bleiben alte Paketversionen nach einem Update erhalten (was Rollbacks erst ermöglicht). Der Nachteil ist allerdings, daß man von Zeit zu Zeit die älteren Pakete entfernen sollte. Über die Zeit können sonst einige GB zusammenkommen.
nix-collect-garbage -d
Alte Pakete aufräumen (älter als n)
# Beispiel für period: 14d (14 Tage)
nix-collect-garbage --delete-older-than <period>
Wenn Nix über das ursprüngliche Installationsprogramm installiert wurde, ist manuelle Arbeit erforderlich. Mehr dazu im Nix-Handbuch. Wenn das DetSys-Installationsprogramm verwendet wurde, ist es einfach:
# wenn der launchd job `check-zshrc-nix-hook.plist` installiert wurde:
sudo launchctl bootout system/org.nixos.darwin.check-zshrc-nix-hook
sudo rm /Library/LaunchDaemons/org.nixos.darwin.check-zshrc-nix-hook.plist
# wenn der DetSys Installer benutzt wurde:
/nix/nix-installer uninstall
(macOS, Linux, NixOS, Windows/WSL)
Grundsätzlich kann das Repo in einem beliebigen Ordner liegen, Je nach Nutzung böten sich aber folgende Ordner an: @TODO
- für home-manager (stand-alone):
~/.config/home-manager
- für nix-darwin (incl. home-manager):
~/.config/nix-darwin
oder/etc/nix-darwin
- für system-manager (incl. home-manager):
@TODO
- für NixOS (incl. home-manager):
/etc/nixos
git clone [email protected]:mbrasch/sysconfigs.git <destination>
⚠️ z.B. wenn man die gewünschte Konfig auf der jeweiligen Maschine niemals ändern möchte (also immer nur die aktuellste Git-Version), kann man auch auf das Clonen des Repos verzichten.In dem Fall setzt man anstelle des Punktes (z.B.
home-manager switch --flake .#<config-name>
) die Git-Adresse ein (z.B.home-manager switch --flake github:mbrasch/sysconfigs#<config-name>
).
⚠️ eigentlich selbstredend, aber vorsichtshalber sei erwähnt: dazu muß allerdings schon die Konfig für die jeweilige Machine Git-Repo angelegt sein
./flake.nix
an die eigenen Bedürfnisse angepasst werden:
username
undsystem
inhomeConfigurations.<username>
hostname
indarwinConfiguration.<hostname>
(macOS, Linux, NixOS, Windows/WSL)
⚠️ When using home-manager stand-alone, you have to configure nix via /etc/nix.nix.conf. (home-manager is only for user configuration.)
# build configuration
nix build .#homeConfigurations.<username>.activationPackage [--refresh]
# apply configuration
./result/activate
Falls man bei nix build
direkt von einem Git-Repo baut und der Build abbricht und man eine Änderung an der Konfig auf dem Git vornimmt, kann man Nix zwingen die Konfig neu aus dem Repo zu laden:
nix flake update --flake github:mrasch/sysconfigs
Flake updaten
nix flake update github:mbrasch/sysconfigs#mbrasch
Konfiguration neu bauen
# wenn die Config in ~/.config/home-manager liegt
home-manager switch
# wenn die Config in einem beliebigen anderen Ordner liegt
home-manager switch [--flake .#<config>]
Alle Pakete auflisten, die in home-manager-path
installiert sind
home-manager packages
Alle home-manager Generationen auflisten
home-manager generations
Zu einer vorherigen Generation wechseln
# list generations
home-manager generations
# copy the full store path of the desired generation out of the list
# paste it to the terminal and tab-autocomplete it to the activation script
/nix/store/<some-hash>/activate
Generationen via IDs entfernen
# get the IDs via generations subcommand
home-manager remove-generations <id 1> <id 2> …
Generations älter als n Tage oder vor einem spezifischen Tag entfernen
home-manager expire-generations [ -n days | yyyy-mm-dd ]
remove home manager from the user environment. this will
- remove all managed files from the home directory,
- remove packages installed through Home Manager from the user profile, and
- remove all Home Manager generations and make them available for immediate garbage collection.
home-manager uninstall
(macOS)
# build and install the base configuration
nix run nix-darwin -- switch --flake ".#trillian"
# delete this, otherwise darwin-rebuild will fail to create a symlink
# to the generated nix config
sudo rm /etc/nix/nix.conf
# create "/run" for nix-darwin and force applying
echo 'run\tprivate/var/run' | sudo tee -a /etc/synthetic.conf
/System/Library/Filesystems/apfs.fs/Contents/Resources/apfs.util -t
# finally run apply the bootstrap configuration
./result/sw/bin/darwin-rebuild switch --flake .#trillian
# open new shell
exec $SHELL
nix build ".#darwinConfigurations.aarch64-darwin.trillian.system"
sudo ./result/activate-user
apply configuration changes
darwin-rebuild switch --flake github:mbrasch/sysconfigs#trillian
(NixOS)
apply configuration changes
nixos-rebuild switch --flake github:mbrasch/sysconfigs#mbrasch
(Linux, Windows/WSL)