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


2

Eu 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á o 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 rodar o VirtualBox em uma inicialização subseqüente, recebi o seguinte erro:

Erro: falha ao iniciar a máquina. Mensagem de erro: o VirtualBox não pode operar no modo raiz do VMX. Por favor, desabilite a extensão do kernel KVM, recompile seu kernel e reinicie (VERR_VMX_IN_VMX_ROOT_MODE)

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

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

sintonizado em uma pesquisa na web que sugeria limpar o 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 a web-magic-dust? Em particular, seria bom saber como se pode dizer qual pacote depende de um dado 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

if '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 seja clara.


1
esta questão pode ser um ajuste melhor no askubuntu
RobotHumans

2
@ aking1012: Esta questão não é específica do Ubuntu; as mesmas ferramentas de gerenciamento de pacotes existem em todos os derivados do Debian, e o problema subjacente se aplica a qualquer distribuição Linux e além. Então, enquanto é no tópico sobre Ask Ubuntu, é um ajuste melhor aqui.
Gilles

Respostas:


1

Não existe uma maneira geral de encontrar pacotes que usam um determinado arquivo. Você pode combinar dpkg -S ou dlocate para encontrar o pacote que 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 todo 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 você nem sempre consegue encontrar através de dependências são os 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 normalmente 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). kvm O módulo do kernel é um componente opcional da máquina virtual kvm; você pode correr /usr/bin/kvm mesmo que o kvm módulo do kernel não está carregado, só vai ser 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 manter o qemu-kvm pacote de carregamento do kvm módulo editando /etc/init.d/qemu-kvm ou /etc/init/qemu-kvm.conf (dependendo se a versão do Ubuntu possui um script SysVinit ou um script Upstart) e comentando a linha de carregamento do módulo, ou impedindo que o serviço seja iniciado no momento da inicialização.


Sim, eu sei como resolver o problema apresentado (no meu caso, purgar o kvm e o qemu-kvm era bom o suficiente), eu queria entender o que é que eu não sei e me equipar com as ferramentas se eu tivesse que enfrentar um problema parecido no futuro, e eu ainda não tenho certeza, por exemplo, como saber qual pacote faz com que um módulo seja carregado (talvez essa deveria ter sido a minha pergunta)
Mcradle

@Mcradle: O ponto principal da minha resposta é que não há um caminho totalmente geral. Qualquer programa poderia fazer com que um módulo carregasse em qualquer ponto (por exemplo, se o qemu tivesse sido projetado de forma um pouco diferente, ele poderia ter carregado o kvm módulo do qemu executável em vez de um script de inicialização).
Gilles

Eu concordo, mas por que o qemu ainda assume que os módulos kvm estão compilados e disponíveis? o pacote do kernel pode nem estar habilitando os drivers.
Mcradle

@Mcradle: Não assume que os módulos estão lá, apenas tenta carregá-los (não fazer nada se eles não estiverem lá ou não forem suportados pelo hardware).
Gilles

Isso demonstra totalmente seu ponto de "uso oportunista" de outros arquivos de pacotes sem registrar isso como uma dependência em qualquer lugar. Eu entendo totalmente.
Mcradle

1

Poeira pixie web? Por seus poderes combinados, uma equipe de ferramentas de pacote vai brilhar uma luz ofuscante e fazer a escuridão recuar!

  1. usar dlocate -S encontrar o pacote do proprietário
  2. usar aptitude remove -sy $pkg para descobrir todos os pacotes dependentes ( -syD 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 )

obrigado. Eu não acho que isso vai funcionar para o caso que eu apresentei porque 'dlocate -S' retorna 'linux-image-2.6.32-25-generic-pae' que é o pacote do kernel que eu não quero desinstalar (alguém poderia imaginar isso é impossível ou desencadeia conseqüências graves)
Mcradle

-sy Na verdade, ele está simulando uma desinstalação e informa o que depende do pacote. Ele é executado sem privilégios de root.
Tobu

-1

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


1
Obrigado pela resposta. Eu acho que 'apt-file search /lib/modules/2.6.32-25-generic-pae/kernel/arch/x86/kvm/kvm.ko' está mostrando apenas o pacote que instalou o arquivo, apt-file não parecem ter outras ações que seriam de interesse.
Mcradle

Desculpe eu estava ferido e não lê bem
zzeroo
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.