Existe uma maneira de ver a árvore de execução do systemd?

63

O que quero dizer com a pergunta é: existe uma maneira de despejar a lista ordenada (como a pstree faz para processos) para ver como o systemd executou o conjunto de unidades fornecido, ou seja, a árvore depois que as dependências foram resolvidas e os trabalhos foram enfileirados para execução ? Eu sei que você pode fazer isso analisando os dados do estado systemd, mas existe uma maneira rápida de ver uma árvore dessas? Isso ajudaria muito na investigação de falhas (por exemplo, se você ver que o processo de inicialização estava travado em alguma unidade, seria capaz de identificar o local aproximado para uma investigação mais profunda.

galáxia
fonte
Eu criei uma ferramenta de visualização para o systemd. Você pode verificar e experimentar a ferramenta em github.com/ywiyogo/systemd-visual
Yongkie

Respostas:

71

systemd-analyzeé seu amigo. Por exemplo, systemd-analyze critical-chainsaídas bloqueando a árvore de daemons. Mina, por exemplo:

graphical.target @20.211s
└─multi-user.target @20.211s
  └─nginx.service @19.348s +862ms
    └─network.target @19.347s
      └─NetworkManager.service @10.315s +9.031s
        └─basic.target @10.312s
          └─timers.target @10.311s
            └─systemd-tmpfiles-clean.timer @10.311s
              └─sysinit.target @10.295s
                └─systemd-update-utmp.service @10.167s +127ms
                  └─systemd-tmpfiles-setup.service @10.124s +41ms
                    └─local-fs.target @10.097s
                      └─home-entd-Downloads.mount @10.093s +2ms
                        └─home.mount @9.326s +672ms
                          └─[email protected] @8.472s +696ms
                            └─dev-sda6.device @8.471s

O NetworkManager no exemplo basicamente mantém a inicialização inteira.

Se você quiser ter uma visão mais detalhada, poderá renderizar toda a cadeia de execução em um arquivo svg. systemd-analyze plot > something.svggera uma cadeia inteira (mais de 120 módulos) como barras de progresso para um arquivo svg de alta resolução que mostra os estados bloqueados e outros problemas.

Finalmente, você tem uma systemd-analyze dotferramenta que gera um arquivo de ponto que gera uma hierarquia inteira: systemd-analyze dot | dot -Tpng -o stuff.png com a ferramenta de ponto, você também pode produzir como arquivos ps e svg.

Todas as ferramentas acima são embutidas na ferramenta systemd-analyse, que vem por padrão com o systemd no archlinux, pelo menos. Eu acho que existem alguns projetos de terceiros lidando com isso também.

IBr
fonte
Obrigado pela sua resposta, no entanto, ela não aborda as perguntas e apenas reitera partes da minha pergunta (mencionei que estou ciente de uma maneira de fazê-lo analisando os dados de estado do systemd). Portanto, a questão é como obter uma árvore semelhante à sequência de inicialização após todas as dependências serem resolvidas (por exemplo, pós-inicialização). A cadeia crítica é quase isso (apesar de ser uma árvore ascendente), mas não lista todas as unidades iniciadas. O que é perguntado na pergunta: uma árvore que lista todas as unidades que foram executadas até algum momento (por exemplo, atingindo o multiusuário.target).
galáxia
4
systemd-analyze plot > something.svgestá completo três de execução com destinos (é o mais próximo do que você deseja). O ponto systemd-analyse é um gráfico completo das dependências (é a representação mais correta). Não é isso que você quer? Na trama, basta encontrar o alvo e ver o que ele também precisa ser executado. As mesmas dependências são exatamente o gráfico listado, se for necessário iniciar algum kit de ferramentas de análise de gráficos e selecionar o ponto do gráfico para o qual você deseja ver dependências (a ferramenta de pontos possui mais configurações). Veja a página de manual: freedesktop.org/software/systemd/man/systemd-analyze.html --order e similares
IBr
11
Da página de manual: Isso plota todas as dependências de qualquer unidade cujo nome comece com "avahi-daemon".: $ systemd-analyze dot 'avahi-daemon.*' | dot -Tsvg > avahi.svg $ eog avahi.svgPlota as dependências entre todas as unidades de destino conhecidas:systemd-analyze dot --to-pattern='*.target' --from-pattern='*.target' | dot -Tsvg > targets.svg $ eog targets.svg
IBr
11
IBr, mas isso não pode ser usado no console de texto, infelizmente. Eu realmente aprecio o tempo que você gastou na resposta (e é correto se você deseja que alguns dados sejam analisados), mas ele não aborda a pergunta original, para que eu possa aceitá-la. Desculpa.
Galaxy
11
OK não tem problema. Eu mesmo amo as ferramentas de linha de comando :) #
7281
13

Ainda não está respondendo totalmente à sua pergunta, mas tente com a --fuzzopção

systemd-analyze critical-chain --fuzz 1h

Observe que você também pode especificar unidades s para ver sua cadeia crítica , para que você não fique limitado ao multiusuário.

systemd-analyze critical-chain network.target local-fs.target

Espero que isto ajude

Ludovic Ronsin
fonte
12

Não sei se entendi corretamente a pergunta, mas existem visualizações em árvore disponíveis com os seguintes comandos:

sudo systemctl status

E também :

sudo systemctl list-dependencies 

Espero que isto ajude :)

Além disso, pode ser útil para outros fins criar uma árvore das pastas de links simbólicos systemctl:

tree /etc/systemd/system

Na verdade, foi realmente útil descobrir unidades antigas / de buggy que estavam desacelerando a inicialização do sistema, para desativá-las posteriormente usando o systemctl disablecomando

EDITAR

Dito isso, eu realmente concordo com o OP de que essa funcionalidade básica deve ser fornecida por meio de ferramentas de linha de comando, e não por uma ferramenta gráfica ... E se você não puder iniciar o X? Como você lida com o seu arquivo svg?

Na verdade, existe um caminho. Se você não pode usar scp(ferramenta ssh) para buscar seu arquivo em outro computador, fbipode realmente ajudá-lo :)

sudo systemd-analyze plot > /home/user/startup.svg
fbi /home/user/startup.svg

Trabalhei em meus TTYs. Basta navegar dentro da imagem com setas. Existem opções de zoom para listar fbi -h.

Mais uma vez, espero que isso ajude. Está disponível nos repositórios Archlinux e Ubuntu.

EDIT 2:

fbinão funciona sobre ssh. Você pode fazer o encaminhamento do X assim ssh -Y user@server, mas precisa de um servidor X em execução no servidor remoto.

A melhor aposta aqui é usar sshfs. Ele funciona muito bem no espaço do usuário, por exemplo, com nautilus. Há uma pequena configuração para fazer, veja:

sudo vim /etc/fuse.conf #type a, uncomment the user_allow_other line and ESC :wq
sudo mkdir /mnt/yourmountingdir
sudo chown user:user /mnt/yourmountingdir
sshfs [email protected]:/home/user /mnt/yourmountingdir/ -o allow_other #Asks for host trusting and password
sudo fusermount -u /mnt/yourmountingdir/ #To disconnect and unmount
Joel.O
fonte
A questão é sobre a árvore de execução para todas as unidades ativadas pelo sistema após a resolução da dependência. Portanto, esta resposta é uma falta.
Galaxy
Talvez sua pergunta esteja bem ajustada para uma solicitação de recurso? Claro que ajudaria. Enfim, publiquei essa resposta depois de tropeçar na sua pergunta, porque, de alguma forma, lembrava outra pergunta sobre a qual eu precisava de algumas informações, e senti que faltavam alguns exemplos básicos (como as coisas que você tentou e não deu certo - o que realmente teria ajudou a esclarecer), especialmente para pessoas como eu lutando depois de perder o init do System V e seu útil arquivo rc.conf. Desculpe, minha resposta não se encaixou. Não vale a pena um voto negativo embora.
Joel.O
Editado com uma solução alternativa para o seu problema. Espero que ajude novamente.
Joel.O
Não pude usar o fbi over ssh no meu servidor. Mas sshfsfunciona ainda melhor. Veja EDIT 2.
Joel.O