Como o Nix gerencia módulos SystemD em um não-NixOS?

4

Suponha que eu use nix-env para instalar um pacote que usa o SystemD, em um host Ubuntu. O que precisa ser feito para tornar o SystemD do Ubuntu ciente dos módulos SystemD que vêm dos pacotes Nix?

Vamos tentar encontrar o Nix instalado .service arquivos, e ligando-os simbolicamente de /lib/systemd/system/ , para o Apache Kafka .

nix-env -i apache-kafka
sudo systemctl start apache-kafka # Failed to start apache-kafka.service: Unit apache-kafka.service not found.
sudo updatedb && locate apache-kafka.service # No dice
locate kafka | grep service # Just a bunch of '.nix' files

Aqui, eu estou supondo que o nome do serviço com base no nome da configuração do serviço no Nix definição de pacote . Não consegui encontrar nenhuma documentação descrevendo como e onde essa configuração se torna um arquivo de serviço do SystemD.

Quando isso não funcionou, comecei a cavar, supondo que, em algum lugar, o Nix deve ter criado esse arquivo de serviço. Mas agora, estou começando a duvidar que exista. Então, os módulos do SystemD instalados pelo gerenciador de pacotes Nix devem funcionar fora do NixOS e, em caso afirmativo, como fazê-los funcionar?

    
por Dan Ross 05.03.2017 / 00:20

4 respostas

2

Parece que você tem duas perguntas:

  1. Onde o Nix instala arquivos?
  2. Onde os arquivos systemd precisam estar localizados para que funcionem?

O seu pacote nix é quase certamente um formato de arquivo compactado como .zip ou .tar.gz , mas com uma extensão diferente. Você pode verificar o tipo de arquivo fazendo o download do pacote Nix e, em seguida, usando a ferramenta file :

 file ./my-nix-package

Supondo que esteja usando o formato .zip ou .tar.gz , você pode usar o comando zip ou tar relacionado para listar o conteúdo do pacote. Normalmente, o conteúdo do pacote cobre o sistema de arquivos, portanto, isso confirmará se há um arquivo .service no pacote e onde ele pode estar instalado.

O Nix também pode ter um comando de empacotamento para responder a pergunta "onde estão todos os arquivos que pertencem a este pacote?".

A resposta para sua segunda pergunta está em man systemd.unit . systemd procurará arquivos da unidade systemd system nos seguintes diretórios, esta ordem de preferência:

   /etc/systemd/system/*
   /run/systemd/system/*
   /lib/systemd/system/*

Se o Nix for bem comportado, ele teria instalado systemd arquivos em /lib/systemd/system . Se instalou um arquivo .service em algum outro lugar, então você deve copiar ou vinculá-lo em /etc/systemd/system - Somente gerenciadores de pacotes devem modificar os arquivos em /lib/systemd/system .

    
por 05.03.2017 / 15:51
2

No NixOS, é possível usar environment.systemPackages = [ package ]; para instalar as unidades systemd do pacote no sistema. Prova

As unidades em /nix/store/hash-package/lib/systemd/system são copiadas para /run/current-system/sw/lib/systemd/system , que é usado pelo systemd como um diretório de serviço extra.

Portanto, se você quiser usar unidades de serviço ao instalar o pacote como raiz, certifique-se de que o caminho /root/.nix-profile/lib/systemd/system seja usado pelo systemd além de /etc/systemd/system . Além disso, certifique-se de que a derivação forneça as unidades.

Completamente não testado, porque estou no NixOS

    
por 01.06.2017 / 07:43
1

Eu acho que % pacotesnix-env instalados não são encontrados pelo systemd nem mesmo no NixOS - e falando em sistema serviços, eu consideraria uma falha se eram de outra forma. (Para serviços usuário , isso faria sentido, mas eu não sei o status do suporte.)

    
por 05.03.2017 / 20:46
1

Localização dos arquivos *. service

Quanto a onde os arquivos *. service estão localizados, Eelco Dolstra (autor principal do Nix) recentemente respondeu a uma pergunta semelhante :

Many packages do in fact provide systemd units, for example:

$ nix-build -A utillinux.bin

$ ls -l ./result-bin/lib/systemd/system/
total 16
-r--r--r-- 2 root root 155 Jan  1  1970 fstrim.service
-r--r--r-- 5 root root 170 Jan  1  1970 fstrim.timer
-r--r--r-- 2 root root 248 Jan  1  1970 uuidd.service
-r--r--r-- 2 root root 185 Jan  1  1970 uuidd.socket

Então, dependendo de como você constrói uma derivação (nome oficial para um "pacote Nix"), os arquivos *. service devem estar disponíveis no diretório $out/lib/systemd/system/ resultante. (Onde por $out você pode precisar substituir valores diferentes, dependendo de quais opções você usa com nix-build .)

Especificamente, ao usar nix-env -i (como no seu caso), você deve procurar em ~ / .nix-profile / como seu $out . Por exemplo, em uma das minhas máquinas:

$ ls -l ~/.nix-profile/lib/systemd/system/
total 8
-r--r--r-- 1 akavel akavel 268 sty  1  1970 nix-daemon.service
-r--r--r-- 1 akavel akavel 235 sty  1  1970 nix-daemon.socket

Ativando os serviços no systemd do Ubuntu

Quanto a essa parte da pergunta, não sei como fazer isso no momento, mas estou interessado em configurar algo semelhante ao que você descreveu.

Acho que as seguintes "partes" adicionais podem ser necessárias:

  • alguma alteração na configuração do systemd do Ubuntu para torná-lo ciente do diretório ~.nixprofile/... ; (a propósito: eu acredito que algum usuário especial deva ser criado para isso, já que esses arquivos serão efetivamente equivalentes a ter acesso ao sudo)
  • algum script de "ativação" que executaria systemctl enable --now $SERVICE em todos os serviços fornecidos pela Nix;
    • idealmente, nem todos os serviços criados pelo Nix devem ser habilitados automaticamente, apenas os listados em alguma lista adicional, como enabledServices = [ ... ]; ou algo assim;
    • idealmente, o script de "ativação" deve desabilitar os serviços previamente habilitados do Nix, mas agora está faltando a partir de enabledServices (talvez verificando serviços ativos em systemctl carregados do caminho .../.nix-profile/... ?)
    • ou talvez acima, poderia ser feito com alguma coisa intermediária de 'nixos-guest.target', além de systemctl daemon-reload ?
por 04.12.2017 / 14:50

Tags