web-dev-qa-db-ja.com

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

nix-envを使用して、SystemDを使用するパッケージをUbuntuホストにインストールするとします。 UbuntuのSystemDにNixパッケージからのSystemDモジュールを認識させるには何が必要ですか?

Apache Kafka パッケージに対して、Nixがインストールされた.serviceファイルを見つけて、/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 package definition のサービス構成の名前に基づいてサービス名を推測しています。その構成がSystemDサービスファイルになる方法と場所を説明するドキュメントは見つかりませんでした。

それがうまくいかなかったとき、どこかにNixがこのサービスファイルを作成したに違いないと想定して、私は実際に調べ始めました。しかし、今、私はそれが存在することを疑い始めています。それでは、NixパッケージマネージャーによってインストールされたSystemDモジュールはNixOSの外部で動作するはずであり、そうであればどのように動作させるのですか?

7
Dan Ross

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

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

したがって、rootとしてパッケージをインストールするときにサービスユニットを使用する場合は、/root/.nix-profile/lib/systemd/systemに加えてパス/etc/systemd/systemがsystemdで使用されていることを確認してください。また、導出が単位を提供することを確認してください。

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

7
danbst

*。serviceファイルの場所

*。serviceファイルの場所については、最近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パッケージ」の正式名)を構築する方法に応じて、*。serviceファイルが結果の$out/lib/systemd/system/ディレクトリで利用できるようになります。 ($outの場合、nix-buildで使用するオプションに応じて、異なる値に置き換える必要がある場合があります。)

具体的には、nix-env -iを使用する場合(あなたの場合はそのまま)、次のようになります。 〜/ .nix-profile /$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のsystemd構成に~.nixprofile/...ディレクトリを認識させるためのいくつかの変更。 (ちなみに、これらのファイルは実質的にSudoアクセスを持つのと同等であるため、特別なユーザーを作成する必要があると思います)
  • nixが提供するすべてのサービスでsystemctl enable --now $SERVICEを実行する「アクティベーション」スクリプト;
    • 理想的には、Nixによって構築されたすべてのサービスを自動有効にする必要はなく、enabledServices = [ ... ];などの追加リストにリストされているサービスのみを有効にする必要があります。
    • 理想的には、「アクティベーション」スクリプトは以前にNixから有効にしていたサービスを無効にする必要がありますが、enabledServicesにはありません(パス.../.nix-profile/...
    • または、おそらく上記は、いくつかの中間的な「nixos-guest.target」に加えて、systemctl daemon-reloadを使用して実行できます。
5
akavel

次の2つの質問があるようです。

  1. Nixはどこにファイルをインストールしますか?
  2. Systemdファイルを動作させるにはどこに配置する必要がありますか?

nixパッケージは、ほぼ間違いなく.Zipまたは.tar.gzのような圧縮アーカイブ形式ですが、拡張子が異なります。ファイルタイプを確認するには、Nixパッケージをダウンロードし、fileツールを使用します。

 file ./my-nix-package

.Zipまたは.tar.gz形式を使用していると仮定すると、関連するZipまたはtarコマンドを使用して、パッケージの内容を一覧表示できます。通常、パッケージの内容はファイルシステムをオーバーレイするため、パッケージに.serviceファイルがあるかどうか、およびファイルがインストールされる場所が確認されます。

Nixは、「このパッケージに属するすべてのファイルはどこにあるのか?」という質問に答えるためのパッケージ化コマンドも持っている可能性があります。

2番目の質問への回答はman systemd.unitにあります。 systemdは、次のディレクトリでsystemd system unitファイルを検索します。これはこの優先順位です。

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

Nixが正常に動作している場合は、systemdファイルが/lib/systemd/systemにインストールされています。 .serviceファイルを別の場所にインストールした場合は、それを/etc/systemd/systemにコピーまたはリンクする必要があります。--/lib/systemd/systemのファイルを変更できるのはパッケージマネージャーのみです。

2
Mark Stosberg

考えるnix-env-インストールされたパッケージがNixOSでもsystemdで見つかりません–systemサービスと言えば、それ以外の場合は欠陥と見なします。 (userサービスの場合、これは理にかなっていますが、サポートのステータスがわかりません。)

2