RPM — o gerenciador de pacotes

O RPM (gerenciador de pacotes RPM) é usado para gerenciar pacotes de software. Seus principais comandos são rpm e rpmbuild. O banco de dados RPM avançado pode ser consultado pelos usuários, administradores de sistema e construtores de pacotes para obtenção de informações detalhadas sobre o software instalado.

Basicamente, o rpm possui cinco modos: instalação, desinstalação (ou atualização) de pacotes de software, reconstrução do banco de dados RPM, consulta de bancos RPM ou arquivos RPM individuais, verificação de integridade dos pacotes e assinatura de pacotes. O rpmbuild pode ser usado para construir pacotes instaláveis de fontes originais.

Os arquivos RPM instaláveis são compactados em um formato binário especial. Esses são arquivos de programa para instalação e determinadas metainformações usadas durante a instalação pelo comando rpm para configurar o pacote de softwares. Também são armazenados no banco de dados RPM com o objetivo de documentação. Os arquivos RPM normalmente têm a extensão .rpm.

[Tip]pacotes de desenvolvimento de software

Para vários pacotes, os componentes necessários para o desenvolvimento de software (bibliotecas, cabeçalhos, arquivos de inclusão etc.) foram colocados em pacotes separados. Esses pacotes de desenvolvimento só são necessários quando você deseja compilar software por conta própria (por exemplo, os pacotes do GNOME mais recentes). Eles podem ser identificados pela extensão de nome -devel, como os pacotes alsa-devel, gimp-devel e kdelibs3-devel.

Verificando a autenticidade do pacote

Os pacotes RPM possuem uma assinatura GnuPG. O comando rpm --checksig pacote-1.2.3.rpm pode ser usado para verificar a assinatura de um pacote RPM e determinar se ele provém do SUSE ou de outro recurso confiável. Isso é especialmente recomendado para pacotes de atualização da Internet.

Gerenciando pacotes: instalar, atualizar e desinstalar

Normalmente, a instalação de um arquivo RPM é bem simples: rpm -i pacote.rpm. Com esse comando, o pacote será instalado, mas somente se as dependências forem atendidas e não houver conflitos com outros pacotes. Com uma mensagem de erro, o rpm solicita os pacotes que devem ser instalados para atender a requisitos de dependência. Em segundo plano, o banco de dados RPM garante que não haja conflitos, pois um arquivo específico pode pertencer a apenas um pacote. Ao escolher opções diferentes, você pode forçar o rpm a ignorar esses padrões, mas isso é somente para especialistas. Caso contrário, você se arrisca a comprometer a integridade do sistema e, possivelmente, ameaça a capacidade de atualização do sistema.

As opções -U ou --upgrade e -F ou --freshen podem ser usadas para atualizar um pacote (por exemplo, rpm -F pacote.rpm). Esse comando remove os arquivos da versão antiga e instala os novos arquivos imediatamente. A diferença entre as duas versões é que o -U instala pacotes que não existiam no sistema anteriormente, mas -F atualiza somente pacotes previamente instalados. Durante a atualização, o rpm atualiza arquivos de configuração cuidadosamente com a seguinte estratégia:

  • Se um arquivo de configuração não tiver sido modificado pelo administrador de sistema, o rpm instalará a nova versão do arquivo apropriado. O administrador de sistema não precisa adotar nenhuma ação.

  • Se um arquivo de configuração tiver sido mudado pelo administrador do sistema antes da atualização, o rpm gravará o arquivo mudado com a extensão .rpmorig ou .rpmsave (arquivo de backup) e instalará a versão do novo pacote (mas somente se o arquivo instalado originalmente e a versão mais nova forem diferentes). Nesse caso, compare o arquivo de backup (.rpmorig ou .rpmsave) com o arquivo recém-instalado e faça novamente as modificações no novo arquivo. Depois, verifique se apagou todos os arquivos .rpmorig e .rpmsave para evitar problemas em atualizações futuras.

  • Arquivos.rpmnew são exibidos se o arquivo de configuração já existir e se o rótulo noreplace tiver sido especificado no arquivo .spec.

Após uma atualização, os arquivos .rpmsave e .rpmnew devem ser removidos depois de comparados, para que não impeçam atualizações futuras. A extensão .rpmorig será atribuída se o arquivo não tiver sido previamente reconhecido pelo banco de dados RPM.

Caso contrário, o .rpmsave será usado. Em outras palavras, o .rpmorig resulta da atualização de um formato estranho ao RPM. O .rpmsave resulta da atualização de um RPM mais antigo para um RPM mais novo. O .rpmnew não revela se o administrador do sistema fez mudanças no arquivo de configuração. Uma lista destes arquivos está disponível em /var/adm/rpmconfigcheck. Alguns arquivos de configuração (como /etc/httpd/httpd.conf) não são sobregravados para permitir operação continuada.

O switch -Unão é somente um equivalente para a desinstalação com a opção -e e a instalação com a opção -i. Use -U sempre que possível.

Para remover um pacote, digite rpm -e pacote. O rpm, que só apaga o pacote quando não há dependências não resolvidas. É teoricamente impossível apagar Tcl/Tk, por exemplo, enquanto outro aplicativo exigir sua existência. Mesmo nesse caso, o RPM pede ajuda do banco de dados. Se, por qualquer motivo, a exclusão for impossível (mesmo que não exista nenhuma dependência adicional), talvez seja útil reconstruir o banco de dados RPM usando a opção --rebuilddb.

RPM e patches

Para garantir a segurança operacional de um sistema, pacotes de atualização devem ser instalados no sistema periodicamente. Anteriormente, um erro em um pacote só poderia ser eliminado com a substituição de todo o pacote. Pacotes grandes com bugs em pequenos arquivos podem resultar facilmente nesse cenário. Porém, o RPM do SUSE oferece um recurso que permite a instalação de patches em pacotes.

Como exemplo, as considerações mais importantes são demonstradas com pine:

O RPM com patch é adequado para meu sistema?

Para verificar isso, consulte primeiro a versão instalada do pacote. No caso do pine, isso pode ser feito com

rpm -q pine
pine-4.44-188

Em seguida, verifique se o RPM com patch é adequado para essa versão do pine:

rpm -qp --basedon pine-4.44-224.i586.patch.rpm 
pine = 4.44-188
pine = 4.44-195
pine = 4.44-207

Esse patch é adequado para três versões diferentes do pine. A versão instalada no exemplo também está listada para que o patch possa ser instalado.

Quais arquivos serão substituídos pelo patch?

Os arquivos afetados por um patch podem ser facilmente vistos no RPM com patch. O parâmetro rpm-P permite a seleção de recursos de patch especiais. Exiba a lista de arquivos com o seguinte comando:

rpm -qpPl pine-4.44-224.i586.patch.rpm
/etc/pine.conf
/etc/pine.conf.fixed
/usr/bin/pine

ou, se o patch já estiver instalado, com o seguinte comando:

rpm -qPl pine
/etc/pine.conf
/etc/pine.conf.fixed
/usr/bin/pine
Como instalar um RPM com patch no sistema?

RPMs com patch são usados como RPMs comuns. A única diferença é que um RPM adequado já deve estar instalado.

Quais patches já estão instalados no sistema e para quais versões do pacote?

É possível exibir uma lista de todos os patches instalados no sistema com o comando rpm -qPa. Se somente um patch for instalado em um novo sistema (como no exemplo), a lista será exibida como a seguir:

rpm -qPa
pine-4.44-224

Se posteriormente você desejar saber qual versão de pacote foi originalmente instalada, essas informações também estarão disponíveis no banco de dados RPM. No caso do pine, é possível exibir essas informações com o seguinte comando:

rpm -q --basedon pine
pine = 4.44-188

Mais informações, incluindo informações sobre o recurso de patch do RPM, estão disponíveis nas páginas de manual de rpm e rpmbuild.

[Note]atualizações oficiais do SUSE Linux Enterprise Desktop

Para que o tamanho de download das atualizações seja o menor possível, as atualizações oficiais do SUSE Linux Enterprise Desktop não são fornecidas como RPMs de patch, mas como pacotes Delta RPM (consulte a Seção 5.2.4, “Pacotes RPM Delta” para obter detalhes).

Pacotes RPM Delta

Os pacotes RPM Delta possuem uma diferença entre uma versão nova e antiga de um pacote RPM. Aplicar um RPM delta a um RPM antigo resulta em um RPM completamente novo. Não é necessário ter uma cópia do RPM antigo, pois um RPM delta também pode funcionar com um RPM instalado. Os pacotes RPM delta têm tamanho ainda menor que os RPMs com patch, o que é uma vantagem durante a transferência de pacotes de atualização na Internet. A desvantagem é que operações de atualização que envolvem RPMs delta consomem consideravelmente mais ciclos de CPU do que as operações com RPMs com patch ou simples.

Os binários prepdeltarpm, writedeltarpm e applydeltarpm integram a suíte de RPM delta (pacote deltarpm) e ajudam na criação e aplicação de pacotes RPM delta. Com os seguintes comandos, crie um RPM delta chamado new.delta.rpm. O comando a seguir pressupõe que old.rpm e new.rpm estejam presentes:

prepdeltarpm -s seq -i info old.rpm > old.cpio
prepdeltarpm -f new.rpm > new.cpio
xdelta delta -0 old.cpio new.cpio delta
writedeltarpm new.rpm delta info new.delta.rpm

Por fim, remova os arquivos de trabalho temporários old.cpio, new.cpio e delta.

Usando applydeltarpm, você poderá reconstruir o novo RPM do arquivo de sistema, se o pacote antigo já estiver instalado:

applydeltarpm new.delta.rpm new.rpm

Para derivá-lo do RPM antigo sem acessar o sistema de arquivos, use a opção -r:

applydeltarpm -r old.rpm new.delta.rpm new.rpm

Consulte /usr/share/doc/packages/deltarpm/README" para obter detalhes técnicos.

Consultas de RPM

Com a opção -q, o rpm inicia consultas, permitindo a inspeção de um arquivo RPM (adicionando-se a opção -p) e também a consulta ao banco de dados RPM de pacotes instalados. Vários switches estão disponíveis para especificar o tipo de informação necessária. Consulte a Tabela 5.1, “Opções mais importantes de consulta de RPM”.

Tabela 5.1. Opções mais importantes de consulta de RPM

-i

Informações de pacote

-l

Lista de arquivos

-f ARQUIVO

Consulte o pacote que contém o arquivo ARQUIVO (o caminho completo deve ser especificado com ARQUIVO)

-s

Lista de arquivos com informações de status (requer -l)

-d

Lista somente arquivos de documentação (requer -l)

-c

Lista somente arquivos de configuração (requer -l)

--dump

Lista de arquivos com detalhes completos (a ser usada com -l, -c ou -d)

--provides

Lista recursos do pacote que outro pacote pode solicitar com --requires

--requires, -R

Recursos exigidos pelo pacote

--scripts

Scripts de instalação (pré-instalação, pós-instalação, desinstalação)


Por exemplo, o comando rpm -q -i wget exibe as informações mostradas no Exemplo 5.1, “rpm -q -i wget”.

Exemplo 5.1. rpm -q -i wget

Name        : wget                         Relocations: (not relocatable)
Version     : 1.11.4                            Vendor: openSUSE
Release     : 1.70                          Build Date: Sat 01 Aug 2009 09:49:48 CEST
Install Date: Thu 06 Aug 2009 14:53:24 CEST      Build Host: build18
Group       : Productivity/Networking/Web/Utilities   Source RPM: wget-1.11.4-1.70.src.rpm
Size        : 1525431                          License: GPL v3 or later
Signature   : RSA/8, Sat 01 Aug 2009 09:50:04 CEST, Key ID b88b2fd43dbdc284
Packager    : http://bugs.opensuse.org
URL         : http://www.gnu.org/software/wget/
Summary     : A Tool for Mirroring FTP and HTTP Servers
Description :
Wget enables you to retrieve WWW documents or FTP files from a server.
This can be done in script files or via the command line.
[...]

A opção -f funciona somente se você especificar o nome e o caminho completos do arquivo. Forneça quantos nomes de arquivo desejar. Por exemplo, o seguinte comando

rpm -q -f /bin/rpm /usr/bin/wget

resulta em:

rpm-4.4.2.3-45.5
wget-1.11.4-1.70

Se somente parte do nome de arquivo for conhecida, use um script de shell conforme mostrado no Exemplo 5.2, “Script para pesquisar pacotes”. Passe o nome de arquivo parcial para o script mostrado como um parâmetro ao executá-lo.

Exemplo 5.2. Script para pesquisar pacotes

#! /bin/sh
for i in $(rpm -q -a -l | grep  $1); do
    echo "\"$i\" is in package:"
    rpm -q -f $i
    echo ""
done

O comando rpm -q --changelog rpm exibe uma lista detalhada de informações de mudança sobre um pacote específico, classificadas por data.

Com a ajuda do banco de dados RPM instalado, é possível realizar verificações. Inicie as verificações com -V, -y ou --verify. Com essa opção, o rpm mostra todos os arquivos em um pacote que foram modificados desde a instalação. O rpm usa oito símbolos de caracteres para fornecer algumas dicas sobre as seguintes mudanças:

Tabela 5.2. Opções de verificação do RPM

5

Resumo de verificação MD5

S

Tamanho do arquivo

L

Link simbólico

T

Tempo de modificação

D

Números de dispositivo principais e auxiliares

U

Proprietário

C

Grupo

M

Modo (tipo de arquivo e permissões)


No caso de arquivos de configuração, a letra c é impressa. Por exemplo, para mudanças para /etc/wgetrc (wget):

rpm -V wget
S.5....T c /etc/wgetrc

Os arquivos do banco de dados RPM são colocados em /var/lib/rpm. Se a partição /usr tiver o tamanho de 1 GB, esse banco de dados poderá ocupar praticamente 30 MB, especialmente após uma atualização completa. Se o banco de dados for maior do que o esperado, será útil reconstruir o banco de dados com a opção --rebuilddb. Antes disso, faça um backup do banco de dados antigo. O script cron cron.daily faz cópias diárias do banco de dados (compactado com gzip) e as armazena em /var/adm/backup/rpmdb. O número de cópias é controlado pela variável MAX_RPMDB_BACKUPS (padrão: 5) em /etc/sysconfig/backup. O tamanho de um único backup é de aproximadamente 1 MB para 1 GB em /usr.

Instalando e compilando pacotes de fonte

Todos os pacotes de fonte têm a extensão .src.rpm (RPM de fonte).

[Tip]

Pacotes de fonte podem ser copiados da mídia de instalação para o disco rígido e descompactados com o YaST. Porém, eles não são marcados como instalados ([i]) no gerenciador de pacotes. Isso ocorre porque os pacotes de fontes não são inseridos no banco de dados RPM. Somente o software do sistema operacional instalado está listado no banco de dados RPM. Quando você instalar um pacote de fontes, somente o código-fonte será adicionado ao sistema.

Os diretórios a seguir devem estar disponíveis para rpm e rpmbuild em /usr/src/packages (a menos que você tenha especificado configurações personalizadas em um arquivo como /etc/rpmrc):

SOURCES

para as fontes originais (arquivos .tar.bz2 ou .tar.gz etc.) e para ajustes específicos de distribuição (geralmente arquivos .diff ou .patch)

SPECS

para os arquivos .spec, similares a um metaMakefile, que controla o processo de construção

BUILD

diretório em que todas as fontes são descompactadas, corrigidas e compiladas

RPMS

local em que os pacotes binários concluídos são armazenados

SRPMS

local em que estão os RPMs de fonte

Quando você instala um pacote de fonte com o YaST, todos os componentes necessários são instalados em /usr/src/packages: as fontes e os ajustes em SOURCES e o arquivo .spec relevante em SPECS.

[Warning]

Não faça experiências com os componentes do sistema (glibc, rpm, sysvinit etc.), pois isso arrisca a estabilidade do sistema.

O exemplo a seguir usa o pacote wget.src.rpm. Após instalar o pacote de origem, você deverá ter arquivos semelhantes aos da seguinte lista:

/usr/src/packages/SOURCES/wget-1.11.4.tar.bz2
/usr/src/packages/SOURCES/wgetrc.patch
/usr/src/packages/SPECS/wget.spec

rpmbuild -b X /usr/src/packages/SPECS/wget.spec inicia a compilação. X é um curinga para vários estágios do processo de construção (consulte a saída de --help ou a documentação do RPM para obter detalhes). Veja a seguir uma breve explicação:

-bp

Preparar as fontes em /usr/src/packages/BUILD: descompactar e corrigir.

-bc

Faz o mesmo que -bp, mas com compilação adicional.

-bi

Faz o mesmo que -bp, mas com a instalação adicional do software criado. Cuidado: se o pacote não aceitar o recurso BuildRoot, talvez você sobregrave os arquivos de configuração.

-bb

Faz o mesmo que -bi, mas com a criação adicional do pacote binário. Se a compilação tiver sido bem-sucedida, o binário deverá estar em /usr/src/packages/RPMS.

-ba

Faz o mesmo que -bb, mas com a criação adicional do RPM de fonte. Se a compilação tiver sido bem-sucedida, o binário deverá estar em /usr/src/packages/SRPMS.

--short-circuit

Ignora algumas etapas.

O RPM binário criado agora pode ser instalado com rpm -i ou, de preferência, com rpm -U. A instalação com rpm faz com que ele apareça no banco de dados RPM.

Compilando pacotes RPM com build

O perigo de vários pacotes é que arquivos indesejados são adicionados ao sistema em execução durante o processo de construção. Para evitar isso, use build, que cria um ambiente definido para construção do pacote. Para estabelecer esse ambiente chroot, o script build deve ser fornecido com uma árvore de pacote completa. Essa árvore pode ser disponibilizada no disco rígido, por meio do NFS ou DVD. Defina a posição com build --rpms diretório. Ao contrário do comando rpm, o comando build procura o arquivo SPEC no diretório de origem. Para construir wget (como no exemplo acima) com o DVD montado no sistema em /media/dvd, use os comandos seguintes como root:

cd /usr/src/packages/SOURCES/
mv ../SPECS/wget.spec .
build --rpms /media/dvd/suse/ wget.spec

Depois disso, um ambiente mínimo é estabelecido em /var/tmp/build-root. O pacote é criado nesse ambiente. Após a conclusão, os pacotes resultantes estarão localizados em /var/tmp/build-root/usr/src/packages/RPMS.

O script build oferece várias opções adicionais. Por exemplo, fazer com que o script prefira seus próprios RPMs, omitir a inicialização do ambiente de construção ou limitar o comando rpm a um dos estágios mencionados acima. Acesse informações adicionais com build --help e a leitura da página de manual build.

Ferramentas para arquivos RPM e banco de dados RPM

O Midnight Commander (mc) pode exibir o conteúdo de arquivos RPM e copiar partes deles. Ele representa arquivos como sistemas de arquivos virtuais, oferecendo todas as opções de menu usuais do Midnight Commander. Exiba o HEADER com F3. Exiba a estrutura de arquivos com as teclas de cursor e Enter. Copie componentes de arquivos com F5.

O KDE oferece a ferramenta kpackage como front end para rpm. Um gerenciador de pacotes completo está disponível como um módulo do YaST (consulte o Capítulo Installing or Removing Software (↑Guia de Implantação)).