如何在Nixos上安装systemctl服务

时间:2019-10-04 22:18:42

标签: nix nixos

如果我这样做:

read_test <- function(path, ...) {

  path %>% readxl::read_excel(...)
}
read_test(path, skip = 10)

然后我收到此错误:

  

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

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

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

更新: 也许我正在寻找的是“每用户”服务,而不是以root等身份运行的服务。

2 个答案:

答案 0 :(得分:2)

其损坏的原因

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开头。另外,用户主目录不是以声明方式进行管理的,因此您也可以照常将常规的systemd单元文件放在$XDG_CONFIG_DIR/systemd下。

相关:

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

Module basics来自:Wiki

答案 1 :(得分:0)

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