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.