Neste exemplo de um arquivo de unidade systemd:
# systemd-timesyncd.service
...
Before=time-sync.target sysinit.target shutdown.target
Conflicts=shutdown.target
Wants=time-sync.target
systemd-timesyncd.service
deve começar antes time-sync.target
. Isso define uma dependência de ordenação .
Mas ao mesmo systemd-timesyncd.service
tempo quer time-sync.target
. Assim time-sync.target
é a dependência de requisitos
Qual é o caso de uso para essa relação e por que eles não estão em conflito entre si?
O caso de uso dessa relação dupla é semelhante a uma relação “fornece”.
systemd-timesyncd
fornece um serviço de sincronização de tempo, portanto, satisfaz qualquer dependência que uma unidade tenha dotime-sync.target
. Deve começar antestime-sync.target
porque é necessário para qualquer serviço que dependa de sincronização de tempo, e quertime-sync.target
porque qualquer unidade que dependa de sincronização de tempo deve ser iniciada junto com osystemd-timesyncd
serviço.Acho que o mal-entendido vem da sua interpretação de “quer”. A relação “quer” no systemd não é uma dependência:
systemd-timesyncd
não precisatime-sync
funcionar. É uma relação “começar junto com”: diz que a unidade de configuração (systemd-timesyncd.service
) quer que as unidades listadas (time-sync.target
) comecem junto com ela.Consulte também Qual serviço fornece time-sync.target no systemd?
O objetivo desse mecanismo é garantir que os relacionamentos de ordenação possam ser feitos, mas não entrem em vigor a menos que seja necessário.
time-sync.target
é um marco de pedidos. Todos os serviços que fornecem "sincronização de tempo" especificam que sãoBefore
otime-sync.target
, para que o destino só fique pronto quando a "sincronização de tempo" estiver em vigor. Todos os serviços que precisam de "sincronização de tempo" para entrar em vigor quando executados especificam que sãoAfter
os arquivostime-sync.target
.Se este também tivesse
Wants
relação com aquele alvo, então acabaria sempre por ser ordenado por ele, pois sempre estaria incluído no conjunto de coisas que se ordenam.Isso é visto como subótimo no caso em que não há de fato nenhum serviço de "sincronização de tempo" concreto; e o pensamento das pessoas do sistema é que tal ordenação não deveria estar em vigor em tal caso. Em vez disso, os serviços devem ser solicitados como se
time-sync.target
não existissem, permitindo que alguns deles sejam iniciados muito mais cedo, se essa for sua posição "natural" sem o marco.A solução é
time-sync.target
realmente não estar lá. Ele não é desejado pelos serviços que esperam iniciar depois que a sincronização de horário estiver disponível. Portanto, não existe no conjunto de coisas ordenadas se apenas esses serviços forem iniciados. Ele só é trazido para o conjunto se um serviço real de "sincronização de tempo" for iniciado, com isso (em vez dos serviços do cliente) tendo oWants
relacionamento que o traz.Os alvos não precisam necessariamente ser coleções de serviços. Eles também podem ser marcos de pedidos.
Há um bom número desses marcos puros, no systemd e em outros lugares. O
name-services
destino na coleção de pacotes de serviços do conjunto de ferramentas nosh é um marco de pedido puro semelhante.Leitura adicional
system-control
. Guia de no . Programas.time-sync.target
é uma espécie de sinalizador no sistema, para que os serviços que dependem de um horário correto não precisem depender de systemd-timesyncd, ntpd, o que for.A
Before
entrada diz ao systemd para iniciar systemd-timesyncd, então time-sync.target (isso é apenas para ordenação). OWants
diz para realmente definir o sinalizador.