Is there documentation for this behaviour?
Está escrito. O ponteiro para por que isso é implementado é encontrado em uma mensagem de commit para um arquivo que foi movido para outro lugar ...
I'm pleasantly surprised to see that this behaviour somehow detects if I masked rsync while it was installed, and avoids unmasking it automatically if I remove and reinstall rsync. How is this implemented?? Are there any more subtle limitations to it?
Olhe com atenção e você ainda pode encontrar o histórico de fontes . Ele se vincula a um problema , que confirma que o mascaramento é usado para manipular os scripts do sistema V da melhor maneira possível no systemd.
Tangente: há uma proposta não implementada que elimina a necessidade disso, # 749400 - dh_installinit: desabilitar scripts de inicialização na remoção do pacote . Não que seja uma ideia inequivocamente boa. IIUC, perde a noção se o script foi ativado pelo usuário. (Note que esta é uma configuração separada para cada runlevel, no init do sistema V).
A pista para isso estava no script de pacote, que encontrei em /var/lib/dpkg/info/rsync.postrm
.
## from /usr/share/debhelper/autoscripts/postrm-systemd :
if [ "$1" = "remove" ]; then
if [ -x "/usr/bin/deb-systemd-helper" ]; then
deb-systemd-helper mask rsync.service >/dev/null
fi
fi
O que isto faz está documentado em man deb-systemd-helper
. "A ação" máscara "manterá o estado sobre se o serviço foi ativado / desativado antes e retornará corretamente a esse estado em" desmascarar ". ' Também é comentado em rsync.postinst
:
## from /usr/share/debhelper/autoscripts/postinst-systemd-enable :
# This will only remove masks created by d-s-h on package removal.
deb-systemd-helper unmask rsync.service >/dev/null || true
O Fedora Linux (versão 25) não implementa esse comportamento. Indiscutivelmente, porque eles não suportam o init do sistema V e tinham uma política para remover completamente os scripts init antigos. Eu não sei como eles lidaram com esse problema durante a transição ... mas eles poderiam ter ignorado isso sem causar nenhum problema funcional.
What is the conflict that causes systemd to warn, when faced with this behaviour of Debian?
No caso geral, mascarar um serviço habilitado parece um pouco suspeito, talvez?
Parece que as distribuições baseadas em rpm não tentaram preservar o status dos initscripts. Porque eles executam checkconf --del
na remoção. link
O moderno Fedora rpms tem código equivalente
$ rpm -q --scripts rsync
...
# Package removal, not upgrade
systemctl --no-reload disable --now avahi-daemon.socket avahi-daemon.service > /dev/null 2>&1 || :
...
Eu olhei para isso quando percebi que remover o rsync-daemon não remove /etc/systemd/system/multi-user.target.wants/rsyncd.service
. Porque Este é um bug específico para o pacote rsync: o arquivo de serviço está no pacote systemctl disable
atualmente não remove links simbólicos se eles apontarem para um arquivo que já foi removido. rsync
, mas o scripts rpm referentes ao serviço estão no pacote rsync-daemon
.