metodologia genérica para depurar ciclos de ordenação no systemd

15

Estou ciente de segmento seguinte e supostamente uma resposta a ela . Exceto uma resposta não é uma resposta no sentido genérico. Ele diz qual foi o problema em um caso particular, mas não em geral.

Minha pergunta é: existe uma maneira de depurar ciclos de pedido de uma maneira genérica ? Ex .: existe um comando que descreva o ciclo e o que liga uma unidade a outra?

Por exemplo, estou seguindo em journalctl -b (por favor desconsidere a data, meu sistema não tem RTC para sincronizar o tempo com):

Jan 01 00:00:07 host0 systemd[1]: Found ordering cycle on sysinit.target/start
Jan 01 00:00:07 host0 systemd[1]: Found dependency on local-fs.target/start
Jan 01 00:00:07 host0 systemd[1]: Found dependency on cvol.service/start
Jan 01 00:00:07 host0 systemd[1]: Found dependency on basic.target/start
Jan 01 00:00:07 host0 systemd[1]: Found dependency on sockets.target/start
Jan 01 00:00:07 host0 systemd[1]: Found dependency on dbus.socket/start
Jan 01 00:00:07 host0 systemd[1]: Found dependency on sysinit.target/start
Jan 01 00:00:07 host0 systemd[1]: Breaking ordering cycle by deleting job local-fs.target/start
Jan 01 00:00:07 host0 systemd[1]: Job local-fs.target/start deleted to break ordering cycle starting with sysinit.target/start

onde cvol.service (aquele que foi introduzido e que quebra o ciclo) é:

[Unit]
Description=Mount Crypto Volume
After=boot.mount
Before=local-fs.target

[Service]
Type=oneshot
RemainAfterExit=no
ExecStart=/usr/bin/cryptsetup open /dev/*** cvol --key-file /boot/***

[Install]
WantedBy=home.mount
WantedBy=root.mount
WantedBy=usr-local.mount

De acordo com o journalctl, cvol.service quer o basic.service, exceto que não, pelo menos não obviamente. Existe um comando que demonstraria de onde esse link é derivado? E, em geral, existe um comando, que encontraria os ciclos e mostraria a origem de cada link no ciclo?

    
por galets 01.04.2015 / 06:19

2 respostas

16

Is there a command which would demonstrate where this link is derived from?

O mais próximo que você pode fazer é systemctl show -p Requires,Wants,Requisite,BindsTo,PartOf,Before,After cvol.service , que mostrará as listas de dependência resultantes (efetivas) para uma determinada unidade.

is there a command, which would find the cycles and show where each link in the cycle originates?

Para meu conhecimento, não existe tal comando. Na verdade, o systemd não oferece nada para auxiliar na depuração de ciclos de pedidos (suspiro).

According to journalctl, cvol.service wants basic.service, except that it doesn't, at least not obviously.

Primeiro, as dependências de requisitos ( Wants= , Requires= , BindsTo= etc.) são independentes das dependências de ordenação ( Before= e After= ). O que você vê aqui é um ciclo de dependência ordenando , i. e. não tem nada a ver com Wants= etc.

Em segundo lugar, há um número de "dependências padrão" criadas entre unidades de determinados tipos. Eles são controlados pela diretiva DefaultDependencies= na seção [Unit] ( que é ativado por padrão ).

Em particular, a menos que essa diretiva seja explicitamente desativada, qualquer unidade .service -type obtém% dependências implícitasRequires=basic.target e After=basic.target , que é exatamente o que você vê. Isso está documentado em systemd.service (5) .

    
por 01.04.2015 / 18:18
15

Você pode visualizar o ciclo com os comandos systemd-analyze verify , systemd-analyze dot e a GraphViz dot tool:

systemd-analyze verify default.target |&
perl -lne 'print $1 if m{Found.*?on\s+([^/]+)}' |
xargs --no-run-if-empty systemd-analyze dot |
dot -Tsvg >cycle.svg

Você deve ver algo assim:

Aquivocêpodeverociclo:c.service->b.service->a.service->c.service

Colorlegend:black=Requiresdarkblue=Requisitedarkgrey=Wantsred=Conflictsgreen=After

Links:

por 07.09.2015 / 06:53

Tags