假设我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
?
- 理想情况下,并非 Nix 构建的所有服务都应该自动启用,只有在某些附加列表中列出的服务才应该自动启用,例如
答案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
.