Observação:

Use systemd no Oracle Linux

Introdução

Neste tutorial, você aprenderá a usar o utilitário de linha de comando systemctl para gerenciar e exibir unidades systemd controladas por systemd. Este tutorial destina-se aos usuários do Oracle Linux 8 ou posterior.

systemd é o primeiro processo que inicia na inicialização e é o processo final para encerrar no desligamento do sistema. systemd é usado principalmente para gerenciar serviços do sistema ou processos e inicialização do sistema na inicialização. No entanto, systemd também pode manipular muitas outras tarefas e funções, incluindo registro de eventos, gerenciamento de dispositivos, login de usuário, programação de tarefas, sincronização de tempo e inicialização do sistema. Muitos recursos em systemd não são totalmente utilizados, pois os usuários podem estar mais confortáveis com softwares alternativos para esses fins ou distribuições diferentes do Linux podem ter abordagens preferenciais para a configuração do sistema.

Diferentes tipos de comportamento ou funções dentro de systemd são manipulados em unidades systemd. Por exemplo, processos daemon ou serviços do sistema são executados como unidades de serviço, enquanto os estados do sistema geralmente são definidos como unidades de destino. Unidades de tempo podem ser definidas para agendar tarefas da mesma forma que como você pode usar o serviço cron do sistema e uma unidade de montagem pode ser usada para configurar um ponto de montagem da mesma forma que como você pode configurar um ponto de montagem no fstab do sistema.

systemd é usado para gerenciar processos e funções no nível do sistema, mas também é capaz de gerenciar processos em execução no espaço do usuário. Os usuários de um sistema podem configurar e gerenciar seus próprios serviços e systemd podem até mesmo ser configurados para permitir que esses serviços continuem em execução depois que o usuário tiver encerrado sua sessão.

Objetivos

Do Que Você Precisa?

Observação: Ao usar o ambiente de laboratório gratuito, consulte Informações Básicas sobre o Oracle Linux Lab para obter instruções de conexão e outras instruções de uso.

Explore arquivos de unidades do systemd

Depois de se conectar com a instância do Oracle Linux 8, você pode começar a experimentar o comando systemctl para saber mais sobre as diferentes unidades disponíveis.

  1. Execute o comando systemctl para listar todas as unidades systemd que estão atualmente carregadas por systemd:

    systemctl
    

    Use as teclas Espaço ou PgDn do teclado para navegar pela saída.

    Este comando é equivalente à execução:

    systemctl list-units
    

    A saída mostra todas as unidades de configuração ativas no momento que systemd está gerenciando. Na saída, você deve observar que há unidades nomeadas com sufixos diferentes, incluindo unidades nomeadas com os sufixos '.device', '.mount','.service', '.target' e '.timer'.

    As unidades estão ativas no sentido de serem iniciadas, executadas, montadas ou conectadas, dependendo de sua finalidade. As unidades podem estar inativas no sentido de serem interrompidas, desmontadas ou desconectadas. Para ver todas as unidades, independentemente de estarem ativas ou não, execute:

    systemctl list-units --all
    

    A saída destes comandos mostra uma seleção dos diferentes tipos de unidades systemd:

    • automount: Fornece recursos de montagem automática para montagem sob demanda de sistemas de arquivos e inicialização paralela.
    • mount: Controla os pontos de montagem nas exibições de data e hora atuais do sistema de arquivos.
    • path: Pode ativar serviços quando as informações de caminho do sistema de arquivos forem alteradas.
    • scope: Semelhante às unidades de serviço, mas gerencia processos estrangeiros em vez de iniciá-los.
    • service: Inicia e controla os daemons e os processos dos quais eles consistem.
    • slice: Usado para agrupar unidades que gerenciam processos do sistema, como unidades de serviço e unidades de escopo, na árvore cgroup hierárquica para fins de gerenciamento de recursos.
    • socket: Encapsula a comunicação entre processos (IPC) local ou soquetes de rede no sistema, que são úteis para a ativação baseada em soquete.
    • target: Usado para agrupar unidades ou fornecer pontos de sincronização bem conhecidos durante a inicialização.
    • timer: Usado para acionar a ativação de outras unidades usando timers. Eles fornecem uma alternativa para tarefas que podem ter sido gerenciadas anteriormente usando o serviço cron.
    • device: Expõe dispositivos kernel em systemd e também pode ser usado para implementar a ativação baseada em dispositivos.
    • swap: Encapsula partições de permuta de memória ou arquivos de permuta.
  2. Restrinja a listagem de unidades a um tipo de unidade específico usando a opção --type.

    • Use o comando systemctl list-units --type services para listar as unidades de serviço ativas no momento em seu sistema.

      systemctl list-units --type service
      
    • Execute o mesmo comando novamente, mas inclua a opção --all para ver todas as unidades carregadas, incluindo as que estão inativas, se houver.

      systemctl list-units --type service --all
      

É possível repetir esses comandos para cada um dos tipos de serviço disponíveis, de modo que você restrinja as informações somente ao tipo com o qual está interessado em trabalhar a qualquer momento.

Trabalhar com Unidades de Destino do systemd

As unidades de destino são utilizadas para agrupar unidades diferentes a fim de trazer o sistema para um estado específico, de forma que ele esteja pronto para funcionar com uma finalidade específica.

  1. Liste as unidades target disponíveis.

    systemctl list-units --type target
    

    As unidades podem exigir que outras unidades sejam carregadas ou configuradas para entrarem em conflito com unidades específicas. Por exemplo, o multi-user.target requer que o basic.target funcione e também entre em conflito com as unidades rescue.service e rescue.target. As unidades também especificam outras unidades que desejam carregar para poderem funcionar.

    Dessa forma, os destinos podem ser encadeados para configurar um determinado estado, mas também são modulares o suficiente para serem reutilizados para acionar um estado alternativo.

  2. Visualizar a unidade de destino padrão.

    A unidade de destino padrão define o estado padrão do sistema após a inicialização.

    • Use o comando systemctl get-default para exibir qual unidade de destino é usada por padrão. A unidade de destino padrão é representada pelo arquivo /etc/systemd/system/default.target.

      systemctl get-default
      
    • Use o comando ls -l para listar informações sobre o arquivo /etc/systemd/system/default.target.

      ls -l /etc/systemd/system/default.target
      

      Observação: O arquivo default.target é um link simbólico para o arquivo de unidade de destino padrão atual.

  3. Alterar a unidade de destino padrão.

    • Use o comando systemctl set-default para alterar a unidade de destino padrão para a unidade graphical.target.

      systemctl set-default graphical.target
      
    • Use o comando ls –l para confirmar se o arquivo default.target agora é um link simbólico para o arquivo graphical.target.

      ls -l /etc/systemd/system/default.target
      

      Observação: A alteração da unidade de destino padrão remove o link simbólico default.target existente e recria o link simbólico, que aponta para a nova unidade de destino padrão.

  4. Explore um destino para obter mais informações.

    • Use o comando systemctl show para obter mais informações sobre qualquer destino específico.

      systemctl show multi-user.target
      

      A saída mostra todos os parâmetros do destino especificado. Observe que é possível identificar as unidades que o destino exige, quer e está em conflito e que você também pode ver quais unidades esse destino deve executar antes e depois.

    • Use o comando systemctl list-dependencies para mostrar a árvore de dependências necessárias ou desejadas para que um determinado destino atinja seu estado:

      systemctl list-dependencies default.target
      

      Esse comando mostra todas as unidades iniciadas quando você inicia o destino padrão. A cadeia de unidades é apresentada recursivamente em uma árvore que permite avaliar completamente o que o alvo alcança quando inicia. Se você tiver definido o graphical.target como o destino padrão, poderá ver que o sistema deseja executar o display-manager.service para carregar a exibição gráfica, mas ele também executa o multi-user.target para fazer tudo o que for necessário antes de executar a exibição gráfica.

Usando systemctl para Ativar, Desativar e Mascarar Unidades

As unidades podem ser desativadas ou ativadas e também podem ser mascaradas para que nunca sejam executadas sob nenhuma circunstância. Algumas unidades estão estáticas porque estão sempre disponíveis, geralmente porque são dependências para que outras unidades funcionem. O comando systemctl list-units só pode ser usado para mostrar unidades que estão ativas ou inativas no sistema.

  1. Relacione todas as unidades disponíveis no sistema, juntamente com seu estado:

    systemctl list-unit-files
    

    Muitas das unidades disponíveis são estáticas. As unidades ativadas começam no momento da inicialização. Unidades desativadas são unidades disponíveis no sistema, mas que não são configuradas para iniciar na inicialização. As unidades mascaradas estão disponíveis no sistema, mas foram definidas ativamente para um estado no qual não podem ser iniciadas.

  2. Use o comando systemctl status para exibir informações detalhadas sobre a unidade nfs-server.service.

    systemctl status nfs-server.service
    

    O comando systemctl permite eliminar a extensão .service ao fazer referência a unidades de serviço.

    O comando de status indica se uma unidade está ativada, ativa, inativa, desativada ou mascarada.

    Para soluções com script, systemctl fornece comandos curtos para o status de saída em uma única linha:

    • Use o comando systemctl is-active para verificar se o serviço nfs-server está em execução (ativo) ou não em execução (inativo).

      systemctl is-active nfs-server
      
    • Use o comando systemctl is-enabled para verificar se o serviço nfs-server está ativado ou desativado. Com o serviço ativado, o serviço começa em uma reinicialização do sistema.

      systemctl is-enabled nfs-server
      
  3. Ative um serviço para iniciar na inicialização.

    Use o comando systemctl enable para ativar o serviço nfs-server.

    sudo systemctl enable --now nfs-server
    

    Você deverá executar o comando systemctl com privilégios de administrador se o comando alterar o estado ou a configuração do sistema. Você pode usar a opção --now para iniciar adicionalmente o serviço ao mesmo tempo em que o ativa.

    Observação: O comando ativa o serviço criando um link simbólico para o destino do estado do sistema de nível mais baixo no qual o serviço é iniciado. Na saída, o comando criou o link simbólico nfs-server.service para o destino multi-user.

    Use systemctl status command para confirmar se o serviço nfs-server agora está ativado e em execução.

    systemctl status nfs-server
    
  4. Desativar e interromper um serviço.

    Use o comando systemctl disable para desativar o serviço nfs-server. Observe também que o comando systemctl disable exclui o link systemctl do serviço.

    sudo systemctl disable nfs-server
    

    Use o comando systemctl stop para interromper o serviço nfs-server.

    sudo systemctl stop nfs-server
    

    Você pode combinar essas etapas usando a opção --now ao desativar o serviço.

  5. Mascarar e desmascarar uma unidade.

    Em alguns casos, talvez você queira desativar as unidades do início. Normalmente, você pode fazer isso se uma unidade específica entrar em conflito com alguma outra funcionalidade no sistema ou por um motivo de política.

    Use o comando systemctl mask para mascarar o serviço nfs-server:

    sudo systemctl mask nfs-server
    

    Um link simbólico é criado para garantir que a configuração da unidade systemd aponte para /dev/null. Isso impede que o serviço seja ativado ou iniciado.

    Confirme se não é possível iniciar a unidade nfs-server enquanto ela estiver mascarada:

    sudo systemctl start nfs-server
    

    O serviço não pode ser iniciado e um erro é retornado para indicar que o serviço está mascarado.

    Desmascarar a unidade para retorná-la ao seu estado original e permitir que os usuários iniciem ou ativem o serviço.

    sudo systemctl unmask nfs-server
    

Configurar systemd para Unidades de Espaço do Usuário

Em geral, systemd é utilizado para gerenciar unidades em um nível de sistema. Os usuários precisam de acesso no nível do administrador ao sistema para gerenciar as unidades do sistema configuradas dessa forma. Em alguns ambientes e para alguns tipos de unidades, os usuários podem usar a capacidade do systemd de executar unidades dentro do espaço do usuário. Por exemplo, os usuários podem programar tarefas usando os recursos da unidade do timer do systemd; ou os usuários podem querer executar aplicativos ou serviços específicos como unidades de serviço que não precisam de permissão no nível raiz para serem executados.

systemd inicia um processo systemd-user para um usuário no log-in. As unidades localizadas nos seguintes diretórios são processadas na seguinte ordem para o usuário:

Você pode indicar para systemd que está trabalhando no espaço do usuário usando a opção --user para qualquer comando systemd.

  1. Listar arquivos de unidades disponíveis no momento para seu usuário.

    systemctl --user list-unit-files
    

    Observe que a lista de unidades disponíveis é significativamente mais curta do que quando você emitiu o mesmo comando sem a opção --user.

    A maioria desses arquivos de unidade, em um novo sistema, está localizada em /usr/lib/systemd/user. Liste os arquivos neste diretório para exibir as unidades localizadas aqui:

    ls -la /usr/lib/systemd/user/
    
  2. Crie um diretório para hospedar seus próprios arquivos de unidade systemd.

    mkdir -p $HOME/.config/systemd/user
    
  3. Crie sua própria unidade de serviço systemd.

    cat << EOF > $HOME/.config/systemd/user/uptime.service
    [Unit]
    Description="Logs system uptime and load average"
    Wants=uptime.timer
    
    [Service]
    ExecStart=/usr/bin/uptime
    
    [Install]
    WantedBy=default.target
    
    EOF
    

    Esta unidade de serviço fornece três seções de configuração.

    A seção Unit fornece uma descrição para a unidade e quaisquer requisitos. Nesse caso, uma entrada Wants define um requisito fraco para uma unidade de temporizador que ainda não existe. As unidades listadas como entradas Wants serão executadas se estiverem disponíveis, mas não impedirão que a unidade pai seja executada se não forem encontradas ou não forem executadas.

    A seção Service define o comportamento dessa unidade de serviço específica quando ela é executada. Contamos com muitos valores padrão para as opções disponíveis aqui e só especificamos a linha ExecStart, que especifica o comando que é executado quando o serviço é iniciado. Nesse caso, o comando uptime é executado para registrar os valores de tempo de atividade e carga do sistema.

    A seção Install define como o serviço deve ser instalado no sistema quando ele é ativado. Notavelmente, o serviço é adicionado como um serviço que é WantedBy o 'default.target'. Isso significa que o serviço é ativado como parte do destino padrão para este usuário.

  4. Execute a unidade systemd e verifique sua saída.

    Como você adicionou uma nova unidade, geralmente é uma boa ideia recarregar a configuração systemd antes de tentar executar o serviço:

    systemctl --user daemon-reload
    

    Agora comece a nova unidade.

    systemctl --user start uptime
    

    Verifique se o comando foi executado conforme esperado. Você pode verificar se o serviço foi executado verificando seu status:

    systemctl --user status uptime
    

    Observação: Esses comandos usam a opção --user para ser executada dentro do espaço do usuário.

    Para verificar a saída do comando uptime que foi executado, use o comando journalctl para exibir o log e especifique a opção de tag para exibir logs específicos do comando:

    journalctl -t uptime
    

    Você pode ativar esse serviço para que ele comece quando seu usuário fizer log-in pela primeira vez no sistema.

    systemctl --user enable uptime
    

    Observe que o serviço é executado quando o usuário efetua log-in pela primeira vez no sistema. Ele não inicia automaticamente na inicialização do sistema. Em geral, os serviços executados no espaço do usuário terminam depois que o usuário faz logout ou todas as sessões do usuário são encerradas. A ativação da persistência para serviços de usuário é discutida mais adiante neste tutorial.

Trabalhar com Unidades do Timer systemd

Neste exercício, você baseia-se no exercício anterior para criar e permitir que uma unidade do cronômetro execute regularmente outra unidade do sistema em um determinado horário ou intervalo. As unidades do cronômetro podem ser definidas tanto no nível do sistema quanto no nível do usuário e podem ser utilizadas para definir quando o sistema deve executar outra unidade. As unidades do timer fornecem controle granular sobre eventos programados e podem atuar como uma alternativa ao uso do daemon cron para lidar com configurações mais sutis.

Muitos serviços de sistema incluem unidades de temporizador para controlar quando são executados. Um ótimo exemplo de uma unidade de temporizador está incluído no pacote dnf-automatic que pode ser usado para manter seu sistema atualizado quando ele executa atualizações regulares de dnf automaticamente. Para ver isso em ação em um nível do sistema, instale o pacote e ative a unidade do cronômetro:

sudo dnf install -y dnf-automatic
sudo systemctl enable dnf-automatic.timer

Você pode visualizar o arquivo de unidades para ver como essa unidade está configurada:

cat /usr/lib/systemd/system/dnf-automatic.timer

Conteúdo notável nesta unidade, inclua uma linha Wants que espera que o network-online.target seja atendido. A entrada OnCalendar na seção Timer da configuração sugere que essa ação seja executada diariamente em 06h00. Também é de interesse a entrada RandomizedDelaySec, que pode ajudar a impedir que as unidades de temporizador disparem exatamente ao mesmo tempo e empurrem a carga do sistema de repente.

O exemplo fornecido aqui faz parte de um conjunto de unidades muito mais complexo. Para entender melhor como as unidades de temporizador funcionam, adicione uma unidade de temporizador no espaço do usuário para programar o uptime.service que você criou no exercício anterior para que ele seja executado em um intervalo regular.

  1. Crie um arquivo de unidade de temporizador.

    cat <<EOF > $HOME/.config/systemd/user/uptime.timer
    [Unit]
    Description=Timer for the uptime service that logs uptime
    Requires=uptime.service
    
    [Timer]
    Unit=uptime.service
    OnCalendar=*-*-* *:*:00
    
    [Install]
    WantedBy=timers.target
    

    Esse arquivo especifica que uptime.service é necessário para que essa unidade do timer seja executada. Este é um requisito muito mais forte do que qualquer outro definido em uma definição Wants e a unidade não será executada se o requisito não for atendido.

    A seção Timer define que carrega a unidade uptime.service usando uma entrada OnCalendar. A entrada OnCalendar funciona de forma semelhante às opções em uma definição crontab, mas fornece mais granularidade. Nesse caso, a unidade é definida para ser executada a cada minuto a 00 segundos.

  2. Como você modificou a configuração do systemd, recarregue daemons systemd e reinicie o serviço de tempo de atividade para que ele possa selecionar a nova unidade do timer:

    systemctl --user daemon-reload
    systemctl --user restart uptime
    
  3. Liste as unidades para verificar se as unidades uptime.service e uptime.timer estão em execução.

    systemctl --user list-units
    
  4. Monitore a saída de log no diário para ver a saída de tempo de atividade acionada pelo serviço de tempo de atividade em execução a cada minuto.

    journalctl -f -t uptime
    

    Após alguns minutos, várias linhas de saída devem ter sido exibidas. Se você estivesse prestando atenção, pode notar que o comando do tempo de atividade nem sempre é acionado exatamente no minuto. Este é um recurso intencional na funcionalidade do timer systemd. Os jobs de timer são acionados com um randomizador que pode permitir que uma tarefa seja acionada com até um minuto de atraso. Isso ajuda a impedir que os timers sejam acionados exatamente ao mesmo tempo. Você pode forçar um temporizador a ser incrivelmente preciso definindo a precisão em um nanossegundo do evento programado, adicionando a seguinte entrada de configuração à seção Timer da unidade do temporizador:

    AccuracySec=1us
    

    No entanto, para a maioria das tarefas, é sensato permitir um certo grau de imprecisão para evitar que as tarefas sejam executadas de forma demasiado síncrona.

    Você pode usar a combinação de teclas Ctrl-C para sair do lançamento quando terminar de monitorá-lo.

Configurar processos de espaço do usuário para continuar após o log-out

Por padrão, os serviços e processos iniciados e pertencentes a um usuário são encerrados quando o usuário efetua logout ou quando todas as sessões do usuário são encerradas. Há vários métodos que você pode usar para alterar esse comportamento padrão em systemd. Duas opções são exploradas aqui.

Use o comando loginctl para ativar usuários systemd linger

O comando loginctl pode ser usado para alterar o comportamento padrão de um usuário específico e para ativar processos para que o usuário 'linger' após a sessão do usuário ser encerrada.

  1. Use o utilitário loginctl para ativar o linger para um usuário específico. Nesta instância, ative o comportamento de linger systemd para o usuário 'oracle':

    sudo loginctl enable-linger oracle
    
  2. Para verificar se a configuração foi aplicada, verifique se há um arquivo com o mesmo nome do usuário no diretório /var/lib/systemd/linger.

    ls /var/lib/systemd/linger/oracle
    

    O comando deve verificar se o arquivo existe.

Edite o arquivo systemd logind.conf

O sistema gerencia eventos de login de usuário e fornece um arquivo de configuração que pode ser editado para definir o comportamento padrão de diferentes eventos relacionados à sessão do usuário. Esse arquivo de configuração está localizado em /etc/systemd/logind.conf.

  1. Faça dump do conteúdo da configuração existente em /etc/systemd/logind.conf para a tela a fim de revisar:

    cat /etc/systemd/logind.conf
    

    A maioria das opções é comentada, mas exibe os valores padrão de tempo de compilação. Há três opções nesse arquivo que podem controlar como o systemd manipula processos em execução no espaço do usuário quando a sessão do usuário é encerrada.

    • KillUserProcesses: essa opção pode controlar se os processos do usuário são ou não encerrados por padrão quando a sessão termina. A definição dessa opção como "não" permite que o systemd execute processos de usuário depois que qualquer usuário fizer logout do sistema.
    • KillExcludeUsers: Se a opção KillUserProcesses estiver ativada, essa opção permitirá que você especifique uma lista separada por espaços de usuários para os quais o sistema permite que os processos continuem a ser executados depois que a sessão for encerrada. A adição de um nome de usuário a essa lista se comporta de forma semelhante à adição de um usuário ao grupo de idiomas systemd usando o comando loginctl.
    • KillOnlyUsers: Se a opção KillUserProcesses estiver desativada, esse parâmetro poderá ser usado para especificar uma lista separada por espaços de usuários para os quais os processos deverão ser encerrados após o logout.

Demonstração em Vídeo

As demonstrações de vídeo no systemd serão fornecidas em https://www.youtube.com/watch?v=9uDvnZKhU8A e https://www.youtube.com/watch?v=Tkxs-wfZrnw se você precisar de mais informações sobre como trabalhar com o systemd no Oracle Linux 8.

Systemd e Service Manager no Oracle Linux 8

Unidades de Destino systemd no Oracle Linux 8

Mais Informações

Mais Recursos de Aprendizagem

Explore outros laboratórios em docs.oracle.com/learn ou acesse mais conteúdo de aprendizado gratuito no canal YouTube do Oracle Learning. Além disso, visite education.oracle.com/learning-explorer para se tornar um Oracle Learning Explorer.

Para obter a documentação do produto, visite o Oracle Help Center.