Wie verwaltet Nix SystemD-Module unter einem Nicht-NixOS?

8

Angenommen, ich nix-envinstalliere ein Paket, das SystemD verwendet, auf einem Ubuntu-Host. Was muss getan werden, um Ubuntus SystemD auf die SystemD-Module aufmerksam zu machen, die aus Nix-Paketen stammen?

Versuchen wir, die von Nix installierten .serviceDateien /lib/systemd/system/für das Apache Kafka- Paket zu finden und sie zu verknüpfen .

nix-env -i apache-kafka
sudo systemctl start apache-kafka # Failed to start apache-kafka.service: Unit apache-kafka.service not found.
sudo updatedb && locate apache-kafka.service # No dice
locate kafka | grep service # Just a bunch of `.nix` files

Hier errate ich den Dienstnamen basierend auf dem Namen der Dienstkonfiguration in der Nix- Paketdefinition . Ich konnte keine Dokumentation finden, die beschreibt, wie und wo diese Konfiguration zu einer SystemD-Dienstdatei wird.

Als das nicht funktionierte, fing ich an, mich wirklich umzuschauen, unter der Annahme, dass Nix diese Servicedatei irgendwo erstellt haben muss. Aber jetzt fange ich an zu bezweifeln, dass es existiert. Sollen vom Nix-Paketmanager installierte SystemD-Module außerhalb von NixOS funktionieren, und wenn ja, wie funktionieren sie?

Dan Ross
quelle
1
Meinten Sie .serviceDateien statt .systemDateien?
Mark Stosberg
Es sieht so aus, als ob github.com/rycee/home-manager bis zu einem gewissen Grad mit Diensten umgehen kann, obwohl ich (noch) nicht viel damit zu tun habe
Ben Creasy
Konnten Sie das lösen? Würde gerne hören, was Sie gelernt haben, da SystemD in keinem der Handbücher behandelt wird (mit Ausnahme eines kurzen Abschnitts im NixOS-Handbuch ).
Toraritte
Ich konnte herausfinden, dass nixos / modules / system / boot / systemd.nix die Servicedateien mithilfe von Hilfsfunktionen aus nixos / modules / system / boot / systemd-lib.nix zusammenfügt , aber noch keine Ahnung, diese Informationen zu verwenden.
Toraritte

Antworten:

8

Unter NixOS können environment.systemPackages = [ package ];die systemd-Einheiten des Pakets im System installiert werden. Beweis

Einheiten in /nix/store/hash-package/lib/systemd/systemwerden kopiert /run/current-system/sw/lib/systemd/system, die dann von systemd als zusätzliches Dienstverzeichnis verwendet werden.

Wenn Sie also bei der Installation des Pakets als Root Serviceeinheiten verwenden möchten, stellen Sie sicher, dass der Pfad /root/.nix-profile/lib/systemd/systemzusätzlich zu systemd verwendet wird/etc/systemd/system . Stellen Sie außerdem sicher, dass die Ableitung die Einheiten enthält.

Völlig ungetestet, weil ich auf NixOS bin

danbst
quelle
5

Standort von * .service Dateien

Eelco Dolstra (Hauptautor von Nix) hat kürzlich eine ähnliche Frage beantwortet , wo sich die * .service- Dateien befinden :

Viele Pakete bieten tatsächlich systemd-Einheiten, zum Beispiel:

$ nix-build -A utillinux.bin

$ ls -l ./result-bin/lib/systemd/system/
total 16
-r--r--r-- 2 root root 155 Jan  1  1970 fstrim.service
-r--r--r-- 5 root root 170 Jan  1  1970 fstrim.timer
-r--r--r-- 2 root root 248 Jan  1  1970 uuidd.service
-r--r--r-- 2 root root 185 Jan  1  1970 uuidd.socket

Je nachdem, wie Sie eine Ableitung erstellen (offizieller Name für ein "Nix-Paket"), sollten die * .service- Dateien im resultierenden $out/lib/systemd/system/Verzeichnis verfügbar sein . (Wo für $outSie müssen möglicherweise unterschiedliche Werte eingesetzt werden, je nachdem, mit welchen Optionen Sie arbeitennix-build .)

Insbesondere wenn Sie nix-env -i verwenden (wie in Ihrem Fall), sollten Sie ~ / .nix-profile / als Ihr $out. Zum Beispiel auf einer meiner Maschinen:

$ ls -l ~/.nix-profile/lib/systemd/system/
total 8
-r--r--r-- 1 akavel akavel 268 sty  1  1970 nix-daemon.service
-r--r--r-- 1 akavel akavel 235 sty  1  1970 nix-daemon.socket

Aktivieren der Dienste in Ubuntus systemd

In Bezug auf diesen Teil der Frage bin ich mir im Moment nicht sicher, wie ich das machen soll, aber ich bin daran interessiert, etwas Ähnliches wie das zu konfigurieren, was Sie beschreiben.

Ich denke, die folgenden zusätzlichen "Teile" könnten benötigt werden:

  • Einige Änderungen in der Ubuntu-Systemkonfiguration, um auf das aufmerksam zu machen ~.nixprofile/... Verzeichnis . (Übrigens: Ich glaube, dafür sollte ein spezieller Benutzer erstellt werden, da diese Dateien dann effektiv dem Sudo-Zugriff entsprechen.)
  • ein "Aktivierungs" -Skript, das systemctl enable --now $SERVICEauf allen von Nix bereitgestellten Diensten ausgeführt wird;
    • Im Idealfall sollten nicht alle von Nix erstellten Dienste automatisch aktiviert werden, sondern nur diejenigen, die in einer zusätzlichen Liste aufgeführt sind enabledServices = [ ... ];.
    • Im Idealfall sollte das "Aktivierungs" -Skript Dienste deaktivieren, die zuvor von Nix aktiviert wurden, jetzt aber fehlen enabledServices(möglicherweise durch Überprüfen der aktiven Dienste in systemctl, die vom Pfad geladen wurden .../.nix-profile/...?).
    • oder könnte oben mit etwas 'nixos-guest.target' etwas getan werden, plus systemctl daemon-reload?
akavel
quelle
2

Es hört sich so an, als hätten Sie zwei Fragen:

  1. Wo installiert Nix Dateien?
  2. Wo müssen sich systemd-Dateien befinden, damit sie funktionieren?

Ihr nixPaket ist mit ziemlicher Sicherheit ein komprimiertes Archivformat wie .zipoder a .tar.gz, jedoch mit einer anderen Erweiterung. Sie können den Dateityp überprüfen, indem Sie das Nix-Paket herunterladen und dann das fileTool verwenden:

 file ./my-nix-package

Angenommen, es verwendet das Format .zipoder .tar.gz, können Sie den Inhalt des Pakets mit dem entsprechenden Befehl zipoder tarBefehl auflisten. Normalerweise überlagern Paketinhalte das Dateisystem, sodass dies für Sie bestätigt, wenn es eine gibt.service Datei im Paket befindet und wo sie möglicherweise installiert ist.

Nix verfügt möglicherweise auch über einen Verpackungsbefehl, um die Frage zu beantworten, wo sich alle Dateien befinden, die zu diesem Paket gehören.

Die Antwort auf Ihre zweite Frage ist in man systemd.unit. systemdsucht in den folgenden Verzeichnissen nach systemd- Systemeinheitendateien , in dieser Reihenfolge:

   /etc/systemd/system/*
   /run/systemd/system/*
   /lib/systemd/system/*

Wenn sich Nix gut benimmt, hätte es systemdDateien installiert /lib/systemd/system. Wenn eine .serviceDatei an einer anderen Stelle installiert wurde , sollten Sie sie kopieren oder verknüpfen. /etc/systemd/systemNur Paketmanager sollten die Dateien in ändern /lib/systemd/system.

Mark Stosberg
quelle
Ja, das Verzeichnislayout von Nix ist das genaue Gegenteil von dem, was POSIX als "gut erzogen" betrachten würde. Erstaunlicherweise funktioniert es auf einem klassischen POSIX-System größtenteils recht gut. Unterschiedliche Ziele, unterschiedliche Stärken, unterschiedliche Probleme.
Dan Ross
Mein Plan war es, Nix-verwaltete Dateien aus einem der üblichen SystemD-Verzeichnisse zu verknüpfen. Etwas, das Nix nicht automatisch tun würde, da dies das Ziel der Unterstützung widersprüchlicher Softwarepaketinstallationen zunichte machen würde. Die Sammlung von Servicedateien des Hostsystems ist eine Form des globalen / Singleton-Status.
Dan Ross
2

Ich denke, nix-env installierte Pakete werden von systemd selbst unter NixOS nicht gefunden, und wenn ich von Systemdiensten spreche , würde ich es als Fehler betrachten, wenn es anders wäre. (Für Benutzerdienste wäre dies sinnvoll, aber ich kenne den Status des Supports nicht.)

Vladimír Čunát
quelle
Ja, ich habe aus diesem Grund nicht erwartet, dass das Host-SystemD installierte Nix-Dateien aufnimmt. Was mich jedoch wirklich in eine Schleife treibt, ist die Tatsache, dass Nix anscheinend nirgendwo Servicedateien erstellt hat - es ist, als würde SystemD verwendet, ohne dass eine der SystemD-Dateien herumwirbelt. Ich nehme an, ich sollte im IRC oder Slack nachfragen oder was auch immer die lokale Entwicklergemeinschaft verwendet.
Dan Ross