nix - 如何在 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
更新: 也许我正在寻找的是“每用户”服务,而不是作为根等运行的东西。
解决方案
坏掉的原因
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
推荐阅读
- materialize - 物化芯片和 addChip() 方法
- c# - 将从服务器返回的内容映射到 Angular 服务中的打字稿类型
- javascript - Cytoscape.js 网格布局不使用网格位置
- php - 在 Guzzle 中解决多个异步承诺时,我只能从第一个承诺中获得结果
- ios - 卡片样式 CollectionViewCell
- html - 如何在包含滚动条的父 div 中垂直居中子 div?
- java - Java Spring:请求的资源上不存在“Access-Control-Allow-Origin”标头
- javascript - create-react-app:无法安装站点:未检测到匹配的服务人员
- perl - 获取一年中的一周(一周的第一天是星期日)无法返回第 53 周
- swift - 如何从可解码的枚举中获取原始值?迅速