假设我使用nix-env在Ubuntu主机上安装了一个使用SystemD的包。要使Ubuntu的SystemD知道来自Nix包的SystemD模块,需要做什么?
让我们尝试查找已安装的.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之外工作,如果是,我们如何使它们工作呢?
发布于 2017-06-01 05:43:39
在NixOS上,可以使用environment.systemPackages = [ package ];将软件包的系统单元安装到系统中。证明
/nix/store/hash-package/lib/systemd/system中的单元被复制到/run/current-system/sw/lib/systemd/system中,系统d将其作为额外的服务dir使用。
因此,如果您希望在将包安装为root时使用服务单元,请确保系统除了使用/root/.nix-profile/lib/systemd/system之外,还使用了路径/etc/systemd/system。此外,请确保派生提供单元。
完全未经测试,因为我在NixOS上
发布于 2017-03-05 14:51:40
听起来你有两个问题:
您的nix包几乎肯定是压缩的存档格式,如.zip或.tar.gz,但扩展不同。您可以通过下载Nix包,然后使用file工具来检查文件类型:
file ./my-nix-package假设它使用的是.zip或.tar.gz格式,那么您可以使用相关的zip或tar命令列出包的内容。通常包内容覆盖文件系统,因此这将为您确认包中是否有.service文件,以及它可能安装在何处。
Nix还可以使用packakge命令来回答“属于这个包的所有文件在哪里?”
你的第二个问题的答案是man systemd.unit。systemd将在以下目录中查找systemd系统单元文件,此首选项顺序如下:
/etc/systemd/system/*
/run/systemd/system/*
/lib/systemd/system/*如果Nix行为良好,它就会将systemd文件安装到/lib/systemd/system中。如果它在其他地方安装了一个.service文件,那么您应该将它复制或链接到/etc/systemd/system中--只有包管理器应该修改/lib/systemd/system中的文件。
发布于 2017-03-05 19:46:38
我认为nix-env-installed包即使在NixOS上也找不到--说到系统服务,如果不是这样的话,我会认为它是一个缺陷。(对于用户服务来说,这是有意义的,但我不知道支持的状态。)
https://unix.stackexchange.com/questions/349199
复制相似问题