Как установить сервис systemctl на nixos - PullRequest
0 голосов
/ 05 октября 2019

Если я сделаю это:

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

обновление: возможно, я ищу службу "для каждого пользователя", а не что-тозапустить как root и так далее.

Ответы [ 2 ]

2 голосов
/ 05 октября 2019

Причина его поломки

NixOS - декларативная операционная система. Это означает, что каталоги, такие как /etc, находятся внутри каталога только для чтения /nix/store. Только nix-демону разрешено монтировать nix-хранилище как доступное для записи. Следовательно, вы должны создать запись systemd.services.<yourservice> в вашем configuration.nix для взаимодействия с базовой системой;В качестве альтернативы вы можете напрямую установить 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.services.<name>, От: Руководство NixOS

Основы модулей , От: Wiki

0 голосов
/ 05 октября 2019

Соответствующая запись в вашем /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).

...