Pesquisa de site

Como criar e executar novas unidades de serviço no Systemd


Há alguns dias, me deparei com uma distro Centos 8 de 32 bits e senti vontade de testá-la em uma máquina antiga de 32 bits. Após a inicialização percebi que havia um bug e estava perdendo a conexão de rede, que eu tinha que “ativar” manualmente todas as vezes após a inicialização. Então, a questão era como eu poderia definir um script para fazer esse trabalho, rodando toda vez que eu inicializasse minha máquina?

Bem, isso é muito simples e vou mostrar o caminho do sistema usando unidades de serviço. Mas primeiro uma pequena introdução às unidades de serviço.

Neste artigo, vou explicar o que é uma “unidade de serviço” no systemd e como é fácil criar e executar uma. Tentarei simplificar o que são “alvos”, por que os chamamos de “coleções de unidades” e quais são seus “desejos”. Por fim, aproveitamos uma unidade de serviço para executar nosso próprio script após o procedimento de boot.

É óbvio que o seu computador é útil pelos serviços que oferece e para ter esta funcionalidade é necessário chamar muitos serviços à medida que o computador inicializa e atinge diferentes níveis.

Outros serviços são chamados para serem executados quando o computador atinge, por exemplo, o nível de resgate (runlevel 0) e outros quando atinge o nível multiusuário (runlevel 3) . Você pode imaginar esses níveis como metas.

De forma simples, target é uma coleção de unidades de serviço. Se você quiser dar uma olhada nas unidades de serviço em execução no seu nível graphical.target, digite:

systemctl --type=service

Como você pode ver, alguns serviços estão ativos e “em execução” o tempo todo, enquanto outros são executados uma vez e encerrados (encerrado).

Se quiser verificar o status de um serviço, você pode usar o comando systemctl conforme mostrado.

systemctl status firewalld.service

Como você pode ver, verifiquei o status de firewalld.service (dica: você pode usar o preenchimento automático para o nome do serviço ). Ele me informa que o serviço firewalld está em execução o tempo todo e está habilitado.

Ativado e desativado significa que o serviço será carregado permanentemente ou não, durante a próxima inicialização, respectivamente. Por outro lado, iniciar e parar um serviço tem a limitação da sessão atual e não é permanente.

Por exemplo, se você digitar:

systemctl stop firewalld.service
systemctl status firewalld.service

Você pode ver que o firewalld.service está inativo (morto), mas ainda está habilitado, o que significa que durante a próxima inicialização ele será carregado. Portanto, se quisermos que um serviço seja carregado durante a inicialização no futuro, devemos habilitá-lo. Que ótima conclusão! Vamos criar um, é fácil.

Se você for para a pasta:

cd /etc/systemd/system
ls -l

Você pode ver alguns arquivos de links de serviços unitários e alguns diretórios dos “desejos” de um alvo. Por exemplo, o que o destino multiusuário deseja que seja carregado quando o procedimento de inicialização atingir seu nível está listado no diretório com o nome /etc/systemd/system/multi-user.target.wants/ .

ls multi-user.target.wants/

Como você pode ver, ele não contém apenas serviços, mas também outros alvos que também são coleções de serviços.

Vamos fazer uma unidade de serviço com o nome connection.service.

vim connection.service

e digite o seguinte (pressione “i ” para o modo de inserção), salve-o e saia (com “esc ” e “:wq! ” ):

[Unit]
Description = making network connection up
After = network.target

[Service]
ExecStart = /root/scripts/conup.sh

[Install]
WantedBy = multi-user.target

Para explicar o que foi dito acima: criamos uma unidade do tipo serviço (você também pode criar unidades do tipo alvo) e configuramos ela para ser carregada após o network.target (você pode entender que o O procedimento de inicialização atinge os alvos com uma ordem definida) e queremos que toda vez que o serviço for iniciado execute um script bash com o nome conup.sh que iremos criar.

A diversão começa com a última parte [instalar]. Diz que será desejado por “multi-user.target ”. Portanto, se habilitarmos nosso serviço, um link simbólico para esse serviço será criado dentro da pasta multi-user.target.wants! Entendi? E se o desativarmos, esse link será excluído. Tão simples.

Basta ativá-lo e verificar:

systemctl enable connection.service

Informa que o link simbólico na pasta multi-user.target.wants foi criado. Você pode confirmar executando o comando ls conforme mostrado.

ls multi-user.target.wants/

Como você pode ver, “connection.service ” está pronto para a próxima inicialização, mas primeiro devemos criar o arquivo de script.

cd /root
mkdir scripts
cd scripts
vim conup.sh

Adicione a seguinte linha dentro do Vim e salve-a:

#!/bin/bash
nmcli connection up enp0s3

O comando nmcli para ativar a conexão de rede para a interface enp0s3.

Claro, se você quiser que seu script execute outra coisa, você pode digitar o que quiser em vez da segunda linha.

Por exemplo,

#!/bin/bash
touch /tmp/testbootfile

isso criaria um arquivo dentro da pasta /tmp (apenas para verificar se seu serviço está funcionando).

Também devemos tornar o script executável executando o comando chmod conforme mostrado.

chmod +x conup.sh

Agora estamos prontos. Se você não quiser esperar até a próxima inicialização (já está habilitado), podemos iniciar o serviço para a sessão atual digitando:

systemctl start connection.service

Voilá! Minha conexão está ativa e funcionando!

Se você optou por escrever o comando “touch /tmp/testbootfile ” dentro do script, apenas para verificar sua funcionalidade, você verá este arquivo criado dentro da pasta /tmp .

Eu realmente espero ajudá-lo a descobrir quais são os serviços, desejos, alvos e execução de scripts durante a inicialização.