Remover o pacote Debian automaticamente mascara o serviço systemd - provoca um aviso systemd

2

Eu inicializei um contêiner instável do Debian. No início, o systemd dentro do contêiner mostra rsync.service: Cannot add dependency job, ignoring: Unit rsync.service is masked .

Eu determinei que o rsync.service foi mascarado automaticamente porque o pacote rsync foi removido. Reinstalando o pacote desmascarou novamente.

  1. Existe documentação para esse comportamento?
  2. Qual é o conflito que faz com que o systemd avise quando confrontado com esse comportamento do Debian?
  3. Estou agradavelmente surpreso ao ver que esse comportamento de alguma forma detecta se eu mascarei o rsync enquanto ele foi instalado e evito desmascará-lo automaticamente se eu remover e reinstalar o rsync. Como isso é implementado? Existem limitações mais sutis para isso?

Descoberta do mascaramento automático na remoção de pacotes

Eu sabia que o rsync tinha sido originalmente instalado, mas agora foi removido. Eu removi a máscara e fiquei com isso:

$ sudo systemctl status rsync
● rsync.service - LSB: fast remote file copy program daemon
   Loaded: loaded (/etc/init.d/rsync; generated; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:systemd-sysv-generator(8)

$ # reset status of all systemd services
$ # DO NOT TRY THIS COMMAND INSIDE A REAL, NON-CONTAINER SYSTEM...
$ # IT DOES NOT GO WELL.
$ sudo systemctl isolate default.target

$ sudo systemctl status rsync
● rsync.service - LSB: fast remote file copy program daemon
   Loaded: loaded (/etc/init.d/rsync; generated; vendor preset: enabled)
   Active: active (exited) since Wed 2017-06-07 11:35:27 BST; 1s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 432 ExecStart=/etc/init.d/rsync start (code=exited, status=0/SUCCESS)
   CGroup: /machine.slice/machine-unstable.scope/system.slice/rsync.service

Jun 07 11:35:27 unstable systemd[1]: Starting LSB: fast remote file copy program daemon...
Jun 07 11:35:27 unstable systemd[1]: Started LSB: fast remote file copy program daemon.

Esta saída é enganosa. O /etc/init.d/rsync do Debian não estava iniciando rsync --daemon , porque eu não havia alterado o padrão RSYNC_ENABLE=false em /etc/default/rsync . (O próprio script init sairia silenciosamente nesse caso; no entanto, acredito que uma inicialização do systemd mostraria uma mensagem inicial para ele, semelhante às mensagens de log mostradas acima). Então, o mascaramento estava servindo a um propósito útil aqui.

(O motivo pelo qual /etc/init.d/rsync permanece quando o pacote é removido, é que os scripts de inicialização são considerados arquivos de configuração editáveis pelo usuário)

Acontece que, se eu instalar o rsync novamente, o rsync.service será desmascarado. Se eu removê-lo, o rsync.service será mascarado novamente.

Tenho o prazer de dizer que, se eu instalar o rsync, mascará-lo e, em seguida, remover e reinstalar o rsync, o rsync permanecerá mascarado.

Se eu usar apt-get remove --purge rsync para removê-lo completamente, incluindo os arquivos de configuração residuais, a máscara será removida.

Como eu tenho o etckeeper instalado, notei que a remoção completa também remove /etc/systemd/system/multi-user.target.wants/rsync.service , bem como remover a máscara ( /etc/systemd/system/rsync.service - > /dev/null ). Nenhum desses arquivos era de propriedade do pacote ( dpkg-query -L rsync ), então parece que essas remoções são causadas por um script de pacote.

Versões de software

Um repositório instável do Debian. Esta pergunta foi feita logo antes do lançamento do trecho.

Host usado systemd-container versão 231-15.fc25.

Mais contexto para a mensagem do systemd "ignorando: a unidade rsync.service está mascarada"

$ sudo systemd-nspawn -b -D unstable
Spawning container unstable on /home/nspawn/unstable.
Press ^] three times within 1s to kill container.
systemd 232 running in system mode. (+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN)
Detected virtualization systemd-nspawn.
Detected architecture x86-64.

Welcome to Debian GNU/Linux 9 (stretch)!

Set hostname to <unstable>.
Failed to install release agent, ignoring: File exists
rsync.service: Cannot add dependency job, ignoring: Unit rsync.service is masked
[  OK  ] Started Dispatch Password Requests to Console Directory Watch.
    
por sourcejedi 07.06.2017 / 13:31

1 resposta

4

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 systemctl disable atualmente não remove links simbólicos se eles apontarem para um arquivo que já foi removido. Este é um bug específico para o pacote rsync: o arquivo de serviço está no pacote rsync , mas o scripts rpm referentes ao serviço estão no pacote rsync-daemon .

    
por 07.06.2017 / 16:25