如何在nixos上安装systemd服务
How to install systemd service on 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
更新:
也许我正在寻找的是 "per-user" 服务,而不是 运行 作为根等的东西。
您 /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
这样的目录位于只读的 /nix/store
目录中。只有 nix-daemon 被允许将 nix-store 挂载为可写。因此,您必须在 configuration.nix
中创建一个 systemd.services.<yourservice>
条目以与底层系统进行交互;或者你可以直接修补 nixpkgs 并将你的配置指向你的分支。
可以假设用户未明确声明的所有 运行 服务都位于 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,来自:维基
如果我这样做:
#!/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
更新: 也许我正在寻找的是 "per-user" 服务,而不是 运行 作为根等的东西。
您 /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
这样的目录位于只读的 /nix/store
目录中。只有 nix-daemon 被允许将 nix-store 挂载为可写。因此,您必须在 configuration.nix
中创建一个 systemd.services.<yourservice>
条目以与底层系统进行交互;或者你可以直接修补 nixpkgs 并将你的配置指向你的分支。
可以假设用户未明确声明的所有 运行 服务都位于 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,来自:维基