【问题标题】:How to install systemd service on nixos如何在 nixos 上安装 systemd 服务
【发布时间】:2019-10-04 22:18:42
【问题描述】:

如果我这样做:

#!/usr/bin/env bash

set -e;

cd "$(dirname "$BASH_SOURCE")"

ln -sf "$(pwd)/interos-es-mdb.service" '/etc/systemd/system/interos-es-mdb.service'

systemctl enable interos-es-mdb.service
systemctl start interos-es-mdb.service

然后我得到这个错误:

ln: 无法创建符号链接 '/etc/systemd/system/interos-es-mdb.service': 只读文件系统

有人知道在 nixos 机器上安装服务的正确方法吗? (我是root用户)...这里是服务供参考:

[Unit]
Description=Interos MongoDB+ES log capture
After=network.target

[Service]
Environment=interos_emit_only_json=yes
EnvironmentFile=/root/interos/env/es-service.env
StartLimitIntervalSec=0
Type=simple
Restart=always
RestartSec=1
ExecStart=/root/interos/repos/elastic-search-app/syslog-exec.sh

[Install]
WantedBy=multi-user.target

更新: 也许我正在寻找的是“每用户”服务,而不是作为 root 等运行的东西。

【问题讨论】:

  • ...所以目标是将定义此服务的新内容添加到/etc/nixos/configuration.nix,我假设? (这正确的方法)。
  • 顺便说一句,与您的问题无关,但$(pwd) 是错误的形式- 改用$PWD,效率更高- 而set -e 是... rightly controversial
  • @CharlesDuffy 是的,我猜 configuration.nix 是正确的方法..如果您可以添加一个简单的答案并附上一个足够好的链接,谢谢
  • 您能否编辑问题以包含您的.service 文件,以便我进行适当的翻译?
  • 另外——你为 Interos 构建了一个派生......对吗?

标签: nix nixos


【解决方案1】:

坏掉的原因

NixOS 是一个声明式操作系统。这意味着像/etc 这样的目录存在于只读的/nix/store 目录中。只有 nix-daemon 被允许将 nix-store 挂载为可写。因此,您必须在您的configuration.nix 中创建一个systemd.services.<yourservice> 条目才能与底层系统进行交互;或者,您可以直接修补 nixpkgs 并将您的配置指向您的 fork。

所有未由用户明确声明的运行服务都可以假定存在于nixpkgs/nixos/modules中。

修复

configuration.nix:

{
  systemd.services.foo = {
    enable = true;
    description = "bar";
    unitConfig = {
      Type = "simple";
      # ...
    };
    serviceConfig = {
      ExecStart = "${foo}/bin/foo";
      # ...
    };
    wantedBy = [ "multi-user.target" ];
    # ...
  };
}

用户服务

几乎相同,只是它们以systemd.user.services 开头。另外,用户主目录不是声明式管理的,所以你也可以像往常一样在$XDG_CONFIG_DIR/systemd下放置一个常规的systemd单元文件。

相关:

systemd.services.<name> 的有效属性的完整列表,来自:NixOS 手册

Module basics来自:维基

【讨论】:

  • 那些括号在haskell中是否平衡?我对haskell了解不多
  • 抱歉,haskell 是怎么回事?上面的代码是用nix表达式语言编写的
  • 感谢您的回答!我认为 Type = "simple" 是服务配置的一部分,而不是单元配置。
  • @user11810894 关注是在线“systemd.services.foo = {”上的荣誉似乎缺少结束荣誉'}'
【解决方案2】:

/etc/nixos/configuration.nix 中的相应条目可能如下所示:

let
  # assumes you build a derivation for your software and put it in
  # /etc/nixos/pkgs/interosEsMdb/default.nix
  interosEsMdb = import ./pkgs/interosEsMdb {};
in config.systemd.services.interosEsMdb = {
  description = "Interos MongoDB+ES log capture";
  after = ["network.target"];
  wantedBy = ["multi-user.target"];

  serviceConfig = {
    # change this to refer to your actual derivation
    ExecStart = "${interosEsMdb}/bin/syslog-exec.sh";
    EnvironmentFile = "${interosEsMdb}/lib/es-service.env";
    Restart = "always";
    RestartSec = 1;
  }
}

...假设您实际上构建了 interosEsMdb 的派生(这是在 NixOS 上打包软件的唯一合理且正确的方法)。

【讨论】:

  • 是的,我们的一些 nixos 机器上运行了一些服务,/etc/nixos/configuration.nix..idk 中没有提到这些服务
  • 通常会有一个模块根据configuration.nix的内容打开服务。
  • 我们有一堆服务以称为“后端”的用户(而不是 root 用户)身份运行,而 configuration.nix 文件实际上包含以下内容:[root@ec2-52-27-xx-xxx:~]# cat /etc/nixos/configuration.nix { imports = [ <nixpkgs/nixos/modules/virtualisation/amazon-image.nix> ]; ec2.hvm = true; }
  • 举个例子,我写了NixOS的bees模块,但是你不需要设置config.systemd.services.bees;相反,每当您在 config.services.beesd 中设置配置时,github.com/NixOS/nixpkgs/blob/master/nixos/modules/services/… 处的代码都会为您设置适当的服务。
  • 啊——现在,per-user 服务完全不同了。
猜你喜欢
  • 2021-02-14
  • 2020-04-25
  • 2021-11-20
  • 2017-12-21
  • 2017-02-28
  • 2018-01-28
  • 2019-02-18
  • 2020-01-20
  • 1970-01-01
相关资源
最近更新 更多