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の外部で動作するはずであり、そうであればどのように動作させるのですか?
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を使用しているため、完全にテストされていません
*。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
質問のこの部分については、現時点ではこれを行う方法がわかりませんが、あなたが説明したものと同様のものを構成することに興味があります。
次の「パーツ」がさらに必要になると思います。
~.nixprofile/...
ディレクトリを認識させるためのいくつかの変更。 (ちなみに、これらのファイルは実質的にSudoアクセスを持つのと同等であるため、特別なユーザーを作成する必要があると思います)systemctl enable --now $SERVICE
を実行する「アクティベーション」スクリプト; enabledServices = [ ... ];
などの追加リストにリストされているサービスのみを有効にする必要があります。enabledServices
にはありません(パス.../.nix-profile/...
?systemctl daemon-reload
を使用して実行できます。次の2つの質問があるようです。
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
のファイルを変更できるのはパッケージマネージャーのみです。
私考えるnix-env
-インストールされたパッケージがNixOSでもsystemdで見つかりません–systemサービスと言えば、それ以外の場合は欠陥と見なします。 (userサービスの場合、これは理にかなっていますが、サポートのステータスがわかりません。)