首页 > 解决方案 > 如何在 nixos 上安装 systemd 服务

问题描述

如果我这样做:

#!/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

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

标签: nixnixos

解决方案


坏掉的原因

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

模块基础来自:Wiki


推荐阅读