Gerenciamento de Pacotes com RPM no Linux

Red Hat Enterprise LinuxBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá os fundamentos do gerenciamento de pacotes de software em distribuições Linux baseadas em RPM usando o poderoso utilitário de linha de comando rpm. Você ganhará experiência prática com tarefas essenciais de gerenciamento de pacotes, incluindo a consulta de informações detalhadas sobre pacotes, a verificação da integridade de pacotes instalados e a inspeção do conteúdo de arquivos RPM.

Ao longo das etapas, você usará comandos rpm específicos para descobrir a qual pacote um arquivo pertence, listar dependências de pacotes e arquivos de configuração, e verificar dependências reversas. Você também aprenderá como simular com segurança a remoção de um pacote para entender seu impacto e como examinar o conteúdo de um arquivo de pacote RPM antes da instalação, utilizando ferramentas como rpm2cpio e cpio.

Consultar informações básicas de pacotes com rpm -qi e rpm -qf

Nesta etapa, você aprenderá como consultar informações sobre pacotes instalados usando o Red Hat Package Manager (rpm). O rpm é um utilitário de linha de comando poderoso para gerenciar softwares em distribuições Linux baseadas em RPM, como CentOS, Fedora e RHEL. Focaremos em duas opções fundamentais de consulta: -qi para obter informações detalhadas do pacote e -qf para descobrir a qual pacote um arquivo específico pertence.

Primeiro, vamos inspecionar os detalhes de um pacote que já está instalado em seu sistema. O shell bash é um componente central do sistema, tornando-o um exemplo perfeito. A flag -q significa 'query' (consulta) e a flag i significa 'information' (informação).

Comece acessando o diretório de trabalho do laboratório para que os arquivos de saída dos comandos que você criar fiquem organizados em um só lugar:

cd /home/labex/project

Execute o seguinte comando em seu terminal para consultar informações sobre o pacote bash e salvar a saída em bash-package-info.txt:

rpm -qi bash | tee bash-package-info.txt

Você verá uma saída detalhada listando vários atributos do pacote. A saída será semelhante a esta (os números de versão e datas podem variar):

Name        : bash
Version     : 4.4.20
Release     : 5.el8
Architecture: x86_64
Install Date: <some_date>
Group       : System Environment/Shells
Size        : 4989189
License     : GPLv3+
Signature   : RSA/SHA256, <some_date_and_time>, Key ID <some_key_id>
Source RPM  : bash-4.4.20-5.el8.src.rpm
Build Date  : <some_date>
Build Host  : <some_build_host>
Relocations : (not relocatable)
Vendor      : CentOS
URL         : http://www.gnu.org/software/bash
Summary     : The GNU Bourne-Again Shell
Description :
The GNU Bourne-Again Shell (Bash) is a shell or command language
interpreter that is compatible with the Bourne shell (sh). Bash
incorporates useful features from the Korn shell (ksh) and the C
shell (csh).  Most sh scripts can be run by bash without
modification.

Esta saída fornece uma riqueza de informações, incluindo a versão do pacote, um resumo de seu propósito e uma descrição mais detalhada.

Agora, imagine que você tenha um arquivo em seu sistema, como o executável do bash localizado em /usr/bin/bash, e queira saber qual pacote o instalou. Esta é uma tarefa comum ao auditar um sistema ou solucionar problemas. Para isso, você pode usar as flags -qf, onde f significa 'file' (arquivo).

Execute o seguinte comando para descobrir qual pacote é o proprietário do arquivo /usr/bin/bash e salvar o resultado em bash-owner.txt:

rpm -qf /usr/bin/bash | tee bash-owner.txt

O comando retornará o nome completo do pacote que fornece este arquivo:

bash-5.1.8-9.el9.x86_64

Como você pode ver, o sistema identifica corretamente que /usr/bin/bash vem do pacote bash, correspondendo às informações que encontramos anteriormente. Você pode até combinar essas flags para obter diretamente informações sobre o pacote que possui um arquivo executando rpm -qif /usr/bin/bash.

Listar dependências de pacotes e arquivos de configuração com rpm -qR e rpm -qc

Nesta etapa, você continuará explorando o rpm aprendendo como listar as dependências de um pacote e seus arquivos de configuração associados. Entender as dependências é crucial, pois a maioria dos softwares depende de outros pacotes para funcionar corretamente. Saber onde os arquivos de configuração estão localizados é essencial para a administração e personalização do sistema.

Continue trabalhando em /home/labex/project. Vamos começar descobrindo quais outros pacotes ou capacidades o pacote bash requer. Usamos a flag -qR (ou --requires) para isso. O R significa 'requires' (requer).

Execute o seguinte comando para ver as dependências do bash e salvar a saída em bash-requires.txt:

rpm -qR bash | tee bash-requires.txt

A saída será uma lista de pacotes e capacidades do sistema das quais o bash depende. Esta lista pode ser bastante longa.

/bin/sh
config(bash) = 4.4.20-5.el8
filesystem >= 3
libc.so.6()(64bit)
info
libc.so.6(GLIBC_2.17)(64bit)
libc.so.6(GLIBC_2.2.5)(64bit)
libc.so.6(GLIBC_2.28)(64bit)
libc.so.6(GLIBC_2.3)(64bit)
...
rtld(GNU_HASH)

Esta saída mostra que o bash depende de capacidades centrais do sistema, como libc.so.6, o pacote filesystem e outros componentes de tempo de execução.

Em seguida, vamos encontrar os arquivos de configuração que foram instalados como parte do pacote bash. Isso é útil quando você precisa modificar o comportamento padrão do shell para novos usuários. A flag -qc é usada para isso, onde c significa 'configfiles' (arquivos de configuração).

Execute este comando para listar os arquivos de configuração do bash e salvar a saída em bash-config-files.txt:

rpm -qc bash | tee bash-config-files.txt

A saída mostrará os caminhos completos para os arquivos de configuração:

/etc/skel/.bash_logout
/etc/skel/.bash_profile
/etc/skel/.bashrc

Esses arquivos em /etc/skel são arquivos de modelo que são copiados para o diretório home de um novo usuário quando a conta de usuário é criada.

Você também pode combinar flags para encontrar os arquivos de configuração relacionados a um comando específico. Por exemplo, para ver os arquivos de configuração usados pelo comando passwd, você pode usar -qcf. Isso diz ao rpm para primeiro encontrar o pacote do arquivo (-f /usr/bin/passwd) e depois listar seus arquivos de configuração (-c).

rpm -qcf /usr/bin/passwd | tee passwd-config-files.txt

Este comando revela os arquivos de configuração associados ao utilitário passwd:

/etc/pam.d/passwd

Esta é uma maneira poderosa de identificar rapidamente quais arquivos você pode precisar editar para alterar o comportamento de um comando.

Verificar a integridade do pacote e alterações de arquivos com rpm -V

Nesta etapa, você aprenderá como verificar a integridade de um pacote instalado usando rpm -V (ou rpm --verify). Este comando é uma ferramenta crucial de segurança e solução de problemas. Ele verifica os arquivos instalados por um pacote em relação às informações armazenadas no banco de dados RPM, como tamanhos de arquivo, permissões e checksums. Isso permite detectar quaisquer alterações não autorizadas ou acidentais nos arquivos do sistema.

Primeiro, vamos garantir que alguns pacotes utilitários, lsscsi e at, estejam instalados no sistema. Nós os usaremos para nossos testes de verificação.

sudo dnf install -y lsscsi at

Continue trabalhando em /home/labex/project. Agora, vamos verificar o pacote lsscsi. Como acabamos de instalá-lo e não fizemos nenhuma alteração, ele deve passar no teste de verificação. Uma verificação bem-sucedida não produz saída.

rpm -V lsscsi | tee lsscsi-verify.txt

Como esperado, o prompt de comando retorna sem nenhuma mensagem, indicando que todos os arquivos no pacote lsscsi estão em seu estado original.

Em seguida, vamos modificar intencionalmente um arquivo de configuração e ver como o rpm -V relata a alteração. Adicionaremos uma linha ao arquivo /etc/at.deny, que pertence ao pacote at. Este arquivo controla quais usuários não têm permissão para usar o comando at.

echo "labex" | sudo tee -a /etc/at.deny

Agora que modificamos um arquivo, vamos verificar o pacote at novamente.

sudo rpm -V at | tee at-verify.txt

Desta vez, o comando produz uma saída, indicando que uma alteração foi detectada:

S.5....T.  c /etc/at.deny

Vamos analisar esta saída:

  • S: O Size (tamanho) do arquivo mudou.
  • 5: O checksum MD5 mudou.
  • T: O Time (tempo) de modificação mudou.
  • c: Isso denota um arquivo de configuração.
  • /etc/at.deny: O caminho para o arquivo modificado.

Cada posição de caractere na string de 8 caracteres S.5....T. representa um teste diferente. Um . significa que o teste passou. Esta saída mostra claramente que o arquivo de configuração /etc/at.deny foi alterado desde sua instalação.

Você também pode verificar o pacote que possui um arquivo específico diretamente usando as flags -qVf.

sudo rpm -qVf /etc/at.deny | tee at-file-verify.txt

Este comando produzirá a mesma saída, pois ele primeiro encontra o pacote que possui /etc/at.deny (at) e, em seguida, o verifica.

Verificar dependências reversas e simular a remoção de pacotes com rpm -e --test

Nesta etapa, você aprenderá como verificar dependências reversas e simular com segurança a remoção de um pacote. Enquanto o comando rpm -qR mostra o que um pacote precisa (suas dependências), o rpm -q --whatrequires mostra quais outros pacotes precisam dele (suas dependências reversas). Isso é extremamente importante saber antes de remover um pacote, pois você pode quebrar outras partes do sistema.

Continue trabalhando em /home/labex/project. Para verificar com segurança as consequências da remoção de um pacote, você pode usar o comando rpm -e --test. A flag -e significa 'erase' (apagar) e a flag --test diz ao RPM para realizar uma simulação sem realmente excluir nenhum arquivo.

Vamos começar examinando um pacote central do sistema do qual muitos outros pacotes dependem. O pacote glibc fornece a GNU C Library, que é fundamental para quase todos os programas em um sistema Linux. Vamos verificar quais pacotes requerem o glibc.

rpm -q --whatrequires glibc | tee glibc-whatrequires.txt

A saída mostrará vários pacotes que dependem do glibc:

glibc-common-2.34-168.el9_6.19.x86_64
glibc-langpack-en-2.34-168.el9_6.19.x86_64
libstdc++-11.5.0-5.el9_5.x86_64
glibc-headers-2.34-168.el9_6.19.x86_64
pam-1.5.1-23.el9.x86_64
glibc-devel-2.34-168.el9_6.19.x86_64
nscd-2.34-168.el9_6.19.x86_64

Como você pode ver, muitos pacotes críticos do sistema dependem do glibc. Agora vamos ver o que acontece quando tentamos remover o glibc. Usaremos a flag --test para garantir que não o removamos de fato, o que quebraria todo o sistema.

sudo rpm -e --test glibc 2>&1 | tee glibc-remove-test.txt

Como muitos pacotes precisam do glibc, o RPM relatará erros de dependência e impedirá a remoção. A saída mostrará uma longa lista de dependências falhas:

error: Failed dependencies:
 glibc = 2.34-168.el9_6.19 is needed by (installed) glibc-common-2.34-168.el9_6.19.x86_64
 glibc = 2.34-168.el9_6.19 is needed by (installed) glibc-langpack-en-2.34-168.el9_6.19.x86_64
 glibc >= 2.34 is needed by (installed) libstdc++-11.5.0-5.el9_5.x86_64
 ... (additional dependency errors)

Agora vamos olhar para um pacote com menos dependências. O pacote lsscsi que instalamos anteriormente é um pacote utilitário com menos dependências reversas. Vamos verificar o que o requer:

rpm -q --whatrequires lsscsi | tee lsscsi-whatrequires.txt

Você deve ver uma saída indicando que nenhum pacote requer o lsscsi:

no package requires lsscsi

Como nenhum pacote depende do lsscsi, podemos simular sua remoção com segurança:

sudo rpm -e --test lsscsi 2>&1 | tee lsscsi-remove-test.txt

Este comando deve ser concluído sem erros, indicando que a remoção do lsscsi não quebraria nenhum outro pacote no sistema.

Isso demonstra como você pode prever o impacto da remoção de um pacote e evitar quebrar seu sistema verificando as dependências reversas primeiro.

Inspecionar o conteúdo de pacotes RPM com rpm2cpio e cpio

Nesta etapa, você aprenderá uma técnica poderosa para inspecionar o conteúdo de um arquivo de pacote RPM sem instalá-lo. Isso é útil para verificar os arquivos que um pacote contém antes da instalação ou para extrair um único arquivo de um pacote para restaurar um arquivo corrompido ou excluído. Este processo envolve dois comandos: rpm2cpio, que converte um arquivo RPM em um arquivo cpio, e cpio, que pode então listar ou extrair arquivos desse arquivo.

Continue trabalhando em /home/labex/project. Primeiro, você precisa de um arquivo .rpm real para inspecionar. Vamos baixar o arquivo do pacote bash para o seu diretório atual (/home/labex/project) usando o gerenciador de pacotes dnf. O subcomando download busca o arquivo do pacote sem instalá-lo.

sudo dnf download bash

Você verá uma saída indicando que o arquivo foi baixado com sucesso. O nome do arquivo incluirá a versão e a arquitetura.

Last metadata expiration check: ...
bash-<version>.<arch>.rpm

Agora, use o comando ls para confirmar que o arquivo .rpm está em seu diretório /home/labex/project:

ls bash-*.rpm

Com o arquivo RPM pronto, você pode usar os comandos rpm2cpio e cpio juntos para listar seu conteúdo. O comando rpm2cpio lê o arquivo RPM e envia um arquivo cpio para a saída padrão. Em seguida, canalizamos (|) essa saída para o comando cpio, que lê o arquivo de sua entrada padrão. A flag -t para o cpio diz a ele para listar a tabela de conteúdo.

rpm2cpio bash-*.rpm | cpio -t | tee bash-rpm-contents.txt

Isso produzirá uma longa lista de todos os arquivos e diretórios contidos no pacote bash. A saída será algo como isto:

.
./etc
./etc/skel
./etc/skel/.bash_logout
./etc/skel/.bash_profile
./etc/skel/.bashrc
./usr
./usr/bin
./usr/bin/bash
./usr/bin/sh
./usr/share
./usr/share/doc
...

Esta técnica oferece uma visão completa da carga útil de um pacote, permitindo que você veja exatamente o que será colocado em seu sistema se você o instalasse.

Resumo

Neste laboratório, você aprendeu como gerenciar e consultar pacotes de software usando o utilitário RPM em um ambiente Linux. Você começou recuperando informações detalhadas sobre pacotes instalados com rpm -qi e identificando a qual pacote um arquivo específico pertence usando rpm -qf. Você também praticou a listagem das dependências de um pacote com rpm -qR e a localização de seus arquivos de configuração com rpm -qc, obtendo uma visão abrangente de como um pacote se integra ao sistema.

Com base nessas habilidades de consulta, você aprendeu a verificar a integridade dos arquivos de um pacote instalado usando rpm -V para verificar modificações. Você também explorou como verificar com segurança dependências reversas e simular a remoção de um pacote com rpm -e --test para entender o impacto potencial sem fazer alterações. Finalmente, você adquiriu a capacidade de inspecionar o conteúdo de um arquivo de pacote RPM antes da instalação, usando rpm2cpio e cpio para extrair e listar seu conteúdo.