
Я хотел бы знать, как запустить описанную службу, например, в модуле на не-Nix OS. Например, предположим, что у меня есть файл:
{config, pkgs, ... }:
{
systemd.user.services.mytestservice = {
description = "Mytestservice";
script = "while true; do echo 'YES'; sleep 1; done";
wantedBy = [ "default.target" ];
};
}
(или в конечном итоге без пользователя: systemd.services.mytestservice =
)
Как мне скомпилировать его и запустить на ОС, отличной от Nixos, в том числе и для пользователей без прав root?
решение1
Благодарность: Большое спасибо clever
за все объяснения!
Давайте сначала запишем файл конфигурации в myconfiguration.nix
:
{config, pkgs, ... }:
{
# You can actually remove the user, and still use it
# as a user if you link it in ~/.config/systemd/user/
# (do not forget to remove the `user` it in anything.nix
# as well)
systemd.user.services.mytestservice = {
description = "Mytestservice";
script = "while true; do echo 'YES'; sleep 1; done";
# Or:
# serviceConfig = {
# ExecStart = "${pkgs.bash}/bin/bash -c \"while true; do echo 'YES'; sleep 1; done\"";
# };
wantedBy = [ "default.target" ];
};
}
Затем вы можете сделать несколько вещей:
- скомпилируйте его
- установить его
Чтобы скомпилировать только, вы можете сделать:
nix-build '<nixpkgs/nixos>' -I nixos-config=myconfiguration.nix -A 'config.systemd.user.units."mytestservice.service".unit'
Идея состоит в том, что это загружает файл default.nix
в папку /your/nixpkgs/copy/nixos/
(чтобы получить путь nixpkgs
, он проверяет переменную NIX_PATH
, содержащую несколько «подключей», например NIX_PATH=nixpkgs=/your/nixpkgs/copy/:othervar=thepath
:), которая доступна онлайнздесь. Этот файл также требует <nixos-config>
, чтобы мы использовали -I
для добавления записи nixos-config в NIX_PATH
переменную окружения. Тогда без -A
, он попытается построить полный nixos, поэтому мы просто указываем, что хотим только этот сервисный блок.
В результате будет создан файл mytestservice.service
, который будет выглядеть следующим образом:
$ cat result/mytestservice.service
[Unit]
Description=Mytestservice
[Service]
Environment="LOCALE_ARCHIVE=/nix/store/zzhablipzgpv8mvlcvagqjnham6lr944-glibc-locales-2.27/lib/locale/locale-archive"
Environment="PATH=/nix/store/bv1lw6a2kw0mn2y3lxhi43180idx6sp9-coreutils-8.31/bin:/nix/store/s1n4vl1f3in3nacalrc3xam0vyzpsfvs-findutils-4.6.0/bin:/nix/store/7d9bi31h40hky30f5scqx7r6wn311ain-gnugrep-3.3/bin:/nix/store/qg4qbkbca7qapfzpa8p991yjf944fc3w-gnused-4.7/bin:/nix/store/6bvd29jny80ka8df9prr5hrl5yz7d98k-systemd-239.20190219/bin:/nix/store/bv1lw6a2kw0mn2y3lxhi43180idx6sp9-coreutils-8.31/sbin:/nix/store/s1n4vl1f3in3nacalrc3xam0vyzpsfvs-findutils-4.6.0/sbin:/nix/store/7d9bi31h40hky30f5scqx7r6wn311ain-gnugrep-3.3/sbin:/nix/store/qg4qbkbca7qapfzpa8p991yjf944fc3w-gnused-4.7/sbin:/nix/store/6bvd29jny80ka8df9prr5hrl5yz7d98k-systemd-239.20190219/sbin"
Environment="TZDIR=/nix/store/20wmykp8fj2izxdj8lic8ggcfpdid5ka-tzdata-2019a/share/zoneinfo"
ExecStart=/nix/store/1f0wk7l4p7xv257dci8xxqz1k8nai9va-unit-script-mytestservice-start
Теперь, если вы хотите иметь возможность вызывать его, вам нужно его установить:
nix-env -f '<nixpkgs/nixos>' -I nixos-config=myconfiguration.nix -iA 'config.systemd.user.units."mytestservice.service".unit'
Это привяжет mytestservice.service
into ~/.nix-profile/mytestservice.service
. Но systemctl ожидает, что он будет in ~/.config/systemd/user/
, поэтому мы привязываем его:
ln -s ~/.nix-profile/mytestservice.service ~/.config/systemd/user/
Затем нам нужно перезагрузить демон и попробовать поиграться с ним:
systemctl --user daemon-reload
systemctl --user start mytestservice.service
Однако следует отметить, что команды сборки/установки сложны и их долго вводить, поэтому мы можем создать файл, скажем anything.nix
, , который все соберет за нас:
let
eval = import <nixpkgs/nixos> {
configuration = ./myconfiguration.nix;
};
pkgs = import <nixpkgs>{};
in pkgs.buildEnv {
name = "things";
paths = [
eval.config.systemd.user.units."mytestservice.service".unit
];
}
Теперь вы можете скомпилировать с помощью:
nix-build anything.nix
и установить с помощью
nix-env -f anything.nix -i things
Обратите внимание, что вам может потребоваться удалить файл, который мы установили в первый раз другим методом, выполнив следующую команду:
nix-env --query
nix-env --uninstall unit-mytestservice.service
Наконец, оба кода systemd.services
, systemd.services.users
похоже, можно использовать с этим методом :D