NixOs:nixos以外のオペレーティングシステムでサービスを使用すると、ユーザー権限のみが残ります。

NixOs:nixos以外のオペレーティングシステムでサービスを使用すると、ユーザー権限のみが残ります。

たとえば、Nixではなくオペレーティングシステムのモジュールで説明されているサービスを実行する方法を知りたいと思います。たとえば、次のようなファイルがあるとします。

{config, pkgs, ... }:
{
  systemd.user.services.mytestservice = {
    description = "Mytestservice";
    script = "while true; do echo 'YES'; sleep 1; done";
    wantedBy = [ "default.target" ];
 };
}

(またはユーザーがいなくなりますsystemd.services.mytestservice =。)

root以外のユーザーがそれをコンパイルし、nixos以外のオペレーティングシステムで実行するにはどうすればよいですか?

ベストアンサー1

感謝の言葉:すべての説明に感謝clever

まず、設定ファイルを作成しますmyconfiguration.nix

{config, pkgs, ... }:

{
  # You can actually remove the user, and still use it
  # as a user if you link it in ~/.config/systemd/user/
  # (do not forget to remove the `user` it in anything.nix
  # as well)
  systemd.user.services.mytestservice = {
   description = "Mytestservice";
   script = "while true; do echo 'YES'; sleep 1; done";
   # Or:
   # serviceConfig = {
   #   ExecStart = "${pkgs.bash}/bin/bash -c \"while true; do echo 'YES'; sleep 1; done\"";
   # };
   wantedBy = [ "default.target" ];
 };
}

その後、いくつかのことができます。

  • それをコンパイルする
  • インストールする

コンパイルのみを行うには、次のことができます。

nix-build '<nixpkgs/nixos>' -I nixos-config=myconfiguration.nix -A 'config.systemd.user.units."mytestservice.service".unit'

default.nixアイデアは、これがフォルダ内のファイルをロードすることです/your/nixpkgs/copy/nixos/(パスを取得するために、nixpkgs次のようないくつかの「サブキー」を含む変数をチェックします)。オンラインで入手できます。NIX_PATHNIX_PATH=nixpkgs=/your/nixpkgs/copy/:othervar=thepathここ。このファイルは、環境変数にnixos-configエントリを追加する<nixos-config>ためにも必要です。その後、そうでない場合は nixos 全体を構築しようとするので、このサービスユニットのみが必要であることを指定します。-INIX_PATH-A

mytestservice.serviceこれにより、次のファイルが生成されます。

$ cat result/mytestservice.service 
[Unit]
Description=Mytestservice

[Service]
Environment="LOCALE_ARCHIVE=/nix/store/zzhablipzgpv8mvlcvagqjnham6lr944-glibc-locales-2.27/lib/locale/locale-archive"
Environment="PATH=/nix/store/bv1lw6a2kw0mn2y3lxhi43180idx6sp9-coreutils-8.31/bin:/nix/store/s1n4vl1f3in3nacalrc3xam0vyzpsfvs-findutils-4.6.0/bin:/nix/store/7d9bi31h40hky30f5scqx7r6wn311ain-gnugrep-3.3/bin:/nix/store/qg4qbkbca7qapfzpa8p991yjf944fc3w-gnused-4.7/bin:/nix/store/6bvd29jny80ka8df9prr5hrl5yz7d98k-systemd-239.20190219/bin:/nix/store/bv1lw6a2kw0mn2y3lxhi43180idx6sp9-coreutils-8.31/sbin:/nix/store/s1n4vl1f3in3nacalrc3xam0vyzpsfvs-findutils-4.6.0/sbin:/nix/store/7d9bi31h40hky30f5scqx7r6wn311ain-gnugrep-3.3/sbin:/nix/store/qg4qbkbca7qapfzpa8p991yjf944fc3w-gnused-4.7/sbin:/nix/store/6bvd29jny80ka8df9prr5hrl5yz7d98k-systemd-239.20190219/sbin"
Environment="TZDIR=/nix/store/20wmykp8fj2izxdj8lic8ggcfpdid5ka-tzdata-2019a/share/zoneinfo"



ExecStart=/nix/store/1f0wk7l4p7xv257dci8xxqz1k8nai9va-unit-script-mytestservice-start 

今すぐ呼び出せるようにインストールする必要があります。

nix-env -f '<nixpkgs/nixos>' -I nixos-config=myconfiguration.nix -iA 'config.systemd.user.units."mytestservice.service".unit'

これmytestservice.serviceはに接続されます~/.nix-profile/mytestservice.service。しかしsystemctlはそれがにあると期待するので~/.config/systemd/user/私達はそれを接続します:

ln -s ~/.nix-profile/mytestservice.service ~/.config/systemd/user/

その後、デーモンを再ロードする必要があり、次のことを試すことができます。

systemctl --user daemon-reload
systemctl --user start mytestservice.service

ただし、ビルド/インストールコマンドは複雑で入力に時間がかかるため、すべてをanything.nixビルドするファイルを作成できます。たとえば、次のようになります。

let
  eval = import <nixpkgs/nixos> {
    configuration = ./myconfiguration.nix;
  };
  pkgs = import <nixpkgs>{};
in pkgs.buildEnv {
  name = "things";
  paths = [
    eval.config.systemd.user.units."mytestservice.service".unit
  ];
}

これで、次のコマンドを使用してコンパイルできます。

nix-build anything.nix

インストールして

nix-env -f anything.nix -i things

別の方法で最初にインストールしたファイルを削除する必要があるかもしれません。方法は次のとおりです。

nix-env --query
nix-env --uninstall unit-mytestservice.service

最後に、両方のコードがこのように動作するsystemd.servicesようです。 :Dsystemd.services.users

おすすめ記事