3.5.3. Criação de arquivos unitários personalizados

Há vários casos de uso para criar arquivos de unidade do zero: você poderia executar um daemon personalizado, criar uma segunda instância de algum serviço existente (como em Criar uma segunda instância do serviço sshd), ou importar um script de inicialização SysV (mais em Converter scripts de inicialização SysV em arquivos de unidade). Por outro lado, se você pretende apenas modificar ou ampliar o comportamento de uma unidade existente, use as instruções de Modificação de arquivos de unidade existentes. O procedimento a seguir descreve o processo geral de criação de um serviço personalizado.

Procedimento

  1. Preparar o arquivo executável com o serviço personalizado. Este pode ser um script personalizado, ou um executável entregue por um fornecedor de software. Se necessário, prepare um arquivo PID para manter um PID constante para o processo principal do serviço personalizado. Também é possível incluir arquivos de ambiente para armazenar variáveis shell para o serviço. Certifique-se de que o script fonte seja executável (executando o chmod a x) e não seja interativo.
  2. Crie um arquivo unitário no diretório /etc/systemd/system/ e certifique-se de que ele tenha as permissões corretas do arquivo. Executar como root:

    touch /etc/systemd/system/name.service
    
    chmod 664 /etc/systemd/system/name.service

    Substituir name por um nome do serviço a ser criado. Note que o arquivo não precisa ser executável.

  3. Abra o name.service criado na etapa anterior, e adicionar as opções de configuração do serviço. Há uma variedade de opções que podem ser usadas dependendo do tipo de serviço que você deseja criar, veja Estrutura do arquivo de unidade. A seguir, um exemplo de configuração de unidade para um serviço relacionado à rede:

    [Unit]
    Description=service_description
    After=network.target
    
    [Service]
    ExecStart=path_to_executable
    Type=forking
    PIDFile=path_to_pidfile
    
    [Install]
    WantedBy=default.target

    Onde:

    • service_description é uma descrição informativa que é exibida em arquivos de diário de bordo e na saída do comando systemctl status.
    • a configuração After garante que o serviço seja iniciado somente depois que a rede estiver funcionando. Adicione uma lista separada por espaço de outros serviços ou alvos relevantes.
    • path_to_executable representa o caminho para o serviço executável real.
    • Type=forking é usado para daemons que fazem a chamada do sistema de garfos. O processo principal do serviço é criado com o PID especificado em path_to_pidfile. Encontre outros tipos de inicialização em Tabela 3.10, “Opções importantes da seção [Serviço]”.
    • WantedBy declara a meta ou metas que o serviço deve ser iniciado. Pense nessas metas como uma substituição do antigo conceito de níveis de execução.
  4. Notifique systemd que um novo name.service existe através da execução do seguinte comando como root:

    systemctl daemon-reload
    
    systemctl start name.service
    Atenção

    Sempre execute o comando systemctl daemon-reload após criar novos arquivos de unidade ou modificar os arquivos de unidade existentes. Caso contrário, os comandos systemctl start ou systemctl enable poderiam falhar devido a um descompasso entre os estados de systemd e arquivos de unidades de serviço reais em disco. Note que em sistemas com um grande número de unidades isso pode levar muito tempo, pois o estado de cada unidade tem que ser serializado e subseqüentemente deserializado durante a recarga.

3.5.3.1. Criação de um arquivo unitário personalizado utilizando a segunda instância do serviço sshd

Os administradores de sistema freqüentemente precisam configurar e executar várias instâncias de um serviço. Isto é feito criando cópias dos arquivos originais de configuração do serviço e modificando certos parâmetros para evitar conflitos com a instância principal do serviço. O procedimento a seguir mostra como criar uma segunda instância do serviço sshd.

Procedimento

  1. Criar uma cópia do arquivo sshd_config que será usado pelo segundo daemon:

    # cp /etc/ssh/sshd{,-second}_config
  2. Edite o arquivo sshd-second_config criado na etapa anterior para atribuir um número de porta e um arquivo PID diferentes ao segundo daemon:

    Port 22220
    PidFile /var/run/sshd-second.pid

    Consulte a página sshd_config(5) do manual para obter mais informações sobre as opções Port e PidFile. Certifique-se de que a porta escolhida não esteja em uso por nenhum outro serviço. O arquivo PID não precisa existir antes de executar o serviço, ele é gerado automaticamente no início do serviço.

  3. Criar uma cópia do arquivo da unidade systemd para o serviço sshd:

    # cp /usr/lib/systemd/systemd/system/sshd.service /etc/systemd/systemd/system/sshd-second.service
  4. Altere o sshd-second.service criado na etapa anterior como segue:

    1. Modifique a opção Description:

      Descrição=OpenSSH servidor de segunda instância daemon
    2. Adicionar sshd.service aos serviços especificados na opção After, de modo que a segunda instância só comece após a primeira já ter começado:

      After=syslog.target network.target auditd.service sshd.service
    3. A primeira instância do sshd inclui a geração chave, portanto, remova a linha ExecStartPre=/usr/sbin/sshd-keygen.
    4. Adicione o parâmetro -f /etc/ssh/sshd-second_config ao comando sshd, para que seja utilizado o arquivo de configuração alternativa:

      ExecStart=/usr/sbin/sshd -D -f /etc/ssh/sshd-second_config $OPTIONS
    5. Após as modificações acima, o serviço sshd-segundo.serviço deve ter a seguinte aparência:

      [Unit]
      Description=OpenSSH server second instance daemon
      After=syslog.target network.target auditd.service sshd.service
      
      [Service]
      EnvironmentFile=/etc/sysconfig/sshd
      ExecStart=/usr/sbin/sshd -D -f /etc/ssh/sshd-second_config $OPTIONS
      ExecReload=/bin/kill -HUP $MAINPID
      KillMode=process
      Restart=on-failure
      RestartSec=42s
      
      [Install]
      WantedBy=multi-user.target
  5. Se utilizar SELinux, adicione a porta para a segunda instância de sshd aos portos SSH, caso contrário, a segunda instância de sshd será rejeitada para se ligar ao porto:

    # porto semanage -a -t ssh_port_t -p tcp 22220
  6. Habilite o sshd-second.service, para que ele comece automaticamente na inicialização:

    # systemctl habilita sshd-second.service
  7. Verifique se o sshd-second.service está rodando usando o comando systemctl status.
  8. Verificar se a porta está habilitada corretamente, conectando-se ao serviço:

    $ ssh -p 22220 user@server

    Se o firewall estiver em uso, certifique-se de que esteja configurado adequadamente para permitir conexões com a segunda instância de sshd.