Como criar um destino systemd?

16

Depois de pesquisar bastante em um post, no vídeo do YouTube e na "documentação" sobre o systemd, ainda estou perdido.

O link ( https://wiki.archlinux.org/index.php/systemd#Create_custom_target ) parecia promissor, mas foi um pouco vaga (para mim).

Questão

Como você criaria um destino systemd personalizado (IE: foo.target) para poder inicializar com unidades .service selecionadas?

Exemplo

  1. O sistema inicializa default.target (link simbólico de "foo.target")
  2. "foo.target" inicia apenas um servidor X barebones e programa de GUI, diga "gvim".

Razão

Estou simplesmente procurando criar um destino personalizado para iniciar rapidamente um programa X. Seria bom excluir todos os serviços de que não preciso.

Desde já, obrigado!

Pilbox
fonte

Respostas:

16

Lendo man 5 systemd.unite man 5 systemd.targetinformando que os arquivos de unidade são usados ​​para definir destinos, bem como tudo o mais systemd. Não há documentação específica sobre como criar um destino , por isso é difícil determinar como deve ser feito, mas não é muito diferente da criação de um serviço.

Ao criar seu destino, você precisará criar links simbólicos para o target.wantsdiretório a partir do diretório systemd services. Então você pode definir / inicializar seu alvo. Veja como isso pode parecer, dado o seu exemplo.

/etc/systemd/system/foo.target

Este é o arquivo de unidade do alvo. Se graphical.target for tomado como exemplo, podemos criar nosso próprio destino usando-o como base.

[Unit]
Description=Foobar boot target
Requires=multi-user.target
Wants=foobar.service
Conflicts=rescue.service rescue.target
After=multi-user.target rescue.service rescue.target
AllowIsolate=yes

Explicar as opções retiradas das páginas de sistema do systemd;

  • Description- descreve o alvo. Você deveria entender
  • Requires- Dependências difíceis do alvo. Você deve deixar o sistema básico iniciar antes de iniciar seus próprios serviços
  • Wants- Dependências suaves. O destino não exige que eles iniciem.
  • Conflicts - Se uma unidade tiver uma configuração de Conflitos em outra unidade, iniciar a primeira interromperá a segunda e vice-versa.
  • After - Botas após estes serviços
  • AllowIsolate- Realmente depende de você e do seu ambiente. Detalhes estão disponíveis na página de manualsystemd.unit(5)

/etc/systemd/system/foo.target.wants/

Este é o diretório em que você vinculará os serviços que você cria / requer para o seu destino. É equivalente à Wants=opção no arquivo da unidade. Crie esse diretório e, em seguida, crie links simbólicos; ln -s /usr/lib/systemd/system/bar.service /etc/systemd/system/foo.target.wants/bar.service. Isso cria um link simbólico de bar.service no diretório do sistema para o diretório foo.target.wants.


Eu acho que criar um arquivo de unidade para um serviço está meio fora do escopo desta resposta, e essa pergunta é definitivamente mais documentada, então deixarei isso de fora por enquanto. Ao criar seu arquivo de unidade, basta vinculá-lo ao diretório target.wants ou adicioná-lo à Wants=diretiva.

m32
fonte
Segui o acima para criar um novo destino e adicionei alguns ao meu serviço. No entanto, nenhum desses serviços é iniciado pelo systemd. Existe um exemplo completo que demonstra serviços dentro do novo destino adicionado funcionando?
Linuxfan
11
Veja necromante pós pilha se você está procurando passos simples para configurar um serviço personalizado para ser executado na inicialização.
Pilbox
@linuxfan eu adiciono foo.targetao Requirescampo e Beforecampo de multi-user.target, e ele gosta Requires: base.target foo.target. Depois disso, reinicializo meu Arch Linux vm e foobar.serviceexecutarei como daemon automaticamente.
L_K 22/06
2
Boa resposta, mas na verdade não parece funcionar como seria de esperar. 1. Só porque está em falta, não significa que o serviço começará com esse objetivo. 2. O multi-user.target parece ter algum tipo de coisa oculta que o faz funcionar.
Otheus