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çãoBreaks
ouConflicts
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çãoConflicts
/Breaks
eReplaces
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çãoReplaces
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
.