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á:
-
dpkgse recusará a instalar o segundo pacote. -
dpkgremoverá o primeiro pacote antes de instalar o segundo pacote (se o segundo pacote especificar uma relaçãoBreaksouConflictspara o primeiro pacote). -
dpkgatualizará 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çãoConflicts/BreakseReplacespara o primeiro pacote). -
dpkginstalará 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çãoReplacespara 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 .