Listando pacotes no Yum que dependem de outro pacote instalado


48

Estou tentando instalar um pacote RPM de terceiros no RHEL5, que depende da versão 3.4 do sqlite. De acordo com Yum, eu já tenho o 3.3.6 instalado.

Existe uma maneira de listar os pacotes instalados que dependem do sqlite 3.3.6?

Respostas:


47

A opção rpm que você deseja é:

rpm -q --whatrequires sqlite

Editado: adicionado - instalado por discussão em outras respostas / comentários

Editado: removido - instalado, pois é uma opção inválida para rpm


3
Além disso, repoquerypode ser usado para gerar uma estrutura agradável como uma árvore de todos os pacotes que requerem um pacote específico, por exemplo:repoquery --pkgnarrow=installed --tree-whatrequires sqlite
pdp

3
Não concordo que essa resposta seja confiável - certamente não no CentOS 7.x. Para testar, instale o ImageMagick. O OpenEXR-libs também será instalado, pois o ImageMagick depende disso. Agora execute rpm -q --whatrequir OpenEXR-libs e o retorno é "nenhum pacote requer OpenEXR-libs" que é INCORRETO. Agora execute "repoquery -q --installed --whatrequires OpenEXR-libs" e ele retornará corretamente "ImageMagick-0: 6.7.8.9-15.el7_2.x86_64". @A resposta de um cara aleatório abaixo deve ser a resposta correta aqui.
Pancho

6
--installedé uma opção para, repoquerymas é inválida para rpm.
Dan Rice,

36

Responda

repoquery -q --installed --whatrequires sqlite

Explicações

rpm -q --whatrequires sqlite relata apenas dependências nos nomes dos pacotes.

Pelo contrário, repoqueryage da seguinte forma (de páginas de manual):

   --alldeps
          When used with --whatrequires, look for non-explicit dependencies in addition to explicit ones (e.g. files and Provides  in  addition  to  package  names).
          This is the default.

Exemplo

Vamos pegar o pacote libdb.

# rpm -q --whatrequires libdb
no package requires libdb

Nenhum pacote depende libdb, portanto, poderemos removê-lo sem problemas. Contudo...

# yum remove -y libdb
Loaded plugins: fastestmirror
Resolving Dependencies
--> Running transaction check
---> Package libdb.x86_64 0:5.3.21-19.el7 will be erased
--> Processing Dependency: libdb(x86-64) = 5.3.21-19.el7 for package: libdb-utils-5.3.21-19.el7.x86_64
--> Processing Dependency: libdb-5.3.so()(64bit) for package: pam-1.1.8-12.el7_1.1.x86_64
--> Processing Dependency: libdb-5.3.so()(64bit) for package: rpm-4.11.3-17.el7.x86_64
--> Processing Dependency: libdb-5.3.so()(64bit) for package: rpm-libs-4.11.3-17.el7.x86_64
--> Processing Dependency: libdb-5.3.so()(64bit) for package: libdb-utils-5.3.21-19.el7.x86_64
--> Processing Dependency: libdb-5.3.so()(64bit) for package: cyrus-sasl-lib-2.1.26-20.el7_2.x86_64
--> Processing Dependency: libdb-5.3.so()(64bit) for package: rpm-python-4.11.3-17.el7.x86_64
--> Processing Dependency: libdb-5.3.so()(64bit) for package: python-libs-2.7.5-39.el7_2.x86_64
--> Processing Dependency: libdb-5.3.so()(64bit) for package: rpm-devel-4.11.3-17.el7.x86_64
--> Processing Dependency: libdb-5.3.so()(64bit) for package: 2:postfix-2.10.1-6.el7.x86_64
--> Processing Dependency: libdb-5.3.so()(64bit) for package: rpm-build-libs-4.11.3-17.el7.x86_64
--> Processing Dependency: libdb-5.3.so()(64bit) for package: iproute-3.10.0-54.el7_2.1.x86_64
--> Running transaction check
. . .
. . .
. . .
Error: Trying to remove "systemd", which is protected
Error: Trying to remove "yum", which is protected

Como você pode ver, alguns outros pacotes dependiam não diretamente do pacote, mas do arquivo libdb-5.3.so()(64bit)fornecido por ele.

Finalmente, aqui está a lista real de pacotes, dependendo de libdb:

# repoquery -q --installed --whatrequires libdb
cyrus-sasl-lib-0:2.1.26-20.el7_2.x86_64
iproute-0:3.10.0-54.el7_2.1.x86_64
libdb-utils-0:5.3.21-19.el7.x86_64
pam-0:1.1.8-12.el7_1.1.x86_64
postfix-2:2.10.1-6.el7.x86_64
python-libs-0:2.7.5-39.el7_2.x86_64
rpm-0:4.11.3-17.el7.x86_64
rpm-build-libs-0:4.11.3-17.el7.x86_64
rpm-devel-0:4.11.3-17.el7.x86_64
rpm-libs-0:4.11.3-17.el7.x86_64
rpm-python-0:4.11.3-17.el7.x86_64

1
Esta resposta é melhor do que a resposta aceita
Pancho

11

Para o dnf (nova versão do yum), você pode tentar com o comando repoquery wrapper:

dnf repoquery --whatrequires sqlite

Se não estiver disponível, você pode instalá-lo com o comando:

dnf -y install dnf-plugins-core

Você precisa --installed --recursiveno final para que ele só retorna o que está realmente instalado e não puxar a partir dos repositórios
Hashbrown


3

Eu acho que o que você realmente quer saber é "quais são os pacotes que exigem o sqlite-3.3.6, mas não serão felizes com o sqlite-3.4.z" ... e a única maneira de descobrir isso é: tente. Gostar:

echo | yum upgrade sqlite

1

Como Wes Hardaker disse , um bom método interno é usar rpm -q --whatrequires <package>. O fato é que rpmopera em recursos para resolução de dependências, não apenas em pacotes, como por exemplo dpkgna família de distribuições Linux Debian / Ubuntu. Como outros observaram, simplesmente fazer rpm -q --whatrequires sqlitenão conta a história toda, daí o motivo de alguns sugerirem o uso repoquery. repoquery, no entanto, não é instalado por padrão no RHEL / CentOS 7 mínimo (talvez na área de trabalho também?); portanto, pode não estar disponível para todos.

Um usuário pode fazer rpm -q --provides <pkgname>para ver todos os recursos que um pacote fornece e depois usar rpm -q --whatrequires <capability>para ver quais pacotes instalados exigem esse recurso. Esta informação pode ser consultada de forma sucinta usando uma linha única BASH (separada aqui em duas linhas para o comprimento):

capabilities=($(rpm -q --provides sqlite | awk -F= '{print $1}'));
for c in "${capabilities[@]}"; do rpm -q --whatrequires "$c"; done

Isso usa apenas opções embutidas em rpmsi e, portanto, não requer a instalação de nenhum pacote adicional (por exemplo, yum-utilsno CentOS 7, que é o pacote que contém repoquery).

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.