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 utilizando o poderoso utilitário de linha de comando rpm. Você ganhará experiência prática com tarefas essenciais, incluindo a consulta de informações detalhadas de 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 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 usando ferramentas como rpm2cpio e cpio.

Este é um Laboratório Guiado, que fornece instruções passo a passo para ajudá-lo a aprender e praticar. Siga as instruções cuidadosamente para concluir cada etapa e ganhar experiência prática. Dados históricos mostram que este é um laboratório de nível iniciante com uma taxa de conclusão de 95%. Ele recebeu uma taxa de avaliação positiva de 98% dos alunos.

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 robusto para gerenciar software em distribuições Linux 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 no seu sistema. O shell bash é um componente central do sistema, sendo um exemplo perfeito. A flag -q significa 'query' (consulta) e a flag i significa 'information' (informação).

Execute o seguinte comando no seu terminal para consultar informações sobre o pacote bash:

rpm -qi bash

Você verá uma saída detalhada listando vários atributos do pacote. A saída será semelhante a esta (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.

Essa saída fornece uma riqueza de informações, incluindo a versão do pacote, um resumo de sua finalidade e uma descrição mais detalhada.

Agora, imagine que você tem um arquivo no seu sistema, como o executável do bash localizado em /usr/bin/bash, e deseja saber qual pacote o instalou. Esta é uma tarefa comum ao auditar um sistema ou resolver 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:

rpm -qf /usr/bin/bash

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 o /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 a listar as dependências de um pacote e seus arquivos de configuração associados. Entender as dependências é crucial porque 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.

Vamos começar descobrindo quais outros pacotes ou recursos 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:

rpm -qR bash

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
glibc
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 requer o pacote glibc (que fornece a biblioteca C libc.so.6), o pacote filesystem e outros componentes de nível de sistema.

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:

rpm -qc bash

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 instrui o rpm a primeiro encontrar o pacote do arquivo (-f /usr/bin/passwd) e depois listar seus arquivos de configuração (-c).

rpm -qcf /usr/bin/passwd

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 compara os arquivos instalados por um pacote com as informações armazenadas no banco de dados RPM, como tamanhos de arquivo, permissões e somas de verificação (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

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 nenhuma saída.

rpm -V lsscsi

Como esperado, o prompt do 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

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

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

Vamos detalhar esta saída:

  • S: O tamanho (Size) do arquivo foi alterado.
  • 5: A soma de verificação MD5 foi alterada.
  • T: O tempo (Time) de modificação foi alterado.
  • c: Isso denota um arquivo de configuração (configuration).
  • /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 a 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

Este comando produzirá a mesma saída, pois primeiro localiza o pacote proprietário de /etc/at.deny (at) e depois 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 comando rpm -q --whatrequires mostra quais outros pacotes precisam dele (suas dependências reversas). É extremamente importante saber disso antes de remover um pacote, pois você pode quebrar outras partes do sistema.

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 instrui o RPM a realizar uma simulação sem excluir nenhum arquivo de fato.

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

rpm -q --whatrequires glibc

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 removeremos de fato, o que quebraria todo o sistema.

sudo rpm -e --test glibc

Como tantos 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

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

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 danificar seu sistema verificando primeiro as dependências reversas.

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.

Primeiro, você precisa de um arquivo .rpm real para inspecionar. Vamos baixar o arquivo do pacote bash para o seu diretório atual (~/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á no seu diretório ~/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 instrui-o a listar a tabela de conteúdo.

rpm2cpio bash-*.rpm | cpio -t

Isso produzirá uma longa lista de todos os arquivos e diretórios contidos no pacote bash. A saída será algo parecido com 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
...

Essa técnica oferece uma visão completa da carga útil de um pacote, permitindo que você veja exatamente o que será colocado no seu sistema se você decidir instalá-lo.

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, proporcionando 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 checar modificações. Você também explorou como verificar com segurança as dependências reversas e simular a remoção de um pacote com rpm -e --test para entender o impacto potencial sem realizar alterações reais. Por fim, 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.