nix - 如何在 nixos 上安装 systemd 服务

标签 nix nixos

如果我这样做:

#!/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: failed to create symbolic link '/etc/systemd/system/interos-es-mdb.service': Read-only file system

有人知道在 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 等身份运行的服务。

最佳答案

坏掉的原因

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 手册

Module basics , 来自:维基

关于nix - 如何在 nixos 上安装 systemd 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58243712/

相关文章:

haskell - 通过 Nix 安装 Haskell 包

nix - 漂亮的 nix attrsets 打印

linux - 使用 nix-shell 或 nix shell 在 Linux 64 上运行 MacOS sed

nix - 以下 cmdline 参数的最短 `shell.nix` 等价物是什么?

shell - 使用default.nix文件运行命令

nix - 不使用 Nixos 时如何使用 nix 配置?

continuous-deployment - 在持续交付工作流程中使用 nix

python - 如何使用 default.nix 文件运行 `nix-shell`?

nix - 根据属性向 stdenv 添加 shell 函数

linux - 在 NixOS 上将 twitch lambdabot 配置为服务