Encontre todos os pacotes que usam um determinado arquivo no Ubuntu?

2

Gostaria de listar todos os pacotes que usam um determinado arquivo.  Estou disposto a usar qualquer ferramenta (como dpkg, dlocate, apt-file etc.) Por favor, lembre-se quando eu digo 'use' eu não quero dizer necessariamente só possui / instala o arquivo, eu gostaria de saber qual pacote também referenciá-lo, link contra ele etc.

aqui está meu caso de uso:

Eu instalei o KVM e o VirtualBox e acabei usando apenas o VirtualBox, já que o VirtualBox e o KVM competem por recursos de algum tipo, felizmente para mim eu não uso o KVM, então eu o desinstalei.

emitindo:

sudo apt-get purge kvm

Mas não foi o suficiente e quando tentei executar o VirtualBox em uma inicialização subseqüente, recebi o seguinte erro:

Error: failed to start machine. Error message: VirtualBox can't operate in VMX root mode. Please disable the KVM kernel extension, recompile your kernel and reboot (VERR_VMX_IN_VMX_ROOT_MODE)

olhando para os módulos carregados, revelou que os módulos do kernel da kvm ainda estavam carregados

mcradle:~> lsmod | grep -i kvm
kvm_intel              39416  0
kvm                   244969  1 kvm_intel

ajustado para uma pesquisa na web que sugeriu limpar qemu-kvm

sudo apt-get purge qemu-kvm

isso fez o truque, agora a minha pergunta é: como eu poderia ter chegado a essa conclusão sistematicamente sem o web-magic-dust? Em particular, seria bom saber como se pode dizer qual pacote depende de um determinado arquivo ?

Por favor, lembre-se que o dlocate -S não é bom o suficiente porque mostra o pacote do dono do arquivo e eu queria encontrar o pacote que faz com que o 'kvm.ko' seja carregado!

mcradle:/etc# dlocate -S kvm.ko
linux-image-2.6.32-25-generic-pae: /lib/modules/2.6.32-25-generic-pae/kernel/arch/x86/kvm/kvm.ko

se 'apt-rdepends -r' teria aceitado arquivos ao invés de pacotes que poderiam ser exatamente o que eu estou procurando.

Agradecemos antecipadamente e espero que a pergunta esteja clara.

    
por Mcradle 28.11.2010 / 17:14

3 respostas

1

Não existe uma maneira geral de encontrar pacotes que usem um determinado arquivo. Você pode combinar dpkg -S ou dlocate para descobrir qual pacote contém um arquivo, com apt-rdepends para descobrir quais pacotes dependem desse pacote. Mas isso não cobrirá todos os casos e não informará de quais arquivos cada pacote depende (não que isso seja realmente significativo: as dependências se aplicam a pacotes como um todo e, com frequência, não podem ser identificadas em um arquivo específico na embalagem dependente).

Um caso que você não conseguirá encontrar através de dependências é a dependência de pacotes essenciais (aqueles para os quais os metadados incluem Essential: yes ). Todo sistema deve ter a coleção completa de pacotes essenciais, ou se você acredita que cada pacote depende de cada pacote essencial. Caso em questão: kvm.ko é um módulo do kernel, pertencente ao pacote do kernel, que é essencial.

Outro caso que nem sempre é possível encontrar por dependências é o plug-ins. Muitos programas carregarão quaisquer plug-ins que encontrarem instalados e serão executados mesmo se o plug-in não estiver presente, portanto, o programa geralmente não declara dependência do plug-in. (O plug-in pode declarar uma dependência em algum tipo de estrutura de plug-in da qual o pacote que fornece o executável principal do programa depende, mas nem sempre é o caso.) Ponto de partida: o módulo do kernel kvm é um componente opcional da máquina virtual kvm; você pode executar /usr/bin/kvm mesmo se o módulo do kernel kvm não estiver carregado, será apenas mais lento.

Aqui, a mensagem do VirtualBox é tão genérica e segura que é enganosa. A mensagem supõe que a extensão KVM está compilada no kernel, mas no seu sistema é realmente um módulo que pode ser descarregado. Simplesmente descarregar o módulo é suficiente para satisfazer o VirtualBox: basta executar rmmod kvm_amd kvm_intel kvm . Você também pode evitar que o pacote qemu-kvm carregue o módulo kvm editando /etc/init.d/qemu-kvm ou /etc/init/qemu-kvm.conf (dependendo se a versão do Ubuntu possui um script SysVinit ou Upstart) e comentando a linha de carregamento do módulo ou impedindo que o serviço seja iniciado no momento da inicialização.

    
por 28.11.2010 / 19:44
1

Web pixie dust? Com seus poderes combinados, uma equipe de ferramentas de embalagem resplandecerá a luz e fará a escuridão recuar!

  1. use dlocate -S para encontrar o pacote do proprietário
  2. use aptitude remove -sy $pkg para descobrir todos os pacotes dependentes ( -syD para adicionar detalhes; aptitude why para encontrar apenas uma cadeia de dependência).

Ou em um passo:

  1. aptitude remove -sy $(dlocate -S /path/to/file |sed 's#:.*##' |uniq )
por 28.11.2010 / 19:15
-1

apt-file deve trabalhar para isso. Eu não testei isso

    
por 28.11.2010 / 17:40