Observação:
- Este tutorial está disponível em um ambiente de laboratório gratuito fornecido pela Oracle.
- Ele usa valores de exemplo para credenciais, tenancy e compartimentos do Oracle Cloud Infrastructure. Ao concluir seu laboratório, substitua esses valores por valores específicos do seu ambiente de nuvem.
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
- Descubra diferentes tipos de unidades systemd
- Usar unidades de destino do systemd
- Aprender a sintaxe do comando systemctl comum
- Crie sua própria unidade do timer systemd no espaço do usuário
- Configure systemd para permitir que processos de espaço do usuário sejam executados após o logout
Do Que Você Precisa?
- Um sistema com o Oracle Linux 8 instalado.
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.
-
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.
-
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.
-
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 obasic.target
funcione e também entre em conflito com as unidadesrescue.service
erescue.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.
-
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.
-
-
Alterar a unidade de destino padrão.
-
Use o comando
systemctl set-default
para alterar a unidade de destino padrão para a unidadegraphical.target
.systemctl set-default graphical.target
-
Use o comando
ls –l
para confirmar se o arquivodefault.target
agora é um link simbólico para o arquivographical.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.
-
-
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 odisplay-manager.service
para carregar a exibição gráfica, mas ele também executa omulti-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.
-
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.
-
Use o comando
systemctl status
para exibir informações detalhadas sobre a unidadenfs-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çonfs-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çonfs-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
-
-
Ative um serviço para iniciar na inicialização.
Use o comando
systemctl enable
para ativar o serviçonfs-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 destinomulti-user
.Use
systemctl status command
para confirmar se o serviçonfs-server
agora está ativado e em execução.systemctl status nfs-server
-
Desativar e interromper um serviço.
Use o comando
systemctl disable
para desativar o serviçonfs-server
. Observe também que o comandosystemctl disable
exclui o link systemctl do serviço.sudo systemctl disable nfs-server
Use o comando
systemctl stop
para interromper o serviçonfs-server
.sudo systemctl stop nfs-server
Você pode combinar essas etapas usando a opção
--now
ao desativar o serviço. -
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çonfs-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:
/usr/lib/systemd/user/
: unidades de espaço do usuário fornecidas por pacotes instalados$HOME/.local/share/systemd/user/
: unidades de espaço do usuário de pacotes instalados no diretório home/etc/systemd/user/
: unidades de usuário globais de todo o sistema que devem ser executadas no espaço do usuário para todos os usuários$HOME/.config/systemd/user/
: unidades criadas pelo 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.
-
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/
-
Crie um diretório para hospedar seus próprios arquivos de unidade systemd.
mkdir -p $HOME/.config/systemd/user
-
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 entradaWants
define um requisito fraco para uma unidade de temporizador que ainda não existe. As unidades listadas como entradasWants
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 linhaExecStart
, que especifica o comando que é executado quando o serviço é iniciado. Nesse caso, o comandouptime
é 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. -
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 comandojournalctl
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.
-
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çãoWants
e a unidade não será executada se o requisito não for atendido.A seção
Timer
define que carrega a unidadeuptime.service
usando uma entradaOnCalendar
. A entradaOnCalendar
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. -
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
-
Liste as unidades para verificar se as unidades
uptime.service
euptime.timer
estão em execução.systemctl --user list-units
-
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.
-
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
-
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
.
-
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çãoKillUserProcesses
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çãoKillUserProcesses
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
- Documentação do sistema: https://systemd.io/
- Página manual
systemd(1)
- Página manual
systemctl(1)
- Página manual
journalctl(1)
- Página manual
systemd.unit(5)
- Página manual
logind.conf(5)
- Oracle Linux 8: Gerenciando a Configuração de Sistema Principal
- Documentação do Oracle Linux
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.