Nixは、NixOS以外のシステムでSystemDモジュールをどのように管理しますか?

Nixは、NixOS以外のシステムでSystemDモジュールをどのように管理しますか?

nix-envUbuntuホストにSystemDを使用してパッケージをインストールするとします。 UbuntuのSystemDにNixパッケージのSystemDモジュールを認識させるにはどうすればよいですか?

.serviceNixがインストールしたファイルを見つけてシンボリックリンクにリンクしましょう/lib/systemd/system/アパッチカフカパック。

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

ここでは、Nixのサービス構成名に基づいてサービス名を推測します。パッケージ定義。この構成がSystemDサービスファイルになる方法と場所を説明する文書が見つかりません。

それでもうまくいかなかったので、Nixがどこかにこのサービスファイルを作成したことは間違いないと仮定して本格的に調査を始めました。しかし、今はそれが存在するかどうか疑問になり始めました。もしそうなら、NixパッケージマネージャがインストールしたSystemDモジュールはNixOSの外部で動作する必要がありますか?それでは、どのように機能させるのでしょうか?

答え1

NixOSでは、environment.systemPackages = [ package ];パッケージのsystemdユニットを使用してシステムにインストールできます。証明する

の単位は、/nix/store/hash-package/lib/systemd/systemにコピーされた/run/current-system/sw/lib/systemd/system後、systemdで追加のサービスディレクトリとして使用されます。

したがって、ルートとしてパッケージをインストールするときにサービスユニットを使用するには、サービスユニットを追加/root/.nix-profile/lib/systemd/systemで提供する必要があります/etc/systemd/system

NixOSを使用しているので、完全にテストされていません。

答え2

場所*。提供する文書

どこについて*。提供するEelco Dolstra(Nix州の著者)が最近見つけたファイル同様の質問に回答しました:

多くのパッケージは実際にsystemdユニットを提供します。たとえば、次のようになります。

$ 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

したがって、フォーク(「Nixパッケージ」の公式名)を構築する方法に応じて*。提供するファイルは結果ディレクトリで利用可能でなければなりません$out/lib/systemd/system/。 ($out使用するオプションによっては、他の値を置き換える必要がありますnix-build。)

具体的には、使用するときニックス環境-i(あなたの場合のように)調査する必要があります~/.nix-プロフィール/あなたのもの$out。たとえば、私のコンピュータの1つでは:

$ 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

Ubuntuのsystemdでサービスを有効にする

質問のこの部分については、現在これを行う方法がわかりませんが、あなたが説明するものと同様のものを構成したいと思います。

次のような追加の「部分」が必要になる可能性があると思います。

  • このディレクトリを認識できるように、Ubuntuシステムの設定が一部変更されました~.nixprofile/...。 (BTW:このファイルは実際にはsudoアクセス権を持っているものと同じですので、このためにいくつかの特別なユーザーを作成する必要があると思います。)
  • systemctl enable --now $SERVICENixが提供するすべてのサービスで実行できるいくつかの「アクティブ化」スクリプト。
    • enabledServices = [ ... ];理想的には、Nixによって構築されたすべてのサービスが自動的に有効になるわけではなく、他のリストなど、いくつかの追加リストにリストされているサービスのみを有効にする必要があります。
    • 理想的には、「アクティブ化」スクリプトは以前Nixで有効になっていましたが、今は欠落しているサービスを無効にする必要がありますenabledServices(おそらくパスからロードされたsystemctlのアクティブなサービスをチェックして.../.nix-profile/...?)
    • あるいは、上記の操作を中間の「nixos-guest.target」エントリとして実行することもできますsystemctl daemon-reload

答え3

考える nix-env- systemdはNixOSにインストールされたパッケージを見つけることができません。システムサービスじゃなかったら欠陥だと思っていただろう。 (のためユーザーサービスの話になりますが、サポートの状態がわかりません。 )

答え4

次のファイルを作成します~/.config/systemd/user.conf(ユーザー名を変更する必要があります)。

[Manager]
ManagerEnvironment="XDG_DATA_DIRS=/home/your_user/.nix-profile/share:/usr/local/share:/usr/share"

これは起動時にXDG_DATA_DIRSプロセス環境に注入され、systemd --userNixシステムユニットファイルをからダウンロードできます~/.nix-profile/share/systemd/user

バラよりman 5 systemd-user.confそしてman 5 systemd.unitより多くの情報を知りたいです。

関連情報