Tutorial de Introdução ao Systemd: Parte Prática
Tutorial de Introdução ao Systemd: Parte de Comandos 1. Origem II. Visão Geral do Systemd Três, Gestão do Sistema 3.1 systemctl 3.2 systemd-analyze 3.3 hostnamectl 3.4 localectl 3.5 timedatectl 3.6 loginctl quatro, unidade 4.1 Significado Estado da Unidade 4.2 4.3 Gestão de Unidade 4.4 Dependências Cinco, o arquivo de configuração da Unidade. 5.1 Visão Geral 5.2 Estado do arquivo de configuração 5.3 Formato do arquivo de configuração 5.4 Blocos de configuração do arquivo Seis, Alvo Sete, Gestão de Registros Informações do documento
Autor: Ruan Yifeng
Data: 7 de março de 2016
Systemd é uma ferramenta do sistema Linux usada para iniciar. daemon tornou-se a configuração padrão na maioria das distribuições.
Este artigo apresenta seu uso básico, dividido em duas partes. Hoje, vamos apresentar seus principais comandos. Próximo artigo. Introduza como usar em situações reais.
Na história,
Inicialização do Linux
sempre adotado
init
Processo.
O comando abaixo é usado para iniciar o serviço.
xxxxxxxxxx
$ sudo /etc/init.d/apache2 start
ou
$ service apache2 start
Esse método tem duas desvantagens.
Primeiro, o tempo de inicialização é longo.
init
Os processos são iniciados em série, e apenas quando o processo anterior é concluído, o próximo processo será iniciado.
Em segundo lugar, o script de inicialização é complexo.
init
O processo apenas executa o script de inicialização, sem se preocupar com outras coisas. O script precisa lidar com várias situações por conta própria, o que muitas vezes faz com que o script se torne muito longo.
O Systemd foi criado para resolver esses problemas. Seu objetivo de design é fornecer uma solução completa para a inicialização e gerenciamento do sistema.
De acordo com a convenção do Linux, as letras
d
É a abreviação de "daemon". O significado do nome Systemd é que ele deve proteger todo o sistema.
(A imagem acima é do autor do Systemd) Lennart Poettering )
Usando o Systemd, não é mais necessário usar.
init
O systemd substituiu
initd
tornando-se o primeiro processo do sistema (PID igual a 1), outros processos são seus processos.
xxxxxxxxxx
$ systemctl --version
O comando acima verifica a versão do Systemd.
Systemd 的优点是功能强大,使用方便,缺点是体系庞大,非常复杂。事实上,现在还有很多人反对使用 Systemd,理由就是它过于复杂,与操作系统的其他部分强耦合,违反"keep simple, keep stupid"的 Filosofia Unix
(A imagem acima é um diagrama da arquitetura do Systemd)
Systemd não é um comando, mas sim um conjunto de comandos que envolve todos os aspectos da gestão do sistema.
systemctl
É o comando principal do Systemd, utilizado para gerenciar o sistema.
xxxxxxxxxx
# Reiniciar o sistema
$ sudo systemctl reboot
# Desligar o sistema, cortar a energia
$ sudo systemctl poweroff
# CPU parou de funcionar
$ sudo systemctl halt
# Suspender o sistema
$ sudo systemctl suspend
# Colocar o sistema em modo de hibernação
$ sudo systemctl hibernate
# Colocar o sistema em estado de suspensão interativa
$ sudo systemctl hybrid-sleep
# Iniciar em modo de recuperação (modo de usuário único)
$ sudo systemctl rescue
systemd-analyze
O comando é usado para verificar o tempo de inicialização.
xxxxxxxxxx
# Verificar o tempo de inicialização
$ systemd-analyze
# Verifique o tempo de inicialização de cada serviço
$ systemd-analyze blame
# Exibir o fluxo de processo de inicialização em forma de cascata
$ systemd-analyze critical-chain
# Exibir o fluxo de inicialização do serviço especificado
$ systemd-analyze critical-chain atd.service
hostnamectl
O comando é usado para visualizar as informações do host atual.
xxxxxxxxxx
# Exibir informações sobre o host atual
$ hostnamectl
# Definir o nome do host.
$ sudo hostnamectl set-hostname rhel7
localectl
O comando é usado para verificar as configurações de localização.
xxxxxxxxxx
# Verificar configurações de localização
$ localectl
# Configurar parâmetros de localização.
$ sudo localectl set-locale LANG=en_GB.utf8
$ sudo localectl set-keymap en_GB
timedatectl
O comando é usado para verificar a configuração do fuso horário atual.
# Verificar a configuração do fuso horário atual
$ timedatectl
# Exibir todos os fusos horários disponíveis
$ timedatectl list-timezones
# Definir o fuso horário atual
$ sudo timedatectl set-timezone America/New_York
$ sudo timedatectl set-time YYYY-MM-DD
$ sudo timedatectl set-time HH:MM:SS
loginctl
O comando é usado para ver os usuários atualmente logados.
xxxxxxxxxx
# Listar a sessão atual
$ loginctl list-sessions
# Listar usuários atualmente logados
$ loginctl list-users
# Listar informações do usuário especificado
$ loginctl show-user ruanyf
O Systemd pode gerenciar todos os recursos do sistema. Diferentes recursos são coletivamente chamados de Unidades.
A unidade é dividida em 12 tipos.
systemctl list-units
O comando pode ver todas as Unidades do sistema atual.
xxxxxxxxxx
# Liste as Unidades em execução
$ systemctl list-units
# Liste todas as Unidades, incluindo aquelas sem arquivo de configuração encontrado ou que falharam ao iniciar.
$ systemctl list-units --all
# Liste todos os Units que não estão em execução.
$ systemctl list-units --all --state=inactive
# Liste todas as Unidades que falharam ao carregar
$ systemctl list-units --failed
# Liste todas as unidades do tipo service que estão em execução.
$ systemctl list-units --type=service
systemctl status
O comando é usado para verificar o estado do sistema e o estado de uma única unidade.
xxxxxxxxxx
# Exibir o estado do sistema
$ systemctl status
# Exibir o estado de uma única Unidade
$ sysystemctl status bluetooth.service
# Mostrar o estado de uma unidade específica em um host remoto
$ systemctl -H root@rhel7.example.com status httpd.service
exceto
status
ordem,
systemctl
Também foram fornecidos três métodos simples para consultar o estado, principalmente para uso em instruções de verificação internas do script.
xxxxxxxxxx
# Exibir se uma determinada Unidade está em execução
$ systemctl is-active application.service
# Exibir se uma Unidade está em estado de falha ao iniciar
$ systemctl is-failed application.service
# Exibir se um serviço Unit estabeleceu um link de inicialização
$ systemctl is-enabled application.service
Para os usuários, os comandos mais utilizados para iniciar e parar Unidades (principalmente serviços) são os seguintes.
xxxxxxxxxx
# Iniciar um serviço imediatamente
$ sudo systemctl start apache.service
# Parar um serviço imediatamente
$ sudo systemctl stop apache.service
Reiniciar um serviço
$ sudo systemctl restart apache.service
# Matar todos os subprocessos de um serviço
$ sudo systemctl kill apache.service
# Recarregar o arquivo de configuração de um serviço
$ sudo systemctl reload apache.service
# Recarregar todos os arquivos de configuração modificados
$ sudo systemctl daemon-reload
# Mostrar todos os parâmetros subjacentes de uma determinada Unidade
$ systemctl show httpd.service
# Mostrar o valor de um atributo específico de uma Unidade
$ systemctl show -p CPUShares httpd.service
# Definir um atributo específico de uma unidade
$ sudo systemctl set-property httpd.service CPUShares=500
Há uma relação de dependência entre as unidades: A depende de B, o que significa que o Systemd, ao iniciar A, também iniciará B.
systemctl list-dependencies
Comando para listar todas as dependências de uma Unidade.
xxxxxxxxxx
$ systemctl list-dependencies nginx.service
Na saída do comando acima, algumas dependências são do tipo Target (conforme descrito abaixo) e, por padrão, não serão exibidas. Para expandir o Target, é necessário usar
--all
Parâmetro.
xxxxxxxxxx
$ systemctl list-dependencies --all nginx.service
Cada Unit tem um arquivo de configuração que informa ao Systemd como iniciar essa Unit.
O diretório padrão do systemd
/etc/systemd/system/
Ler o arquivo de configuração. No entanto, a maioria dos arquivos armazenados nele são links simbólicos que apontam para diretórios.
/usr/lib/systemd/system/
O verdadeiro arquivo de configuração está armazenado naquele diretório.
systemctl enable
O comando é usado para estabelecer uma relação de link simbólico entre os dois diretórios acima.
xxxxxxxxxx
$ sudo systemctl enable clamd@scan.service
# Equivalente a
$ sudo ln -s '/usr/lib/systemd/system/clamd@scan.service' '/etc/systemd/system/multi-user.target.wants/clamd@scan.service'
Se o arquivo de configuração estiver configurado para iniciar automaticamente na inicialização,
systemctl enable
O comando equivale a ativar a inicialização automática.
correspondentemente,
systemctl disable
O comando é usado para revogar a relação de link simbólico entre dois diretórios, o que equivale a desativar a inicialização automática.
xxxxxxxxxx
$ sudo systemctl disable clamd@scan.service
A extensão do arquivo de configuração é o tipo dessa Unidade, como por exemplo.
sshd.socket
Se omitido, o sufixo padrão do Systemd é
.service
então
sshd
pode ser entendido como
sshd.service
。
systemctl list-unit-files
O comando é usado para listar todos os arquivos de configuração.
xxxxxxxxxx
# Listar todos os arquivos de configuração
$ systemctl list-unit-files
# Listar arquivos de configuração do tipo especificado
$ systemctl list-unit-files --type=service
Este comando irá gerar uma lista.
xxxxxxxxxx
$ systemctl list-unit-files
UNIT FILE STATE
chronyd.service enabled
clamd@.service static
clamd@scan.service disabled
Esta lista mostra o status de cada perfil, totalizando quatro tipos.
[Install]
Parte (não executável), apenas pode ser utilizada como dependência de outros arquivos de configuração.
Atenção, não é possível determinar a partir do estado do arquivo de configuração se a Unidade está em execução. Isso deve ser realizado conforme mencionado anteriormente.
systemctl status
Comando.
xxxxxxxxxx
$ systemctl status bluetooth.service
Uma vez que o arquivo de configuração é modificado, é necessário fazer com que o SystemD recarregue o arquivo de configuração e, em seguida, reiniciar, caso contrário, a modificação não terá efeito.
xxxxxxxxxx
$ sudo systemctl daemon-reload
$ sudo systemctl restart httpd.service
O arquivo de configuração é um arquivo de texto comum que pode ser aberto com um editor de texto.
systemctl cat
O comando pode visualizar o conteúdo do arquivo de configuração.
xxxxxxxxxx
$ systemctl cat atd.service
[Unit]
Description=ATD daemon
[Service]
Type=forking
ExecStart=/usr/bin/atd
[Install]
WantedBy=multi-user.target
A partir da saída acima, podemos ver que o arquivo de configuração é dividido em vários blocos. A primeira linha de cada bloco é identificada por um nome entre colchetes, como
[Unit]
Atenção, os nomes dos blocos e os nomes dos campos no arquivo de configuração são sensíveis a maiúsculas e minúsculas.
Dentro de cada bloco, existem pares de chave-valor conectados por sinais de igual.
xxxxxxxxxx
[Section]
Directive1=value
Directive2=value
. . .
[Unit]
O bloco de configuração geralmente é o primeiro bloco do arquivo de configuração, usado para definir os metadados da Unidade e as relações com outras Unidades. Seus principais campos são os seguintes.
Dsecription
Descrição breve
Documentation
Endereço do documento
Requires
O Unit atual depende de outros Units; se eles não estiverem em execução, o Unit atual falhará ao iniciar.
Wants
: Outras Unidades que trabalham em conjunto com a Unidade atual, se não estiverem em execução, a Unidade atual não falhará ao iniciar.
BindsTo
e
Requires
Semelhante, se a Unidade especificada sair, fará com que a Unidade atual pare de funcionar.
Before
Se a Unidade especificada por esse campo também precisar ser iniciada, ela deve ser iniciada após a Unidade atual.
After
Se a Unidade especificada por este campo também deve ser iniciada, ela deve ser iniciada antes da Unidade atual.
Conflicts
A Unidade especificada aqui não pode ser executada ao mesmo tempo que a Unidade atual.
Condition...
As condições que a Unidade deve atender para funcionar atualmente, caso contrário, não funcionará.
Assert...
As condições que a Unidade deve atender para funcionar atualmente, caso contrário, ocorrerá uma falha na inicialização.
[Install]
Normalmente é o último bloco do arquivo de configuração, usado para definir como iniciar e se deve iniciar na inicialização do sistema. Seus principais campos são os seguintes.
WantedBy
O seu valor é um ou mais Targets, e o link simbólico será colocado quando a Unidade estiver ativada (enable).
/etc/systemd/system
Embaixo do diretório, com o nome do alvo +
.wants
em subdiretórios formados por sufixos
RequiredBy
Seu valor é um ou mais Targets, e quando a Unidade atual está ativada, o link simbólico será colocado.
/etc/systemd/system
Embaixo do diretório, com o nome do alvo +
.required
em subdiretórios formados por sufixos
Alias
: Alias disponível para iniciar a Unidade atual.
Also
Quando a Unidade atual está ativada (habilitada), outras Unidades que serão ativadas simultaneamente.
[Service]
O bloco de configuração usado para o Service é exclusivo para unidades do tipo Service. Seus principais campos são os seguintes.
Type
Define o comportamento do processo na inicialização. Ele possui os seguintes valores.
Type=simple
Valor padrão, executar
ExecStart
Comando especificado, iniciar o processo principal.
Type=forking
: Criar um processo filho a partir do processo pai usando a forma fork, e após a criação, o processo pai sairá imediatamente.
Type=oneshot
Processo de uma única vez, o Systemd aguardará a saída do serviço atual antes de continuar a execução.
Type=dbus
O serviço atual é iniciado através do D-Bus.
Type=notify
O serviço atual foi iniciado com sucesso e será notificado.
Systemd
Continue a executar.
Type=idle
Se houver outras tarefas concluídas, o serviço atual só será executado então.
ExecStart
Comando para iniciar o serviço atual.
ExecStartPre
Comandos a serem executados antes de iniciar o serviço atual.
ExecStartPost
Comando executado após iniciar o serviço atual.
ExecReload
Comando executado ao reiniciar o serviço atual.
ExecStop
Comando executado ao parar o serviço atual.
ExecStopPost
: Comando a ser executado após a interrupção do serviço
RestartSec
Número de segundos para reiniciar o serviço atual automaticamente.
Restart
Definir em quais situações o Systemd reiniciará automaticamente o serviço atual, os valores possíveis incluem:
always
(Sempre reiniciando)
on-success
、
on-failure
、
on-abnormal
、
on-abort
、
on-watchdog
TimeoutSec
Definir o número de segundos que o Systemd espera antes de parar o serviço atual.
Environment
Definir variáveis de ambiente
Para a lista completa de campos de configuração do arquivo Unit, consulte. Documentação oficial
Ao iniciar o computador, é necessário ativar uma grande quantidade de unidades (Unit). Se a cada inicialização for necessário especificar quais unidades são necessárias, isso se torna claramente muito inconveniente. A solução do Systemd é o Target.
简单说,Target 就是一个 Unit 组,包含许多相关的 Unit 。启动某个 Target 的时候,Systemd 就会启动里面所有的 Unit。从这个意义上说,Target这个概念类似于"状态点",启动某个 Target 就好比启动到某种状态。
tradicional
init
No modo de inicialização, há o conceito de RunLevel, que tem uma função semelhante à de Target. A diferença é que RunLevel é mutuamente exclusivo, não é possível iniciar múltiplos RunLevels ao mesmo tempo, enquanto múltiplos Targets podem ser iniciados simultaneamente.
xxxxxxxxxx
# Ver todos os Targets do sistema atual
$ systemctl list-unit-files --type=target
# Ver todos os Unidades contidas em um Target
$ systemctl list-dependencies multi-user.target
# Verificar o Target padrão durante a inicialização
$ systemctl get-default
# Definir o Target padrão na inicialização
$ sudo systemctl set-default multi-user.target
# Ao alternar o Target, não feche por padrão o processo iniciado pelo Target anterior.
O comando # systemctl isolate altera esse comportamento.
# Fechar todos os processos do Target anterior que não pertencem ao Target seguinte.
$ sudo systemctl isolate multi-user.target
A relação de correspondência entre o Target e o RunLevel tradicional é a seguinte.
xxxxxxxxxx
Traditional runlevel New target name Symbolically linked to...
Runlevel 0 | runlevel0.target -> poweroff.target
Runlevel 1 | runlevel1.target -> rescue.target
Runlevel 2 | runlevel2.target -> multi-user.target
Runlevel 3 | runlevel3.target -> multi-user.target
Runlevel 4 | runlevel4.target -> multi-user.target
Runlevel 5 | runlevel5.target -> graphical.target
Runlevel 6 | runlevel6.target -> reboot.target
Ele com
init
As principais diferenças entre os processos são as seguintes.
(1) Nível de Execução padrão
(Em
/etc/inittab
As configurações de arquivo) agora foram substituídas pelo Target padrão, a localização é
/etc/systemd/system/default.target
geralmente simboliza um link para
graphical.target
(interface gráfica) ou
multi-user.target
(Múltiplos usuários na linha de comando).
Localização do script de inicialização
antes era
/etc/init.d
Diretório, links simbólicos para diferentes diretórios de RunLevel (por exemplo,
/etc/rc3.d
、
/etc/rc5.d
agora está armazenado em
/lib/systemd/system
e
/etc/systemd/system
Índice.
(3) Localização do arquivo de configuração
antes
init
O arquivo de configuração do processo é
/etc/inittab
os arquivos de configuração dos diversos serviços estão armazenados em
/etc/sysconfig
Índice. Os arquivos de configuração atuais estão principalmente armazenados em
/lib/systemd
Índice, em
/etc/systemd
As alterações no diretório podem substituir as configurações originais.
O Systemd gerencia de forma unificada os logs de inicialização de todas as Unidades. A vantagem disso é que você pode usar apenas
journalctl
Um comando para visualizar todos os logs (logs do kernel e logs de aplicativos). O arquivo de configuração dos logs é
/etc/systemd/journald.conf
。
journalctl
Poderoso, com muitas aplicações.
# Ver todos os logs (por padrão, apenas os logs da inicialização atual são salvos)
$ sudo journalctl
# Verificar o log do kernel (não exibir logs de aplicativos)
$ sudo journalctl -k
# Verifique os logs da inicialização do sistema desta vez.
$ sudo journalctl -b
$ sudo journalctl -b -0
# Verifique o log da última inicialização (é necessário alterar as configurações)
$ sudo journalctl -b -1
# Ver logs de um horário específico
$ sudo journalctl --since="2012-10-30 18:17:16"
$ sudo journalctl --since "20 min ago"
$ sudo journalctl --since yesterday
$ sudo journalctl --since "2015-01-10" --until "2015-01-11 03:00"
$ sudo journalctl --since 09:00 --until "1 hour ago"
# Exibir as últimas 10 linhas do log no final
$ sudo journalctl -n
# Exibir as linhas de log especificadas no final
$ sudo journalctl -n 20
# Exibição em tempo real dos logs mais recentes
$ sudo journalctl -f
# Verificar os logs do serviço especificado
$ sudo journalctl /usr/lib/systemd/systemd
# Verificar os logs de um processo específico
$ sudo journalctl _PID=1
# Verificar os logs de um script em um determinado caminho
$ sudo journalctl /usr/bin/bash
# Verificar os logs de um usuário específico
$ sudo journalctl _UID=33 --since today
# Ver logs de uma unidade específica
$ sudo journalctl -u nginx.service
$ sudo journalctl -u nginx.service --since today
# Exibição em tempo real dos últimos logs de uma Unidade
$ sudo journalctl -u nginx.service -f
# Mesclar logs de várias unidades
$ journalctl -u nginx.service -u php-fpm.service --since today
# Ver logs de prioridade especificada (e acima), totalizando 8 níveis.
# 0: emerg
# 1: alert
# 2: crit
# 3: err
# 4: warning
# 5: notice
# 6: info
# 7: debug
$ sudo journalctl -p err -b
# Saída padrão de log com paginação desativada, --no-pager alterado para saída padrão normal.
$ sudo journalctl --no-pager
{"output": "Saída em formato JSON (uma linha)"}
$ sudo journalctl -b -u nginx.service -o json
```json
{
"message": "A saída em formato JSON (multilinha) é mais legível."
}
```
$ sudo journalctl -b -u nginx.serviceqq
-o json-pretty
# Exibir o espaço em disco ocupado pelos logs
$ sudo journalctl --disk-usage
# Especificar o espaço máximo ocupado pelo arquivo de log
$ sudo journalctl --vacuum-size=1G
# Especificar por quanto tempo os arquivos de log devem ser mantidos
$ sudo journalctl --vacuum-time=1years
(Fim)
Você usou recentemente: