Trabalhando com dependências de pacotes em Red Hat Linux

Trabalhando com dependências de pacotes em Red Hat Linux

Objetivo

Nosso objetivo é se acostumar com as ferramentas disponíveis para descobrir informações sobre as dependências de pacotes em um sistema baseado em RPM.

Sistema operacional e versões de software

  • Sistema operacional: Red Hat Enterprise Linux 7.5
  • Programas: RPM 4.11, yum 3.4.3

Requisitos

Acesso privilegiado ao sistema.

Dificuldade

FÁCIL

Convenções

  • # - requer que os comandos Linux sejam executados com privilégios root diretamente como usuário root ou por uso de sudo comando
  • $ - dados os comandos do Linux a serem executados como um usuário não privilegiado regular

Introdução

RPM, que significa Red Hat Package Manager, é um gerenciador de pacotes bem conhecido e maduro usado por todas. Com o RPM, o Packager pode definir relações entre pacotes e até versões de pacotes - por exemplo, um servidor Apache Tomcat precisa de um ambiente java adequado presente para poder executar.

Por outro. Em outras palavras, o servidor tomcat depende em java.

RPM pode facilitar muito a vida de um sysadmin, apresentando essas dependências - e ferramentas que dependem de rpm, como o RPM utilidade, ou yum pode resolver automaticamente essas dependências e instalar todos os pacotes adicionais necessários para que um novo componente seja executado corretamente.



Juntando informações

Para descobrir a lista de pacotes que foo.O pacote de barras depende, basta executar:

# yum deplista foo.bar

E encontrar a lista de pacotes que exigem (depende de) pacote foo.bar:

rpm -q -whatrequiss foo.bar

Um exemplo da vida real com um pacote genérico: Bash. Vamos ver quais pacotes necessários para o pacote Bash:

# Yum Pacote deplista deplista: Bash.x86_64 4.2.46-30.EL7 Dependência: libc.então.6 () (64 bits) Provedor: GLIBC.x86_64 2.17-222.EL7 Dependência: libc.então.6 (glibc_2.11) (64 bits) Provedor: Glibc.x86_64 2.17-222.EL7 Dependência: libc.então.6 (glibc_2.14) (64 bits) Provedor: Glibc.x86_64 2.17-222.EL7 Dependência: libc.então.6 (glibc_2.15) (64 bits) Provedor: Glibc.x86_64 2.17-222.EL7 Dependência: libc.então.6 (glibc_2.2.5) (64 bits) Provedor: Glibc.x86_64 2.17-222.EL7 Dependência: libc.então.6 (glibc_2.3) (64 bits) Provedor: Glibc.x86_64 2.17-222.EL7 Dependência: libc.então.6 (glibc_2.3.4) (64 bits) Provedor: Glibc.x86_64 2.17-222.EL7 Dependência: libc.então.6 (glibc_2.4) (64 bits) Provedor: Glibc.x86_64 2.17-222.EL7 Dependência: libc.então.6 (glibc_2.8) (64 bits) Provedor: Glibc.x86_64 2.17-222.EL7 Dependência: libdl.então.2 () (64 bits) Provedor: GLIBC.x86_64 2.17-222.EL7 Dependência: libdl.então.2 (glibc_2.2.5) (64 bits) Provedor: Glibc.x86_64 2.17-222.EL7 Dependência: Libtinfo.então.5 () (64 bits) Provedor: Ncurses-Libs.x86_64 5.9-14.20130511.EL7_4 Dependência: RTLD (GNU_Hash) Provedor: Glibc.x86_64 2.17-222.Provedor EL7: glibc.I686 2.17-222.EL7 
cópia de

Da perspectiva do pacote, Bash é muito genérico e, como visto acima, depende de alguns pacote central. Mas se gostaríamos de instalar algo muito mais dependente, digamos, o Konzole Emulador de terminal KDE em um Red Hat Linux com um gerente de desktop Gnome, podemos obter mais de uma página de longa lista de dependência. E com Konzole, O caso é ainda mais complicado, pois depende de pacotes QT e KDE; portanto, para instalá -lo, você precisará instalar todo o ambiente KDE ao lado do Gnome (o que você certamente pode fazer) para fornecer tudo Konzole precisa.

Para obter mais informações sobre quais pacotes serão instalados, verifique a lista fornecida por Yum antes de iniciar a instalação:

# yum install konsole resolvendo dependências-> Verificação de transações em execução ---> pacote konsole.x86_64 0: 4.10.5-4.EL7 será instalado-> Dependência do processamento: Konsole-parte = [… .] 
cópia de

No caso de um sistema Red Hat com Gnome, pode levar algum tempo para resolver as dependências de um aplicativo KDE pela primeira vez, e quando isso terminar, Yum apresentará o único pacote único que pedimos, com um bom tamanho pequeno. Seguido de mais de cem pacotes instalados para dependências:

[… .]-> Verificação de transações em execução ---> Sistema de impulso.x86_64 0: 1.53.0-27.EL7 será instalado ---> pacote de impulso.x86_64 0: 1.53.0-27.EL7 será instalado -> Dependências de resolução de dependência acabadas resolvidas ========================================================== =================================================== ======================================= Pacote Tamanho do repositório da versão do arco do pacote ======== =================================================== =================================================== =================== Instalando: Konsole x86_64 4 4.10.5-4.EL7 RHEL-7-SERVER-RPMS 78 K Instalação para dependências: OpenExr-Libs [… .] 
cópia de

E no resumo, podemos ver que a instalação usará muito mais espaço no disco no final, o tamanho do pacote de que precisamos:

[… .] Resumo da transação ================================================ =================================================== ============================== Instalar 1 pacote (+120 pacotes dependentes) Tamanho total do download: 108 M Tamanho instalado: 307 M 
cópia de

Isso é muito, mas temos uma informação útil sobre quanto espaço será usado. Isso é especialmente útil se instalarmos muitos pacotes em uma transação.

Embora, neste caso, a transação seja desperdiçada, o objetivo das dependências é, em última análise, a economizar recursos: se alguém implementa alguma funcionalidade em seu código, e isso pode ser chamado no sistema, o próximo desenvolvedor pode não precisar implementar a mesma funcionalidade novamente, mas use a implementação já existente. Para o Konzole exemplo, se você quiser instalar AkreGator Da próxima vez, o sistema terá muitas dependências resolvidas, como Kdepim pacote contendo AkreGator Também depende Qt, Kdelibs, e tal.

Podemos usar RPM utilidade para obter as informações de outra maneira: vamos listar os pacotes instalados que exigem o Bash pacote:

# RPM -Q--WhatRequis Bash Dracut-033-535.EL7.x86_64 initscripts-9.49.41-1.EL7.x86_64 Autofs-5.0.7-83.EL7.x86_64 lvm2-2.02.177-4.EL7.x86_64 rsysLog-8.24.0-16.EL7.x86_64 
cópia de

Limpando pacotes desnecessários

Se mantivermos nossos sistemas atualizados e alterarmos ou estendermos seus papéis, os pacotes "lixo" inevitavelmente aparecerão. No pacote, o lixo significa que não é mais necessário e/ou depreciados pacotes. Para seguir o exemplo acima, não precisamos mais AkreGator, Como movemos o "serviço" do RSS lidando para um concentrador hipotético de RSS central em nosso sistema; portanto, depois de migrar nossos feeds para o local central, desinstalamos o aplicativo local de manuseio de RSS. Isso não removerá todos os pacotes KDE, pois muitos outros pacotes podem depender deles. Mas se não, esses pacotes são lixo e consumirão recursos, incluindo tempos de atualização mais longos, como yum Por padrão, atualizará tudo cegamente, encontra novos pacotes/erratos para.

Gastar recursos na atualização de alguns pacotes desnecessários em um laptop com conexão de banda larga e o SSD pode não parecer um problema, mas imagine um datacenter com centenas ou milhares de computadores, e você obtém a imagem. Geralmente é uma boa ideia manter todos os sistemas simples, e o gerenciamento de recursos é apenas um ponto. Quanto mais complexo um sistema, mais propenso a erros é. Mais componentes significam mais bugs possíveis.

Para obter uma visão geral dos pacotes desnecessários instalados no sistema, podemos usar o YUM e a limpeza de pacotes da mesma maneira que no CentOS, ou outro recurso do yum, AutoMoMove:

yum autoremove


Os pacotes essas ferramentas marcam como desnecessárias não são idênticas.

Ao usar qualquer uma dessas ferramentas, é aconselhável verificar novamente o que yum vai remover e possivelmente testar o que a limpeza resultará em máquinas de teste com conteúdo idêntico de embalagem antes de limpar os sistemas de produção.

Essas ferramentas são de fato inteligentes, mas não com tudo o que está bem informado: por exemplo, não haverá entrada no banco de dados RPM sobre um aplicativo PHP personalizado executando em cima de um servidor da web que chama xícaras Para imprimir pedidos recebidos em uma impressora conectada ao servidor. Isto é, aí pode ser uma entrada se o aplicativo for embalado com as dependências corretas incluídas e instaladas corretamente com RPM ou yum - Mas isso exige esforço, e todos os serviços precisam ser embalados da mesma maneira se você quiser se sentir seguro com limpezas automáticas baseadas em yum.

Resolvendo problemas de dependência

Especialmente em ambientes grandes, pode haver problemas de dependência ao instalar ou atualizar sistemas.

A captura de tela abaixo mostra um problema simples:

Resolvendo dependências com RPM

Na tela do terminal acima, tentamos instalar o nrpe Pacote, o cliente precisava monitorar muitos aspectos do sistema com Nagios. Baixamos o cliente para a distribuição, mas ambos RPM e yum falha com o mesmo erro: o nrpe o pacote exige (depende) do Nagios-Common pacote. Neste exemplo, podemos obter o pacote necessário da mesma fonte e, ao instalar os dois RPM A utilidade vê que a dependência em que falhamos anteriormente será satisfeita até o final da transação e instala os dois pacotes, saindo silenciosamente com o sucesso.

Conclusão

YUM e RPM são ferramentas essenciais ao trabalhar com distribuições usando o RPM Package Manager. Ao conhecer o conjunto de ferramentas, é muito mais fácil e geralmente mais seguro resolver instalar, atualizar e modificar tarefas no ambiente de software de um determinado sistema.

Tutoriais do Linux relacionados:

  • Coisas para instalar no Ubuntu 20.04
  • Coisas para fazer depois de instalar o Ubuntu 20.04 fossa focal linux
  • Arquivos de configuração do Linux: os 30 primeiros mais importantes
  • Download do Linux
  • Uma introdução à automação, ferramentas e técnicas do Linux
  • Linux pode obter vírus? Explorando a vulnerabilidade do Linux…
  • Como instalar Yum no Linux
  • Coisas para fazer depois de instalar o Ubuntu 22.04 Jellyfish…
  • Melhor distro Linux para desenvolvedores
  • Mint 20: Melhor que o Ubuntu e o Microsoft Windows?