Como descobrir qual pacote instalou um symlink

1

Em esta pergunta descrevo meus problemas ao descobrir o pacote que instalou o destino final do /usr/bin/rename comando. dpkg -S /usr/bin/rename não deu resultado, mas depois de descobrir que era um link, encontrei uma solução geral para isso.

Como /usr/bin/rename aponta para /etc/alternatives/rename , sei como esse link específico é gerenciado por update-alternatives .

Como posso descobrir qual pacote realmente instalou um link simbólico, se eu não tivesse esse tipo de conhecimento? Se não houver um comando simples para fazer isso, qual é a estratégia geral para descobrir qual comando configurou um symlink?

    
por Anthon 03.10.2014 / 08:16

1 resposta

4

dpkg -S não pode dizer qual pacote instalou o symlink, pois ele apenas examina os arquivos que foram descompactados dos pacotes. Essas informações são fornecidas pelos arquivos *.list em /var/lib/dpkg/info/*.list .

Todos os arquivos em um sistema Debian só podem pertencer a um pacote. Se você tentar instalar um pacote que contenha um arquivo já fornecido por outro pacote, uma das seguintes ações ocorrerá:

  • dpkg se recusará a instalar o segundo pacote.
  • dpkg removerá o primeiro pacote antes de instalar o segundo pacote (se o segundo pacote especificar uma relação Breaks ou Conflicts para o primeiro pacote).
  • dpkg atualizará o primeiro pacote para uma versão mais nova que não fornece mais o arquivo antes de instalar o segundo pacote (se o segundo pacote especificar uma relação Conflicts / Breaks e Replaces para o primeiro pacote).
  • dpkg instalará o segundo pacote junto com o primeiro pacote e sobrescreverá o arquivo com o fornecido pelo segundo pacote (se o segundo pacote especificar uma relação Replaces para o primeiro pacote).

Obviamente, isso não permite múltiplos pacotes que forneçam o mesmo comando e possam ser instalados ao mesmo tempo, então é aqui que o alternatives system do Debian entra. Os pacotes fornecem seus arquivos com nomes diferentes, por exemplo:

host ~ # dpkg -S /usr/bin/prename 
perl: /usr/bin/prename

e o pacote postinst script ( /var/lib/dpkg/info/perl.postinst ) registra como uma alternativa:

# util-linux has an alternate rename
update-alternatives --install /usr/bin/rename rename /usr/bin/prename 60 \
--slave /usr/share/man/man1/rename.1.gz rename.1.gz \
    /usr/share/man/man1/prename.1.gz

Essa é a razão pela qual dpkg -S não sabe sobre /usr/bin/rename .

How can I find out which package actually installed a symlink, if I would not have that kind of knowledge?

Pacotes Debian podem fornecer links simbólicos, então, desde que não seja um link simbólico alternatives (ou um link simbólico que foi criado pelo postinst por algum outro motivo), dpkg -S funcionará bem.

No caso do sistema alternatives , basta seguir a trilha de links simbólicos:

host ~ # dpkg -S $(readlink -f /usr/bin/rename)
perl: /usr/bin/prename

É claro que isso pode levá-lo a conclusões erradas, por exemplo, quando um pacote cria um symlink em postinst , que aponta para um arquivo fornecido por outro arquivo. Nesses casos, não há uma maneira geral de descobrir o pacote responsável - você terá que fazer algum trabalho de detetive, por exemplo, por grep ping através dos arquivos *.postinst .

    
por 03.10.2014 / 22:24

Tags