3.3. RPM— o Gerenciador de pacotes

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

Essencialmente, o rpm tem cinco modos: instalação, desinstalação ou atualização de pacotes de software; reconstrução do banco de dados RPM; consulta de bases RPM ou arquivos RPM individuais; verificação de integridade de pacotes; e assinatura de pacotes. O rpmbuild pode ser usado para construir pacotes instaláveis de fontes antigas.

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. Os pacotes de desenvolvimento são necessários somente se você desejar compilar seu próprio software, por exemplo, os pacotes GNOME mais recentes. Eles podem ser identificados pela extensão de nome -devel, como os pacotes alsa-devel, gimp-devel e kdelibs3-devel.

3.3.1. Verificando a autenticidade do pacote

Os pacotes RPM do SUSE Linux têm a assinatura GnuPG. A chave que inclui a impressão digital é:


Chave de assinatura de pacote do SUSE: 1024D/9C800ACA 2000-10-19 <build@suse.de> Impressão digital da chave = 79C1 79B2 E1C8 20C1 890F  9994 A84E DAE8 9C80 0ACA 

O comando rpm --checksig pacote-1.2.3.rpm pode ser usado para verificar a assinatura de um pacote RPM e determinar se ele realmente se origina do SUSE Linux ou de outra instalação confiável. Isso é especialmente recomendado para pacotes de atualização da Internet. A chave pública de assinatura de pacote do SUSE Linux normalmente se localiza em /root/.gnupg/. A chave também está localizada no diretório /usr/lib/rpm/gnupg/ para permitir que usuários comuns verifiquem a assinatura de pacotes RPM.

3.3.2. Gerenciando pacotes: instalação, atualização e desinstalação

Normalmente, a instalação do arquivo RPM é bastante simples: rpm -i pacote.rpm. Com esse comando, o pacote será instalado, mas somente se as dependências forem preenchidas 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. No segundo plano, o banco de dados RPM garante que não surjam conflitos: um arquivo específico só pode pertencer a 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, há o risco de comprometer a integridade do sistema e possivelmente colocar em risco 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 modificado pelo administrador de sistema antes da atualização, o rpm salvará o arquivo modificado 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 nenhuma informação sobre se o administrador de sistema fez modificações 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 -U nã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 package. O rpm apaga o pacote somente se todas as dependências tiverem sido 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 tal exclusão for, por qualquer motivo e sob circunstâncias não comuns, impossível, mesmo se não houver dependências adicionais, talvez seja útil reconstruir o banco de dados RPM com a opção --rebuilddb.

3.3.3. 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 erros em arquivos pequenos podiam facilmente resultar em grande quantidade de dados. 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 o 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.

3.3.4. 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 em 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. Para que o YaST use pacotes RPM delta durante sessões do YOU, defina YOU_USE_DELTAS como yes em /etc/sysconfig/onlineupdate. Neste caso, esteja preparado para ter a mídia de instalação disponível. Se YOU_USE_DELTAS estiver vazio ou definido para filesystem, o YOU tentará fazer o download de pacotes delta que se apliquem a arquivos instalados. Você não precisa da mídia de instalação nesse caso, mas o tempo de download poderia ser maior. Se estiver definido para no, o YOU usará somente RPMs com patch e RPMs comuns.

Os binários prepdeltarpm, writedeltarpm e applydeltarpm são parte de uma 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 estão 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
rm old.cpio new.cpio delta

Usando applydeltarpm, você pode 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.

3.3.5. Consultas de RPM

Com a opção -q, o rpm inicia consultas, o que permite inspecionar um arquivo RPM (adicionando-se a opção -p) e também consultar o 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 3.6, “Opções mais importantes de consulta de RPM”.

Tabela 3.6. 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 exibidas no Exemplo 3.2, “rpm -q -i wget”.

Exemplo 3.2. rpm -q -i wget


Name        : wget                         Relocations: (not relocatable)
Version     : 1.9.1                             Vendor: SUSE LINUX AG, Nuernberg, Germany
Release     : 50                            Build Date: Sat 02 Oct 2004 03:49:13 AM CEST
Install date: Mon 11 Oct 2004 10:24:56 AM CEST      Build Host: f53.suse.de
Group       : Productivity/Networking/Web/Utilities   Source RPM: wget-1.9.1-50.src.rpm
Size        : 1637514                          License: GPL
Signature   : DSA/SHA1, Sat 02 Oct 2004 03:59:56 AM CEST, Key ID a84edae89c800aca
Packager    : http://www.suse.de/feedback
URL         : http://wget.sunsite.dk/
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 de arquivo e seu caminho completos. Forneça quantos nomes de arquivo desejar. Por exemplo, o seguinte comando

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

resulta em:

rpm-4.1.1-191
wget-1.9.1-50

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

Exemplo 3.3. 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, classificada por data. Este exemplo mostra informações sobre o pacote rpm.

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 3.7. 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

G

Grupo

S

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 armazena essas cópias 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.

3.3.6. Instalando e compilando pacotes de fonte

Todos os pacotes de fontes do SUSE Linux carregam uma extensão .src.rpm (RPM de fonte).

[Tip]Dica

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 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, modificadas 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 fontes 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]Atenção

Não experimente com componentes de sistema (glibc, rpm, sysvinit, etc.), pois isso coloca em risco a operabilidade do sistema.

O exemplo a seguir usa o pacote wget.src.rpm. Após instalar o pacote com o YaST, você deverá ter arquivos similares à seguinte lista:

/usr/src/packages/SOURCES/nops_doc.diff
/usr/src/packages/SOURCES/toplev_destdir.diff
/usr/src/packages/SOURCES/wget-1.9.1+ipvmisc.patch
/usr/src/packages/SOURCES/wget-1.9.1-brokentime.patch
/usr/src/packages/SOURCES/wget-1.9.1-passive_ftp.diff
/usr/src/packages/SOURCES/wget-LFS-20040909.tar.bz2
/usr/src/packages/SOURCES/wget-wrong_charset.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

Prepara fontes em /usr/src/packages/BUILD: decompacta e modifica.

-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.

3.3.7. 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, o 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, através 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, faz com que o script prefira seus próprios RPMs, omite a inicialização do ambiente de construção ou limita 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.

3.3.8. 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 com recursos completos está disponível como um módulo do YaST (consulte a Seção 2.3.1, “Instalando e removendo software” (↑Inicialização)).