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>我們用來-I將 nixos-config 條目加入NIX_PATH環境變數。然後,如果沒有-A,它將嘗試建立一個完整的 nixos,因此我們只需指定我們只需要這個服務單元。

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似乎systemd.services.users都可以用這個方法使用:D

相關內容