Nixos Remote
Inhalt
NixOS remote build⌗
Da bei NixOS die gesamte Konfiguration des Systems in der Konfigurationsdatei liegt, kann man ein System von einem anderen Rechner aus Kontrollieren und einstellen. Dieses Modell bietet sich natürlich sehr für Server an, vorallem solche, auf die man keinen Physichen Zugriff hat. Allerdings ist es auch in meinem Fall von großem Nutzen. Ich habe noch einen zweiten Laptop, der kleiner ist und den ich daher mit auf Reisen oder zum Lernen verwende. Für alles andere verwende ich meinen Hauptlaptop. Wegen dieser klaren hierarchie, ist es einfach alle Rechner von einem Zu verwalten.
Da meine NixOS Konfiguration auf einer Flake basiert, kann ich sogar alles von einer Konfiguration aus machen. Das hat den Vorteil, dass alle Versionen von der gleichen Lockfile gepinnt werden und ich so eine Sicherheit habe, dass sich die Dinge bei allen Systemen gleich verhalten. Außerdem verringere ich so meinen Aufwand, was sich wiederholende Einstellungen an geht. Da ich auch eine Geheimnisverwaltung in meinem System integriert habe kann ich so auch Schlüssel teilen, ohne manuell Dateien kopieren zu müssen. So lässt sich auch das Hinzufügen neuer Geräte sehr vereinfachen und auch eigene Pakete und Module auf alle übertragen werden.
Damit das funktioniert muss das Zielsystem ein Stück weit vorbereitet sein. Es muss natürlich NixOS
installiert sein1, man muss SSH Zugang haben, und der Nutzer auf dem Zielsystem, der das System bauen soll,
muss als trusted-user
beim nix
Paketverwalter gelten.
nix.settings.trusted-users = ["<name>"];
Da in meinem Fall eine Flake installiert/gebaut werden soll, muss ich außerdem Flakes aktivieren, denn sie sind noch als experimentell markiert.
nix.settings.experimental-featues = ["nix-command" "flakes"];
Wenn das System also so läuft (also nach einem Rebuild), kann ich meine neue Konfiguration ohne lokales Zutun überspielen. Dabei gibt es verschiedene Optionen, was das bauen an geht. Man kann die Einstellungen lokal bauen und wo anders einsetzen, oder jede Kombination dieser Beiden. Ich möchte an der Stelle darauf verweisen, dass es sich sehr empiehlt streng darauf zu achten, dass man zumindest die obrigen Einstellungen übernimmt, denn sonst hat man sich sehr schnell den Zugang versperrt. Bei einem Server ist das besonders schlecht, denn man hat ja keine anderen Eingabemethoden. Andere Optionen, die man setzten sollte sind zum Beispiel auch der SSH Schlüssel:
users.users.<name>.openssh.authoriszedKeys.keys = [
<public-key-of-the-main-machine>
];
services.openssh = {
enable = true;
settings.PasswirdAuthentication = false;
};
Der Befehl um die ganze Magie auszufühen ist:
NIX_SSHOPTS="-tt" nixos-rebuild -s --fast --flake /etc/nixos/#<hostname> --target-host <remote-user-name>@<host> -s --use-remote-sudo switch
Hier wird zu Beginn die Systemvariable NIX_SSHOPTS
gesetzt, denn man benötigt auf dem Zielgerät root
Berechtigungen und so wird die Passwortabfrage weitergegeben und im Terminal angezeigt bzw abgefragt. In
diesem Beispiel baue ich die Einstellungen auf meinem System und setze es beim <host>
ein.
Damit das Funktioniet muss die Konfigurations-Flake auf eine bestimmte, allerdings auch weit verbreitete und im Wiki empfohlen/beschriebene Art und Weise aufgebaut sein.
{
nixosConfigutations = {
<host1> = nixpkgs.lib.nixosSystem { ... };
<host2> = nixpkgs.lib.nixosSystem { ... };
...
};
}
Wobei host
für den jeweiligen Hostname seht.
-
Es gibt Projekte, die auch das vereinfachen wollen, so zum Beispiel NixOS-anywhere. Ich habe es noch nie verwendet aber der Ansatz ist, über einen
kexec
den Kernel zu NixOS zu wecheln, während das System läuft und die SSH Verbindung steht und dann so das neue System zu bauen und einzurichten und so de facto NixOS zu installieren. Wie gesagt, ich habe es noch nie ausprobiert. ↩︎