Nix 如何在非 NixOS 上管理 SystemD 模块?

Nix 如何在非 NixOS 上管理 SystemD 模块?

假设我nix-env在 Ubuntu 主机上安装一个使用 SystemD 的软件包。需要做什么才能让 Ubuntu 的 SystemD 识别来自 Nix 软件包的 SystemD 模块?

让我们尝试查找 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 中的服务配置名称猜测服务名称包定义。我无法找到任何描述该配置如何以及在何处成为 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 身份安装软件包时使用服务单元,请确保/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-profile/身为你的$out。例如,在我的一台机器上:

$ 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 访问权限)
  • 一些可以systemctl enable --now $SERVICE在所有 Nix 提供的服务上运行的“激活”脚本;
    • 理想情况下,并非 Nix 构建的所有服务都应该自动启用,只有在某些附加列表中列出的服务才应该自动启用,例如enabledServices = [ ... ];其他列表;
    • 理想情况下,“激活”脚本应该禁用以前从 Nix 启用但现在丢失的服务enabledServices(也许通过检查从路径加载的 systemctl 中的活动服务.../.nix-profile/...?)
    • 或者也许上面可以通过一些中间的“nixos-guest.target”事情来完成,加上systemctl daemon-reload

答案3

思考 nix-env- 即使在 NixOS 上,systemd 也找不到已安装的软件包 – 说到系统服务,如果不是的话我会认为这是一个缺陷。 (为了用户服务这很有意义,但我不知道支持的状态。)

答案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 --user,从而使 Nix systemd 单元文件可以从~/.nix-profile/share/systemd/user.

man 5 systemd-user.confman 5 systemd.unit了解更多信息。

相关内容