De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.
Colaboração: Rubens Queiroz de Almeida
Data de Publicação: 25 de agosto de 2026
A inicialização lenta do Linux pode ter diversas causas: serviços aguardando a rede, dispositivos que demoram a responder, sistemas de arquivos, unidades mal configuradas ou programas desnecessários iniciados automaticamente. Em sistemas que utilizam systemd, o comando systemd-analyze ajuda a identificar onde o tempo está sendo gasto.
Além de medir a inicialização, a ferramenta pode mostrar os serviços mais demorados, revelar a cadeia crítica de dependências, gerar gráficos detalhados e verificar erros em arquivos de unidades do systemd.
Antes de começar, confirme qual processo está sendo executado como PID 1:
$ ps -p 1 -o comm=
Em um sistema baseado no systemd, a saída será:
systemd
Confira também a versão instalada:
$ systemd-analyze --version
A saída poderá ser semelhante a:
systemd 257
Os recursos disponíveis podem variar conforme a versão utilizada pela distribuição.
A forma mais simples de usar a ferramenta é executar:
$ systemd-analyze
Esse comando equivale a:
$ systemd-analyze time
Uma saída possível seria:
Startup finished in 8.434s (firmware) + 2.106s (loader) + 3.172s (kernel) + 5.894s (userspace) = 19.607s graphical.target reached after 5.641s in userspace.
O resultado divide a inicialização em etapas:
| Etapa | Significado |
|---|---|
firmware |
Tempo gasto pelo firmware UEFI ou BIOS |
loader |
Tempo gasto pelo carregador de inicialização |
kernel |
Tempo necessário para o kernel iniciar |
initrd |
Tempo gasto na imagem de inicialização temporária, quando utilizada |
userspace |
Tempo gasto pelo systemd para iniciar unidades e alcançar o alvo |
graphical.target |
Momento em que o alvo gráfico foi alcançado |
Nem todos os campos aparecem em todas as máquinas. A medição do firmware e do carregador, por exemplo, depende de o equipamento e o carregador fornecerem essas informações ao systemd.
O tempo total também não representa necessariamente o momento em que o computador está completamente ocioso ou em que todos os programas gráficos terminaram de carregar. Ele indica quando o alvo correspondente foi alcançado e as unidades necessárias foram iniciadas.
Somar os tempos individuais dos serviços não produz o tempo total da inicialização. O systemd inicia muitas unidades paralelamente.
Considere três serviços:
Se forem iniciados simultaneamente, eles podem acrescentar aproximadamente cinco segundos à inicialização, e não doze.
Esse comportamento é essencial para interpretar corretamente os próximos comandos. Um serviço pode levar vários segundos para iniciar sem estar atrasando o restante do sistema.
Execute:
$ systemd-analyze blame
A ferramenta apresenta as unidades ordenadas pelo tempo que levaram para alcançar o estado ativo:
8.341s NetworkManager-wait-online.service 4.227s plymouth-quit-wait.service 2.612s dev-nvme0n1p2.device 1.823s accounts-daemon.service 1.306s systemd-logind.service 987ms firewalld.service 614ms systemd-udev-settle.service
As primeiras linhas merecem atenção porque mostram as unidades que permaneceram mais tempo em ativação.
Podemos limitar a saída:
$ systemd-analyze blame | head -20
Para procurar uma unidade específica:
$ systemd-analyze blame | grep NetworkManager
A saída pode incluir diferentes tipos de unidades:
.service, para serviços;
.device, para dispositivos;
.mount, para sistemas de arquivos;
.socket, para sockets;
.swap, para espaços de troca;
.target, para agrupamentos de unidades.
O comando systemd-analyze blame é um bom ponto de partida, mas não deve ser interpretado como uma lista definitiva dos culpados pela lentidão.
Uma unidade pode apresentar um tempo elevado porque:
Considere esta linha:
8.341s NetworkManager-wait-online.service
Isso não significa necessariamente que o NetworkManager precisou de mais de oito segundos para funcionar. O serviço NetworkManager-wait-online foi criado para aguardar até que a rede satisfaça determinadas condições. Ele pode estar cumprindo exatamente a função para a qual foi configurado.
Desativá-lo sem investigar as dependências pode prejudicar serviços que realmente precisam de conectividade durante a inicialização.
Também existem serviços que informam ao systemd que foram iniciados antes de concluir todo o trabalho interno. Nesses casos, o tempo apresentado pode parecer muito pequeno.
Use blame para encontrar candidatos à investigação, e não como justificativa automática para desativar unidades.
Para descobrir quais unidades realmente fazem parte do caminho que determina quando o sistema alcança o alvo principal, execute:
$ systemd-analyze critical-chain
Uma saída possível seria:
graphical.target @5.641s
└─multi-user.target @5.640s
└─NetworkManager-wait-online.service @1.314s +4.325s
└─NetworkManager.service @623ms +688ms
└─dbus-broker.service @512ms +108ms
└─basic.target @498ms
└─sockets.target @497ms
└─dbus.socket @496ms
A cadeia é apresentada de trás para frente, começando pelo alvo que foi alcançado.
Os símbolos possuem significados diferentes:
@1.314s
indica o momento, contado desde o início do processo analisado, em que a unidade começou ou se tornou ativa.
Já:
+4.325s
indica quanto tempo a unidade levou para ser ativada.
No exemplo, NetworkManager-wait-online.service começou aproximadamente 1,3 segundo depois do início do espaço de usuário e levou cerca de 4,3 segundos para concluir sua ativação.
Também podemos pedir a cadeia crítica de um serviço:
$ systemd-analyze critical-chain sshd.service
Em algumas distribuições, o serviço SSH possui outro nome:
$ systemd-analyze critical-chain ssh.service
Para analisar o gerenciador de rede:
$ systemd-analyze critical-chain NetworkManager.service
Para analisar o alvo gráfico:
$ systemd-analyze critical-chain graphical.target
Se quiser mostrar mais de uma ramificação por unidade, use:
$ systemd-analyze critical-chain --fuzz=1s
O parâmetro informa uma tolerância. Dessa forma, unidades iniciadas em momentos próximos ao da cadeia principal também podem aparecer.
O valor pode ser ajustado:
$ systemd-analyze critical-chain --fuzz=500ms $ systemd-analyze critical-chain --fuzz=2s
Assim como ocorre com blame, a cadeia crítica precisa ser interpretada com cuidado. Ativação por socket, execução paralela e determinadas dependências podem fazer com que o resultado não represente toda a história.
Uma das funções mais úteis do systemd-analyze é a geração de um gráfico em formato SVG:
$ systemd-analyze plot > inicializacao.svg
Abra o arquivo com o navegador:
$ xdg-open inicializacao.svg
Também é possível usar diretamente um navegador:
$ firefox inicializacao.svg
O gráfico apresenta uma linha do tempo com:
Como o arquivo SVG é vetorial, podemos ampliá-lo sem perda de qualidade. Em sistemas com muitas unidades, o gráfico pode ficar bastante alto, mas continua sendo útil para localizar períodos de espera e sobreposições.
Para incluir detalhes adicionais no gráfico, dependendo da versão instalada:
$ systemd-analyze plot --detailed > inicializacao-detalhada.svg
Confira as opções disponíveis em seu sistema:
$ systemd-analyze plot --help
O plot apresenta uma linha do tempo. Para visualizar relacionamentos entre unidades, podemos usar:
$ systemd-analyze dot
A saída utiliza a linguagem DOT. Para transformá-la em uma imagem, instale o Graphviz e execute:
$ systemd-analyze dot | dot -Tsvg > dependencias.svg
Abra o gráfico:
$ xdg-open dependencias.svg
O diagrama completo pode ser enorme. Por isso, geralmente é melhor limitar a análise a uma unidade:
$ systemd-analyze dot sshd.service | dot -Tsvg > sshd-dependencias.svg
Para visualizar somente as dependências que uma unidade utiliza:
$ systemd-analyze dot \ --to-pattern='sshd.service' | dot -Tsvg > dependencias-do-sshd.svg
Para mostrar as unidades que dependem dela:
$ systemd-analyze dot \ --from-pattern='sshd.service' | dot -Tsvg > dependentes-do-sshd.svg
Os nomes podem variar. Antes, confirme o nome da unidade:
$ systemctl list-unit-files | grep -i ssh
Um computador pode iniciar com tempo aceitável e ainda possuir unidades com erro.
Liste-as:
$ systemctl --failed
A saída poderá ser:
UNIT LOAD ACTIVE SUB DESCRIPTION backup.service loaded failed failed Cópia de segurança
Examine o estado da unidade:
$ systemctl status backup.service
Consulte suas mensagens na inicialização atual:
$ journalctl -b -u backup.service
O parâmetro -b limita a consulta ao boot atual.
Para visualizar erros gerais desse boot:
$ journalctl -b -p err
Para incluir mensagens de prioridade warning ou superior:
$ journalctl -b -p warning
Esses comandos complementam o systemd-analyze, pois mostram o motivo pelo qual uma unidade demorou ou falhou.
Por padrão, systemd-analyze trabalha com os dados da inicialização atual. O journalctl, porém, pode ajudar a comparar boots anteriores, desde que o diário seja persistente.
Liste as inicializações registradas:
$ journalctl --list-boots
A saída será semelhante a:
-2 841d... Sat 2026-08-22 08:14:21 -03—Sat 2026-08-22 16:42:10 -03 -1 a712... Sun 2026-08-23 09:03:41 -03—Sun 2026-08-23 22:08:33 -03 0 f209... Mon 2026-08-24 07:50:12 -03—Mon 2026-08-24 10:31:02 -03
Consulte as mensagens do boot anterior:
$ journalctl -b -1
Examine uma unidade no boot anterior:
$ journalctl -b -1 -u NetworkManager.service
Mostre os erros daquela inicialização:
$ journalctl -b -1 -p err
Essa comparação é útil quando a lentidão ocorre de forma intermitente.
O systemd-analyze também verifica a sintaxe e algumas relações de dependência dos arquivos de unidades.
Para examinar um serviço personalizado:
$ systemd-analyze verify meu-servico.service
Se o arquivo estiver em um caminho específico:
$ systemd-analyze verify \ /etc/systemd/system/meu-servico.service
Um erro poderá ser apresentado assim:
Unknown key 'Restar' in section [Service]
Nesse caso, provavelmente foi escrito:
ini Restar=always
em vez de:
ini Restart=always
Também podem aparecer avisos sobre:
Depois de modificar uma unidade instalada, recarregue a configuração:
$ sudo systemctl daemon-reload
Em seguida, verifique novamente:
$ systemd-analyze verify \ /etc/systemd/system/meu-servico.service
A ausência de mensagens normalmente indica que nenhum problema detectável foi encontrado.
A ferramenta também pode interpretar expressões usadas em OnCalendar=:
$ systemd-analyze calendar daily
A saída mostrará a expressão normalizada e a próxima execução:
Original form: daily Normalized form: *-*-* 00:00:00 Next elapse: Wed 2026-08-26 00:00:00 -03
Teste uma expressão mais específica:
$ systemd-analyze calendar \ 'Mon..Fri *-*-* 08:00:00'
Para mostrar as próximas cinco ocorrências:
$ systemd-analyze calendar \ --iterations=5 \ 'Mon..Fri *-*-* 08:00:00'
Isso é útil antes de instalar ou modificar um timer, pois permite confirmar se a expressão será interpretada como imaginamos.
O comando:
$ systemd-analyze security
avalia os mecanismos de isolamento usados pelos serviços carregados. A saída atribui uma exposição estimada a cada unidade.
Para examinar somente um serviço:
$ systemd-analyze security sshd.service
O relatório considera diretivas como:
NoNewPrivileges=;
PrivateTmp=;
ProtectSystem=;
ProtectHome=;
PrivateDevices=;
RestrictAddressFamilies=;
CapabilityBoundingSet=;
SystemCallFilter=;
RestrictNamespaces=.
A avaliação não procura vulnerabilidades no programa. Ela verifica quanto o arquivo de unidade utiliza os recursos de confinamento oferecidos pelo systemd.
Uma nota ruim não significa necessariamente que o serviço foi comprometido. Da mesma forma, uma nota boa não garante que o programa seja seguro. O resultado serve para orientar o endurecimento da unidade.
O systemd também pode executar uma instância associada ao usuário conectado.
Para medir sua inicialização:
$ systemd-analyze --user time
Liste as unidades de usuário mais demoradas:
$ systemd-analyze --user blame
Examine a cadeia crítica:
$ systemd-analyze --user critical-chain
Gere um gráfico:
$ systemd-analyze --user plot \ > inicializacao-usuario.svg
Essa análise pode revelar atrasos provocados por:
~/.config/systemd/user;
Nem todo aplicativo iniciado automaticamente pelo ambiente gráfico é necessariamente gerenciado pelo systemd --user, portanto a análise pode não mostrar tudo o que acontece depois do login.
Suponha que o comando:
$ systemd-analyze blame
mostre:
15.243s NetworkManager-wait-online.service
O primeiro passo é verificar se a unidade faz parte da cadeia crítica:
$ systemd-analyze critical-chain \ NetworkManager-wait-online.service
Depois, examine seu estado:
$ systemctl status \ NetworkManager-wait-online.service
Consulte os logs:
$ journalctl -b \ -u NetworkManager-wait-online.service
Verifique quem depende dela:
$ systemctl list-dependencies \ --reverse \ NetworkManager-wait-online.service
Examine seu arquivo e eventuais sobrescritas:
$ systemctl cat \ NetworkManager-wait-online.service
Consulte suas dependências:
$ systemctl list-dependencies \ NetworkManager-wait-online.service
Somente depois dessa investigação será possível decidir se a espera é:
Encontrar um serviço lento não significa que ele deva ser desativado imediatamente.
Antes de alterar qualquer coisa, descubra sua finalidade:
$ systemctl status nome.service
Examine o arquivo:
$ systemctl cat nome.service
Veja quem depende dele:
$ systemctl list-dependencies \ --reverse \ nome.service
Confira se está habilitado:
$ systemctl is-enabled nome.service
Se tiver certeza de que o serviço é desnecessário, desative-o:
$ sudo systemctl disable nome.service
Para impedir que seja iniciado imediatamente e nas próximas inicializações:
$ sudo systemctl disable --now nome.service
Após reiniciar o computador, compare novamente:
$ systemd-analyze time$ systemd-analyze blame $ systemd-analyze critical-chain
Evite desativar unidades desconhecidas apenas porque aparecem no início de blame. Serviços relacionados a armazenamento, rede, criptografia, login, dispositivos, montagem de sistemas de arquivos e segurança podem ser essenciais.
Nem toda unidade precisa estar habilitada diretamente.
Verifique o estado:
$ systemctl is-enabled nome.service
Uma possível resposta é:
static
Uma unidade estática não possui uma seção de instalação que permita habilitá-la normalmente. Ela pode ser iniciada como dependência de outra unidade ou ativada por:
Por isso, receber static não indica um erro.
Também é possível que um serviço aparentemente desativado seja iniciado sob demanda. Antes de concluir que uma configuração foi ignorada, examine sockets e timers relacionados:
$ systemctl list-sockets $ systemctl list-timers
Nem toda demora pode ser resolvida alterando serviços.
Se o resultado mostrar muito tempo em:
firmware
investigue:
Se a demora estiver em:
loader
verifique:
Se o maior tempo estiver em:
kernel
consulte:
$ dmesg -T
Ou use o diário do kernel:
$ journalctl -b -k
Procure por:
Para destacar mensagens de erro do kernel:
$ journalctl -b -k -p warning
O systemd-analyze mostra a distribuição do tempo. A causa pode estar no firmware, no carregador, no kernel, no hardware ou no espaço de usuário.
Uma análise organizada pode seguir esta sequência.
Primeiro, registre o tempo geral:
$ systemd-analyze time
Depois, encontre as unidades demoradas:
$ systemd-analyze blame | head -20
Examine a cadeia que determina o tempo de inicialização:
$ systemd-analyze critical-chain
Gere uma linha do tempo:
$ systemd-analyze plot > inicializacao.svg
Procure serviços com falha:
$ systemctl --failed
Consulte os erros do boot:
$ journalctl -b -p err
Investigue individualmente as unidades suspeitas:
$ systemctl status nome.service$ journalctl -b -u nome.service $ systemctl list-dependencies \ --reverse \ nome.service
Faça apenas uma alteração por vez, reinicie e repita as medições. Esse cuidado permite saber qual modificação realmente produziu resultado.
## 21. Salvando um relatório da inicialização
Para guardar os resultados antes de fazer alterações:
$ systemd-analyze time \ > tempo-inicializacao.txt $ systemd-analyze blame \ > unidades-por-tempo.txt $ systemd-analyze critical-chain \ > cadeia-critica.txt $ systemd-analyze plot \ > inicializacao.svg $ systemctl --failed \ > unidades-com-falha.txt $ journalctl -b -p warning \ > avisos-inicializacao.txt
Depois de alterar a configuração e reiniciar, gere uma segunda série de arquivos para comparar os resultados.
É importante realizar mais de uma medição. Atualizações, verificações de discos, conexões de rede e tarefas ocasionais podem fazer um boot isolado parecer mais lento ou mais rápido do que o normal.
O systemd-analyze é poderoso, mas seus números precisam de contexto.
Tenha em mente que:
blame mostra duração, e não necessariamente impacto;
systemd;
A unidade que aparece no topo de blame nem sempre é a que deve ser corrigida. A melhor evidência costuma vir da combinação entre time, blame, critical-chain, plot, systemctl e journalctl.
| Objetivo | Comando |
|---|---|
| Medir a inicialização | systemd-analyze time |
| Ordenar unidades por duração | systemd-analyze blame |
| Mostrar a cadeia crítica | systemd-analyze critical-chain |
| Analisar uma unidade | systemd-analyze critical-chain nome.service |
| Gerar linha do tempo em SVG | systemd-analyze plot > inicializacao.svg |
| Gerar dependências em DOT | systemd-analyze dot |
| Verificar um arquivo de unidade | systemd-analyze verify arquivo.service |
| Testar expressão de calendário | systemd-analyze calendar 'expressão' |
| Avaliar isolamento de serviços | systemd-analyze security |
| Analisar serviços do usuário | systemd-analyze --user blame |
| Listar unidades com falha | systemctl --failed |
| Ver logs do boot atual | journalctl -b |
| Ver erros do boot atual | journalctl -b -p err |
O systemd-analyze permite transformar a percepção de que “o computador está demorando para iniciar” em informações concretas. Ele mostra quanto tempo foi consumido pelo firmware, carregador, kernel e espaço de usuário, identifica unidades demoradas e revela quais dependências estão no caminho crítico.
O diagnóstico começa com três comandos:
$ systemd-analyze time$ systemd-analyze blame $ systemd-analyze critical-chain
O primeiro fornece uma visão geral. O segundo indica quais unidades merecem investigação. O terceiro ajuda a identificar quais delas realmente influenciam o momento em que o sistema alcança seu alvo principal.
Quando esses dados são combinados com o gráfico produzido por systemd-analyze plot, o estado exibido por systemctl e os registros consultados com journalctl, torna-se possível localizar atrasos com muito mais precisão. A partir daí, qualquer otimização deve ser feita com cautela, uma alteração por vez e sempre acompanhada por novas medições.
A descrição completa dos comandos e das limitações da ferramenta está disponível na documentação oficial do systemd-analyze.