如何在nixos上安装systemctl服务

问题描述 投票:0回答:2

如果我这样做:

#!/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等身份运行的东西。

nix nixos
2个回答
1
投票

/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上打包软件的唯一明智和正确的方法。]


2
投票

其损坏的原因

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

未由用户明确声明的所有running服务都可以假定位于nixpkgs/nixos/modules内部。

修复

如果只需要启动和运行一项服务,最快的方法是将服务声明直接放在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单元文件放在systemd.user.services下。

相关:

$XDG_CONFIG_DIR/systemd的有效属性的完整列表,来自:NixOS手册

systemd.services.<name>发件人:Wiki

© www.soinside.com 2019 - 2024. All rights reserved.