Aplica-se a SUSE Linux Enterprise Desktop 12

11 O daemon systemd

O programa systemd tem ID de processo 1. Ele é responsável por inicializar o sistema da forma exigida. O systemd é iniciado diretamente pelo Kernel e resiste ao sinal 9, que normalmente termina os processos. Todos os outros programas são iniciados diretamente pelo systemd ou por um de seus processos filho.

Desde o SUSE Linux Enterprise Desktop 12, o systemd é o substituto do popular daemon init do System V. O systemd é totalmente compatível com o init do System V (pois suporta scripts init). Uma das vantagens principais do systemd é que ele acelera consideravelmente o tempo de boot, devido à sua capacidade agressiva de paralelização para iniciar serviços. Além disso, o systemd apenas inicia um serviço quando é realmente necessário. Os daemons não são iniciados incondicionalmente no momento da inicialização, mas, em vez disso, quando são solicitados pela primeira vez. O systemd também suporta Grupos de Controle do Kernel (cgroups), criação de instantâneos, restauração do estado do sistema, etc. Consulte http://www.freedesktop.org/wiki/Software/systemd/ para obter os detalhes.

11.1 O conceito do systemd

Esta seção apresenta detalhes sobre o conceito que rege o systemd.

11.1.1 O que é systemd

O systemd é um gerenciador de sistema e sessão para Linux, compatível com os scripts init do System V e do LSB. Os principais recursos são:

  • capacidade agressiva de paralelização

  • uso de soquete e ativação por D-Bus para iniciar serviços

  • capacidade de iniciar daemons sob demanda

  • acompanhamento de processos usando cgroups do Linux

  • suporte à criação de instantâneos e restauração do estado do sistema

  • manutenção dos pontos de montagem e automount

  • implementação de uma lógica elaborada de controle de serviço baseada em dependência transacional

11.1.2 Arquivo unit

O arquivo de configuração unit codifica as informações sobre serviço, soquete, dispositivo, ponto de montagem, ponto de automount, arquivo de troca ou partição, destino de inicialização, caminho do sistema de arquivos monitorado, temporizador controlado e supervisionado pelo systemd, instantâneo de estado do sistema temporário, fração de gerenciamento de recursos ou grupo de processos criados externamente. O arquivo unit é um termo genérico usado pelo systemd para o seguinte:

  • Serviço.  Informações sobre um processo (por exemplo, a execução de um daemon); o arquivo termina com .service

  • Destinos.  Usado para agrupar unidades e como pontos de sincronização durante a inicialização; o arquivo termina com .target

  • Soquetes.  Informações sobre um soquete de rede, IPC ou FIFO do sistema de arquivos, para ativação baseada em soquete (como inetd); o arquivo termina com .socket

  • Caminho.  Usado para acionar outras unidades (por exemplo, executar um serviço quando houver mudanças nos arquivos); o arquivo termina com .path

  • Timer.  Informações sobre um temporizador controlado, para ativação baseada em temporizador; o arquivo termina com .timer

  • Ponto de montagem.  Normalmente, gerado de forma automática pelo gerador fstab; o arquivo termina com .mount

  • Ponto de automount.  Informações sobre um ponto de automount do sistema de arquivos; o arquivo termina com .automount

  • Swap.  Informações sobre um dispositivo ou arquivo de troca para paginação de memória; o arquivo termina com .swap

  • Dispositivo.  Informações sobre uma unidade de dispositivo conforme exposta na árvore de dispositivos do sysfs/udev(7); o arquivo termina com .device

  • Escopo/Fração.  Um conceito de gerenciamento hierárquico de recursos de um grupo de processos; o arquivo termina com .scope/.slice

Para obter mais informações sobre o systemd.unit, consulte http://www.freedesktop.org/software/systemd/man/systemd.unit.html

11.2 Uso básico

O sistema init do System V usa vários comandos diferentes para gerenciar os serviços: scripts init, insserv, telinit e outros. O systemd facilita gerenciar serviços, já que existe apenas um comando para memorizar para a maioria das tarefas de gerenciamento de serviços: systemctl. Ele usa a notação command plus subcommand, como git ou zypper:

systemctl [general OPTIONS] subcommand [subcommand OPTIONS]

Consulte man 1 systemctl para obter o manual completo.

Dica
Dica: Saída de terminal e complementação bash

Se a saída chegar a um terminal (e não a um pipe ou arquivo, por exemplo), por padrão, os comandos systemd enviarão uma saída extensa para um pager. Use a opção --no-pager para desativar o modo de paginação.

O systemd também suporta a complementação bash, que permite digitar as primeiras letras de um subcomando e pressionar →| para completá-lo automaticamente. Esse recurso está disponível apenas no shell bash e requer a instalação do pacote bash-completion.

11.2.1 Gerenciando serviços em um sistema em execução

Os subcomandos de gerenciamento de serviços são os mesmos usados para gerenciar um serviço com o init do System V (start, stop, etc.). A sintaxe geral dos comandos de gerenciamento de serviços é a seguinte:

systemd
systemctl reload|restart|start|status|stop|... <my_service(s)>.service
Init do System V
rc<my_service(s)> reload|restart|start|status|stop|...

O systemd permite gerenciar vários serviços de uma só vez. Em vez de executar os scripts init um após o outro como acontece com o init do System V, execute um comando da seguinte forma:

systemctl start <my_1st_service>.service <my_2nd_service>.service

Para listar todos os serviços disponíveis no sistema:

systemctl list-unit-files --type=service

A tabela a seguir lista os comandos de gerenciamento de serviços mais importantes para o systemd e o init do System V:

Tabela 11.1 Comandos de gerenciamento de serviços

Tarefa

Comando systemd

Comando init do System V

Iniciando. 

start
start

Parar. 

stop
stop

Reiniciar.  Encerra os serviços e os inicia na sequência. Se algum serviço ainda não estiver em execução, ele será iniciado.

restart
restart

Reiniciar condicionalmente.  Reinicia os serviços se já estiverem em execução. Não faz nada para os serviços que não estão em execução.

try-restart
try-restart

Recarregar.  Instrui os serviços a recarregarem seus arquivos de configuração sem interromper a operação. Caso de uso: Instruir o Apache a recarregar um arquivo de configuração httpd.conf modificado. Observe que nem todos os serviços suportam recarregamento.

reload
reload

Recarregar ou reiniciar.  Recarrega os serviços quando o recarregamento é suportado; do contrário, reinicia-os. Se algum serviço ainda não estiver em execução, ele será iniciado.

reload-or-restart
n/a

Recarregar ou reiniciar condicionalmente.  Recarrega os serviços se o recarregamento for suportado; do contrário reinicia-os, se estiverem em execução. Não faz nada para os serviços que não estão em execução.

reload-or-try-restart
n/a

Obter informações detalhadas sobre status.  Lista as informações sobre o status dos serviços. O comando systemd mostra detalhes, como descrição, executável, status, cgroup e as últimas mensagens emitidas por um serviço (consulte a Seção 11.6.6, “Depurando serviços”). O nível dos detalhes exibidos com o init do System V varia de acordo com cada serviço.

status
status

Obter informações resumidas sobre status.  Mostra se os serviços estão ou não ativos.

is-active
status

11.2.2 Habilitando/Desabilitando serviços permanentemente

Os comandos de gerenciamento de serviços mencionados na seção anterior permitem manipular serviços na seção atual. O systemd também permite habilitar ou desabilitar serviços permanentemente para serem iniciados automaticamente quando solicitados ou para ficarem sempre indisponíveis. É possível fazer isso com o YaST ou por linha de comando.

11.2.2.1 Habilitar/Desabilitar serviços na linha de comando

A tabela a seguir lista os comandos de habilitação e desabilitação pelo systemd e pelo init do System V:

Importante
Importante: Inicialização de serviço

Ao habilitar um serviço na linha de comando, ele não é iniciado automaticamente. Ele é programado para iniciar na próxima inicialização do sistema ou mudança de nível de execução/destino. Para iniciar um serviço logo após ele ter sido habilitado, execute systemctl start <meu_serviço>.service ou rc<meu_serviço> start explicitamente.

Tabela 11.2 Comandos para habilitar e desabilitar serviços

Tarefa

Comando systemd

Comando init do System V

Habilitando. 

systemctl enable <meu(s)_serviço(s)>.service

insserv <meu(s)_serviço(s)>

Desabilitar. 

systemctl disable <meu(s)_serviço(s)>.service

insserv -r <meu(s)_serviço(s)>

Verificar.  Mostra se um serviço está ou não habilitado.

systemctl is-enabled <meu_serviço>.service

n/d

Reabilitar.  Semelhante a reiniciar um serviço, este comando primeiro desabilita e depois habilita um serviço. Útil para restaurar um serviço aos seus padrões.

systemctl reenable <meu_serviço>.service

n/d

Mascarar.  Após desabilitar um serviço, ele ainda poderá ser iniciado manualmente. Para desabilitar um serviço completamente, é necessário mascará-lo. Use com cuidado.

systemctl mask <meu_serviço>.service

n/d

Desmascarar.  Só será possível usar novamente um serviço mascarado depois que ele for desmascarado.

systemctl unmask <meu_serviço>.service

n/d

11.3 Inicialização do sistema e gerenciamento de destino

Todo o processo de inicialização e encerramento do sistema é mantido pelo systemd. Desse ponto de vista, o Kernel pode ser considerado um processo em segundo plano para manter todos os outros processos e ajustar o tempo de CPU e o acesso ao hardware de acordo com as solicitações de outros programas.

11.3.1 Destinos X níveis de execução

Com o init do System V, o sistema era inicializado no chamado Nível de execução. O nível de execução define como o sistema é iniciado e quais serviços estão disponíveis no sistema em execução. Os níveis de execução são numerados: os mais conhecidos são 0 (encerramento do sistema), 3 (multiusuário com rede) e 5 (multiusuário com rede e gerenciador de exibição).

O systemd apresenta um novo conceito usando as chamadas unidades de destino. No entanto, ele continua totalmente compatível com o conceito de nível de execução. As unidades de destino são nomeadas, e não numeradas, e possuem finalidades específicas. Por exemplo, os destinos local-fs.target e swap.target montam sistemas de arquivos locais e espaços de troca.

O destino graphical.target oferece recursos de sistema multiusuário com rede e gerenciador de exibição e equivale ao nível de execução 5. Destinos complexos, como graphical.target, agem como destinos meta, combinando um subconjunto de outros destinos. Como o systemd facilita criar destinos personalizados combinando destinos existentes, ele oferece excelente flexibilidade.

A lista a seguir mostra as unidades de destino mais importantes do systemd. Para ver a lista completa, consulte man 7 systemd.special.

Unidades de destino selecionadas do systemd
default.target

O destino que é inicializado por padrão. Não um destino real, mas um link simbólico para outro destino, como graphic.target. Pode ser modificado permanentemente pelo YaST (consulte a Seção 11.4, “Gerenciando serviços com o YaST”). Para mudá-lo em uma sessão, use a opção de linha de comando do Kernel systemd.unit=<meu_destino>.destino no prompt de boot.

emergency.target

Inicia o shell de emergência no console. Use-o apenas no prompt de boot como systemd.unit=emergency.target.

graphical.target

Inicia um sistema com suporte a rede multiusuário e um gerenciador de exibição.

halt.target

Encerra o sistema.

mail-transfer-agent.target

Inicia todos os serviços necessários para enviar e receber e-mails.

multi-user.target

Inicia um sistema multiusuário com rede.

reboot.target

Reinicializa o sistema.

rescue.target

Inicia um sistema de usuário único sem rede.

Para continuar compatível com o sistema de nível de execução init do System V, o systemd oferece destinos especiais chamados runlevelX.target mapeados a níveis de execução correspondentes numerados X.

Para saber o destino atual, use o comando: systemctl get-default

Tabela 11.3 Níveis de execução do System V e unidades de destino do systemd

Nível de execução do System V

Destino do systemd

Finalidade

0

runlevel0.target, halt.target, poweroff.target

Encerramento do sistema

1, S

runlevel1.target, rescue.target,

Modo de usuário único

2

runlevel2.target, multi-user.target,

Multiusuário local sem rede remota

3

runlevel3.target, multi-user.target,

Multiusuário completo com rede

4

runlevel4.target

Não usado/Definido pelo usuário

5

runlevel5.target, graphical.target,

Multiusuário completo com rede e gerenciador de exibição

6

runlevel6.target, reboot.target,

Reinicialização do sistema

Importante
Importante: O systemd ignora o /etc/inittab

Os níveis de execução em um sistema init do System V são configurados em /etc/inittab. O systemd não usa essa configuração. Consulte a Seção 11.5.3, “Criando destinos personalizados” para obter instruções sobre como criar seu próprio destino inicializável.

11.3.1.1 Comandos para mudar os destinos

Use os seguintes comandos para operar com unidades de destino:

Tarefa

Comando systemd

Comando init do System V

Mudar o destino/nível de execução atual

systemctl isolate <meu_destino>.target

telinit X

Mudar para o destino/nível de execução padrão

systemctl default

n/d

Obter o destino/nível de execução atual

systemctl list-units --type=target

Com o systemd, normalmente há mais de um destino ativo. O comando lista todos os destinos que estão ativos.

who -r

ou

runlevel

Mudar o nível de execução padrão de forma persistente

Use o Gerenciador de Serviços ou execute o seguinte comando:

ln -sf /usr/lib/systemd/system/<meu_destino>.target /etc/systemd/system/default.target

Use o Gerenciador de Serviços ou mude a linha

id:X:initdefault:

em /etc/inittab

Mudar o nível de execução padrão para o processo de boot atual

Digite a seguinte opção no prompt de boot

systemd.unit=<meu_destino>.target

Digite o número do nível de execução desejado no prompt de boot.

Mostrar as dependências de um destino/nível de execução

systemctl show -p "Requires" <meu_destino.target>

systemctl show -p "Wants" <meu_destino>.target

Requires lista as dependências obrigatórias (hard) (aquelas que devem ser resolvidas), enquanto Wants lista as dependências desejadas (soft) (aquelas que são resolvidas quando possível).

n/d

11.3.2 Depurando a inicialização do sistema

O systemd oferece os meios para a análise dos processos de inicialização do sistema. É possível revisar a lista de todos os serviços e status de forma prática (sem ter que analisar o /varlog/). O systemd permite também explorar o procedimento de inicialização para descobrir quanto tempo leva para inicializar cada serviço.

11.3.2.1 Revisar inicialização dos serviços

Para revisar a lista completa dos serviços que foram iniciados desde a inicialização do sistema, digite o comando systemctl. Ele lista todos os serviços ativos, conforme mostrado a seguir (resumidamente). Para obter mais informações sobre determinado serviço, use systemctl status <meu_serviço>.service.

Exemplo 11.1 Listar serviços ativos
root # systemctl
UNIT                                LOAD   ACTIVE SUB       JOB DESCRIPTION
[...]
systemd-random-seed-load.path       loaded active waiting       Random Seed
acpid.service                       loaded active running       ACPI Event Daemon
apache2.service                     loaded failed failed        apache
avahi-daemon.service                loaded active running       Avahi mDNS/DNS-SD Stack
bluez-coldplug.service              loaded active exited        LSB: handles udev coldplug of bluetooth dongles
console-kit...-system-start.service loaded active exited        Console System Startup Logging
cron.service                        loaded active running       Command Scheduler
cups.service                        loaded active running       CUPS Printing Service
[...]
LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.
JOB    = Pending job for the unit.

107 units listed. Pass --all to see inactive units, too.

Para restringir o resultado a serviços com falha na inicialização, use a opção --failed:

Exemplo 11.2 Listar serviços com falha
root # systemctl --failed
UNIT                   LOAD   ACTIVE SUB    JOB DESCRIPTION
apache2.service        loaded failed failed     apache
NetworkManager.service loaded failed failed     Network Manager
plymouth-start.service loaded failed failed     Show Plymouth Boot Screen

[...]

11.3.2.2 Depurar o tempo de inicialização

Para depurar o tempo de inicialização do sistema, o systemd oferece o comando systemd-analyze. Ele mostra o tempo total de inicialização, uma lista dos serviços solicitados por tempo de inicialização e também gera um gráfico SVG mostrando o tempo que os serviços levaram para serem iniciados em relação a outros serviços.

Listando o tempo de inicialização do sistema
root # systemd-analyze
Startup finished in 2666ms (kernel) + 21961ms (userspace) = 24628ms
Listando o tempo de inicialização dos serviços
root # systemd-analyze blame
  6472ms systemd-modules-load.service
  5833ms remount-rootfs.service
  4597ms network.service
  4254ms systemd-vconsole-setup.service
  4096ms postfix.service
  2998ms xdm.service
  2483ms localnet.service
  2470ms SuSEfirewall2_init.service
  2189ms avahi-daemon.service
  2120ms systemd-logind.service
  1210ms xinetd.service
  1080ms ntp.service
[...]
    75ms fbset.service
    72ms purge-kernels.service
    47ms dev-vda1.swap
    38ms bluez-coldplug.service
    35ms splash_early.service
Gráficos do tempo de inicialização dos serviços
root # systemd-analyze plot > jupiter.example.com-startup.svg

11.3.2.3 Revisar o processo de inicialização completo

Os comandos mencionados anteriormente permitem revisar os serviços que foram iniciados e o tempo que levou para iniciá-los. Se você precisar de mais detalhes, poderá instruir o systemd a registrar de forma verbosa o procedimento de inicialização completo, digitando os seguintes parâmetros no prompt de boot:

systemd.log_level=debug systemd.log_target=kmsg

Agora o systemd grava suas mensagens de registro no buffer de anel do kernel. Veja esse buffer com dmesg:

dmesg -T | less

11.3.3 Compatibilidade com o System V

O Systemd é compatível com o System V, o que ainda permite usar os scripts init existentes do System V. Entretanto, há pelo menos um problema conhecido em que o script init do System V não funciona com o Systemd out-of-the-box: iniciar um serviço como outro usuário por meio de su ou sudo nos scripts init resulta em falha do script, gerando um erro de Acesso negado.

Ao mudar o usuário com su ou sudo, é iniciada uma sessão PAM. Essa sessão será terminada após a conclusão do script init. Como consequência, o serviço que foi iniciado pelo script init também será terminado. Para solucionar esse erro, faça o seguinte:

  1. Crie um agrupador de arquivo de serviço com o mesmo nome do script init e mais a extensão de nome de arquivo .service:

    [Unit]
    Description=DESCRIPTION
    After=network.target
    
    [Service]
    User=USER
    Type=forking1
    PIDFile=PATH TO PID FILE1
    ExecStart=PATH TO INIT SCRIPT start
    ExecStop=PATH TO INIT SCRIPT stop
    ExecStopPost=/usr/bin/rm -f PATH TO PID FILE1
    
    [Install]
    WantedBy=multi-user.target2

    Substitua todos os valores gravados em LETRAS MAIÚSCULAS pelos valores apropriados.

    1

    Opcional: use apenas se o script init iniciar um daemon.

    2

    O multi-user.target também inicia o script init ao inicializar no graphical.target. Se ele tiver que ser iniciado apenas ao inicializar no gerenciador de exibição, use o graphical.target aqui.

  2. Inicie o daemon com systemctl start APLICATIVO.service

11.4 Gerenciando serviços com o YaST

O gerenciamento básico de serviços também pode ser feito com o módulo Gerenciador de Serviços do YaST. Ele permite iniciar, parar, habilitar e desabilitar serviços. Ele permite também mostrar o status e mudar o destino padrão de um serviço. Inicie o módulo do YaST em YaST › Sistema › Services Manager (Gerenciador de Serviços).

Gerenciador de Serviços
Figura 11.1 Gerenciador de Serviços
Mudando o destino padrão do sistema

Para mudar o destino de inicialização do sistema, escolha o destino na caixa suspensa Default System Target (Destino Padrão do Sistema). Os destinos mais usados são Graphical Interface (Interface Gráfica) (iniciando uma tela gráfica de login) e Multiusuário (iniciando o sistema no modo de linha de comando).

Iniciando ou parando um serviço

Selecione um serviço da tabela. A coluna Ativo mostra se ele está em execução (Ativo) ou não (Inativo). Para alternar o status, escolha Iniciar/Parar.

Quando um serviço é iniciado ou parado, seu status muda na sessão que está em execução. Para mudar seu status em todas as reinicializações, é necessário habilitá-lo ou desabilitá-lo.

Habilitando ou desabilitando um serviço

Selecione um serviço da tabela. A coluna Habilitado mostra se ele está Habilitado ou Desabilitado. Para alternar o status, escolha Habilitar/Desabilitar.

Quando um serviço é habilitado ou desabilitado, você configura se ele deve ser iniciado durante a inicialização (Habilitado) ou não (Desabilitado). Essa configuração não afeta a sessão atual. Para mudar seu status na sessão atual, é necessário iniciá-lo ou pará-lo.

Ver mensagens de status

Para ver a mensagem de status de um serviço, selecione-o na lista e escolha Mostrar Detalhes. A saída exibida será idêntica a que foi gerada pelo comando systemctl -l status <meu_serviço>.

Atenção
Atenção: Configurações de nível de execução defeituosas podem danificar o sistema

Configurações de nível de execução defeituosas podem tornar o sistema inutilizável. Antes de aplicar as mudanças, tenha absoluta certeza sobre suas consequências.

11.5 Personalização do systemd

As seções a seguir mostram alguns exemplos de personalizações do systemd.

Atenção
Atenção: Evitando sobregravar personalizações

Faça sempre as personalizações do systemd em /etc/systemd/, nunca em /usr/lib/systemd/. Do contrário, as mudanças serão sobregravadas na próxima atualização do systemd.

11.5.1 Personalizando arquivos de serviço

Os arquivos de serviço do systemd estão localizados em /usr/lib/systemd/system. Para personalizá-los, faça o seguinte:

  1. Copie os arquivos que deseja modificar de /usr/lib/systemd/system para /etc/systemd/system. Mantenha os mesmos nomes de arquivo dos originais.

  2. Modifique as cópias em /etc/systemd/system de acordo com as suas necessidades.

  3. Para obter uma visão geral das mudanças de configuração, use o comando systemd-delta. Ele compara e identifica os arquivos de configuração que anulam outros arquivos de configuração. Para obter detalhes, consulte a página de manual do systemd-delta.

Os arquivos modificados em /etc/systemd terão prioridade sobre os arquivos originais em /usr/lib/systemd/system, desde que seus nomes sejam iguais.

11.5.2 Criando arquivos dropin

Para adicionar apenas algumas linhas a um arquivo de configuração ou modificar uma pequena parte dele, é possível usar os chamados arquivos dropin. Esses arquivos permitem estender a configuração dos arquivos de unidade sem ter que editá-los ou anulá-los realmente.

Por exemplo, para mudar um valor no serviço foobar localizado em /usr/lib/systemd/system/ foobar.service, faça o seguinte:

  1. Crie um diretório chamado /etc/systemd/system/<meu_serviço>.service.d/.

    Observe o sufixo .d. O diretório deve receber outro nome de acordo com o serviço que você deseja corrigir com o arquivo dropin.

  2. Nesse diretório, crie um arquivo qualquermodificação.conf.

    Verifique se ele contém somente a linha com o valor que deseja modificar.

  3. Grave as mudanças feitas no arquivo Ele será usado como extensão do arquivo original.

11.5.3 Criando destinos personalizados

Nos sistemas init SUSE do System V, o nível de execução 4 não costuma ser usado para permitir que administradores criem sua própria configuração de nível de execução. O systemd permite criar qualquer número de destinos personalizados. A sugestão é começar adaptando um destino existente, como graphical.target.

  1. Copie o arquivo de configuração /usr/lib/systemd/system/graphical.target para /etc/systemd/system/<meu_destino>.target e ajuste-o de acordo com as suas necessidades.

  2. O arquivo de configuração copiado na etapa anterior já inclui as dependências obrigatórias (hard) do destino. Para incluir também as dependências desejadas (soft), crie um diretório /etc/systemd/system/<meu_destino>.target.wants.

  3. Para cada serviço desejado, crie um link simbólico de /usr/lib/systemd/system para /etc/systemd/system/<meu_destino>.target.wants.

  4. Após concluir a configuração do destino, recarregue a configuração do systemd para disponibilizar o novo destino:

    systemctl daemon-reload

11.6 Uso avançado

As seções a seguir abordam tópicos avançados para administradores do sistema. Para obter uma documentação ainda mais avançada do systemd, consulte a série de Lennart Pöttering sobre o systemd para administradores em http://0pointer.de/blog/projects.

11.6.1 Registro do Sistema

A Seção 11.6.6, “Depurando serviços” explica como ver mensagens de registro de determinado serviço. No entanto, a exibição de mensagens de registro não se restringe a registros de serviços. É possível também acessar e consultar as mensagens de registro completas gravadas pelo systemd, o chamado Diário. Use o comando systemd-journalctl para exibir as mensagens de registro completas com as entradas antigas. Consulte man 1 systemd-journalctl para ver as opções; por exemplo, aplicação de filtros ou mudança do formato de saída.

11.6.2 Instantâneos

É possível gravar o estado atual do systemd em um instantâneo nomeado e mais tarde revertê-lo com o subcomando isolate. Isso é útil para testar serviços ou destinos personalizados, pois permite retornar para um estado definido a qualquer momento. Um instantâneo só fica disponível na sessão atual e é apagado automaticamente na reinicialização. O nome do instantâneo deve terminar com .snapshot.

Criar um instantâneo
systemctl snapshot <my_snapshot>.snapshot
Apagar um instantâneo
systemctl delete <my_snapshot>.snapshot
Ver um instantâneo
systemctl show <my_snapshot>.snapshot
Ativar um instantâneo
systemctl isolate <my_snapshot>.snapshot

11.6.3 Carregamento de módulos Kernel

Com o systemd, é possível carregar os módulos do kernel automaticamente no momento da inicialização, usando o arquivo de configuração em

  • /usr/lib/modules-load.d e

  • /etc/modules-load.d

Para obter mais informações, consulte a página de manual modules-load.d(5).

11.6.4 Grupos de controle (cgroups) do Kernel

Em um sistema init tradicional do System V, nem sempre é possível atribuir claramente um processo ao serviço que o gerou. Alguns serviços, como o Apache, geram diversos processos de terceiros (por exemplo, processos CGI ou Java) que, por sua vez, geram mais processos. Isso dificulta ou até impossibilita uma atribuição clara. Além do mais, um serviço pode não terminar corretamente, deixando alguns filhos ativos.

O systemd resolve este problema colocando cada serviço em seu próprio grupo de controle (cgroup). Cgroups são recursos do Kernel que possibilitam agregar processos e todos os seus filhos em grupos hierárquicos organizados. O systemd nomeia cada cgroup de acordo com seu serviço. Como um processo não privilegiado não pode deixar seu cgroup, essa é uma forma eficiente de rotular todos os processos gerados por um serviço com o nome do serviço.

Para listar todos os processos pertencentes a um serviço, use o comando systemd-cgls. O resultado será parecido com o seguinte exemplo (resumido):

Exemplo 11.3 Listar todos os processos pertencentes a um serviço
root # systemd-cgls --no-pager
├─1 /usr/lib/systemd/systemd --switched-root --system --deserialize 20
├─user.slice
│ └─user-1000.slice
│   ├─session-102.scope
│   │ ├─12426 gdm-session-worker [pam/gdm-password]
│   │ ├─15831 gdm-session-worker [pam/gdm-password]
│   │ ├─15839 gdm-session-worker [pam/gdm-password]
│   │ ├─15858 /usr/lib/gnome-terminal-server

[...]

└─system.slice
  ├─systemd-hostnamed.service
  │ └─17616 /usr/lib/systemd/systemd-hostnamed
  ├─cron.service
  │ └─1689 /usr/sbin/cron -n
  ├─ntpd.service
  │ └─1328 /usr/sbin/ntpd -p /var/run/ntp/ntpd.pid -g -u ntp:ntp -c /etc/ntp.conf
  ├─postfix.service
  │ ├─ 1676 /usr/lib/postfix/master -w
  │ ├─ 1679 qmgr -l -t fifo -u
  │ └─15590 pickup -l -t fifo -u
  ├─sshd.service
  │ └─1436 /usr/sbin/sshd -D

[...]

Consulte o Chapter 8, Kernel Control Groups, System Analysis and Tuning Guide para obter mais informações sobre os cgroups.

11.6.5 Terminando os serviços (enviando sinais)

Conforme explicado na Seção 11.6.4, “Grupos de controle (cgroups) do Kernel”, nem sempre é possível atribuir um processo a seu processo de serviço pai em um sistema init do System V. Isso dificulta terminar um serviço e todos os seus filhos. Os processos filhos que não forem terminados permanecerão como processos zumbis.

O conceito do systemd de confinar cada serviço em um cgroup possibilita identificar claramente todos os processos filhos de um serviço e, portanto, permite enviar um sinal a cada um desses processos. Use systemctl kill para enviar sinais aos serviços. Para ver uma lista dos sinais disponíveis, consulte man 7 signals.

Enviando SIGTERM para um serviço

SIGTERM é o sinal padrão que é enviado.

systemctl kill <my_service>.service
Enviando um SINAL para um serviço

Use a opção -s para especificar o sinal que deve ser enviado.

systemctl kill -s SIGNAL <my_service>.service
Selecionando processos

Por padrão, o comando kill envia o sinal para todos os processos do cgroup especificado. É possível restringi-lo ao processo control ou main. Este último, por exemplo, é útil para forçar um serviço a recarregar sua configuração enviando SIGHUP:

systemctl kill -s SIGHUP --kill-who=main <my_service>.service

11.6.6 Depurando serviços

Por padrão, o systemd não é muito verboso. Se um serviço for iniciado com êxito, nenhuma saída será gerada. Em caso de falha, uma breve mensagem de erro será exibida. Porém, o systemctl status oferece os meios de depurar a inicialização e operação de um serviço.

O systemd já vem com um mecanismo de registro (The Journal — O Diário) que registra as mensagens do sistema. Isso permite exibir as mensagens de serviço juntamente com as mensagens de status. O comando status funciona de forma parecida com o comando tail e também exibe as mensagens de registro em formatos diferentes, o que faz dele uma poderosa ferramenta de depuração.

Mostrar falha na inicialização de serviço

Sempre que um serviço falhar ao ser iniciado, use systemctl status <meu_serviço>.service para ver a mensagem detalhada do erro:

root # systemctl start apache2.service
Job failed. See system journal and 'systemctl status' for details.
root # systemctl status apache2.service
   Loaded: loaded (/usr/lib/systemd/system/apache2.service; disabled)
   Active: failed (Result: exit-code) since Mon, 04 Jun 2012 16:52:26 +0200; 29s ago
   Process: 3088 ExecStart=/usr/sbin/start_apache2 -D SYSTEMD -k start (code=exited, status=1/FAILURE)
   CGroup: name=systemd:/system/apache2.service

Jun 04 16:52:26 g144 start_apache2[3088]: httpd2-prefork: Syntax error on line
205 of /etc/apache2/httpd.conf: Syntax error on li...alHost>
Mostrar as últimas n mensagens de serviço

O comportamento padrão do subcomando status é exibir as dez últimas mensagens emitidas por um serviço. Para mudar o número de mensagens exibidas, use o parâmetro --lines=n:

systemctl status ntp.service
systemctl --lines=20 status ntp.service
Mostrar as mensagens de serviço no modo de anexação

Para exibir um fluxo ao vivo das mensagens de serviço, use a opção --follow, que funciona como o tail -f:

systemctl --follow status ntp.service
Formato de saída das mensagens

O parâmetro --output=modo permite mudar o formato de saída das mensagens de serviço. Os modos mais importantes disponíveis são:

short

O formato padrão. Mostra as mensagens de registro com uma marcação de horário legível.

verbose

Saída completa com todos os campos.

cat

Saída resumida sem marcações de horário.

11.7 Mais informações

Para obter mais informações sobre o systemd, consulte os seguintes recursos online:

Home page

http://www.freedesktop.org/wiki/Software/systemd

systemd para administradores

Lennart Pöttering, um dos criadores do systemd, escreveu uma série de entradas de blog (13 até o fechamento deste capítulo). Encontre-os em http://0pointer.de/blog/projects.

Centro de Controle: O sistema init do Linux systemd

http://www.h-online.com/open/features/Control-Centre-The-systemd-Linux-init-system-1565543.html

Inicialização: Ferramentas e dicas sobre o systemd, uma ferramenta init do Linux

http://www.h-online.com/open/features/Booting-up-Tools-and-tips-for-systemd-1570630.html

Imprimir esta página