segunda-feira, 4 de janeiro de 2010

RPM – RPM Package Manager

Como lidar com os pacotes de programas que encontramos por aí na Internet, ou nos CDs das distribuições Linux? Quais os processos para instalar, remover e atualizar programas que estão no formato RPM? (Não, RPM neste caso não significa Rotação Por Minuto e nem a bandinha brasileira!)

O RPM Package Manager é uma poderosa ferramenta de gerenciamento de pacotes que pode ser utilizada para construir, instalar, consultar, verificar, atualizar, ou apagar pacotes de programas. Um pacote RPM nada mais é que um arquivo cpio com um cabeçalho adicional. Dentro do pacote podemos encontrar os arquivos do programa e os meta-dados do pacote que contém scripts de ajuda, definições sobre os atributos dos arquivos, informações descritivas, entre outros.

Os pacotes podem ser de dois tipos: binários e fontes. Os pacotes binários são chamados de RPMs e vêm na forma pacote-versão.arquitetura.rpm. Os pacotes de fontes são chamados de Source RPMS (SRPMS) e vêm na forma pacote-versão.src.rpm. É possível extrair o conteúdo de um pacote RPM para um diretório sem precisar instalá-lo, utilizando o rpm2cpio:

$ mkdir -p ~/pacote-tmp

$ cd ~/pacote-tmp

$ rpm2cpio ~/download/exemplo-1.0.i386.rpm | cpio -ivd

O banco de dados do RPM está localizado por padrão no diretório /var/lib/rpm e o formato dos arquivos é Berkeley DB (BDB). Quando não existem dados neste diretório, podemos inicializar um banco de dados RPM com o parâmetro –initdb:

# rpm --initdb

Pode ser também que o banco de dados RPM possa estar corrompido. Geralmente quando isto acontece, o comando rpm fica “parado” infinitamente quando é executado, como se estivesse esperando algo acontecer. Caso isso aconteça, temos que reconstruir uma nova base a partir dos cabeçalhos dos pacotes instalados.

Para reconstruir o banco de dados, primeiro apagamos todos os arquivos que começam com “__db.” e utilizamos o parâmetro –rebuilddb para reconstruir:

# cd /var/lib/rpm

# rm -f __db.*

# rpm --rebuilddb

RPM: Instalação e desinstalação

Para instalar um pacote, usa-se a opção -i:

# rpm -i pacote.rpm

Podemos utilizar as opções -v e -h combinadas com a -i para uma mostragem mais agradável. Caso o sistema já possuir o pacote instalado, mas desejamos atualizar para uma versão mais recente, utilizamos a opção -U ao invés da -i. Exemplo:

# rpm -Uvh pacote-atualizacao.rpm

Isso irá atualizar o pacote. Para retirar o pacote do sistema, utilizamos a opção -e:

# rpm -e nome-do-pacote

Caso o pacote gere dependências com outros pacotes e mesmo assim é desejado querer removê-lo, utilizamos a opção –force, que como o nome diz, força a remoção do pacote:

# rpm -e nome-do-pacote --force

Cuidado! Forçar a remoção de um pacote sem resolver as dependência pode causar problemas! Os programas dependentes do pacote poderão não funcionar corretamente. Use apenas se você souber o que estiver fazendo.

Agora o contrário: se for necessário instalar um pacote que necessita de outros pacotes como dependência (mas infelizmente não temos essas dependências), utilizamos o parâmetro –nodeps:

# rpm -Uvh pacote.rpm --nodeps

Lembre-se que instalar pacotes sem suas dependências também não é uma boa prática. O programa pode não funcionar.

RPM: Consulta

Além da instalação e desinstalação de pacotes, um recurso muito útil no RPM é a consulta aos pacotes já existentes. Para utilizar o modo de consulta do RPM, todos os comandos irão começar com o parâmetro -q (query, consulta em inglês).

Se quisermos ver apenas se um pacote está instalado no sistema sem ter que listar todos e procurar de um em um, basta apenas colocar o nome do pacote depois do parâmetro de consulta. Exemplo:

$ rpm -q kdebase

kdebase-3.4.1-1.2.fc4.kde

Quando quisermos listar todos os pacotes instalados no sistema, utilizamos:

$ rpm -qa

Ou podemos, se preferir, utilizar outros comandos como filtro, organizando melhor a visualização:

$ rpm -qa | sort | less

O comando anterior executou o rpm -qa, ordenou por ordem alfabética e utilizou o comando less para paginar a saída. Podemos também procurar por todos os pacotes que possuam a palavra kde no nome:

$ rpm -qa | grep kde

kdenetwork-3.4.1-1.2.fc4.kde

kdegraphics-3.4.1-1.3.fc4.kde

k3b-0.12.2-1.0.fc4.kde

amarok-1.2.4-6.1.fc4.kde

kdegames-3.4.1-1.2.fc4.kde

...corte...

Para obter informações detalhadas sobre sobre um pacote, utilizamos a opção -qi:

$ rpm -qi wget

Name        : wget                         Relocations: (not relocatable)

Version     : 1.9.1                             Vendor: Red Hat, Inc.

Release     : 22                            Build Date: Wed 02 Mar 2005

Install Date: Thu 23 Jun 2005 12:05:03 PM BRT      Build Host:   porky.build.r

Group       : Applications/Internet         Source RPM: wget-1.9.1-22.src.rpm

Size        : 1141398                          License: GPL

Signature   : DSA/SHA1, Fri 20 May 2005 03:28:44 PM BRT, KeyID b44269d04f2a6fd2

Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>

URL         : http://wget.sunsite.dk/

Summary     : A utility for retrieving files using the HTTP or FTP protocols.

Description :

 

GNU Wget is a file retrieval utility which can use either the HTTP or

FTP protocols. Wget features include the ability to work in the

background while you are logged out, recursive retrieval of

directories, file name wildcard matching, remote file timestamp

storage and comparison, use of Rest with FTP servers and Range with

HTTP servers to retrieve files over slow or unstable connections,

support for Proxy servers, and configurability.

Na saída anterior podemos observar qual o pacote-fonte do wget, qual seu tamanho, quem empacotou, sua licença, versão, quando foi instalado, além de um resumo e descrição do que é o pacote. Quem quer conhecer mais sobre os programas dentro da distribuição pode utilizar o rpm -qa para listar todos os pacotes e utilizar o rpm -qi para ver o que cada pacote faz. Haja paciência!

Lembra-se das dependências? Se quisermos ver quais pacotes dependem de um certo pacote, usamos:

$ rpm -qR pacote

Ou às vezes, nos deparamos com uma dúvida cruel: o que esse arquivo está fazendo aqui? Ele pertence a quem? O que ele faz? Para solucionar estas dúvidas, podemos verificar qual o pacote dono de um arquivo utilizando:

$ rpm -qf /etc/arquivo

Exemplo:

$ rpm -qf /usr/sbin/chroot

coreutils-5.2.1-48

Ou você pode fazer o contrário (o que é muito útil): listar todos os arquivos que pertencem a um pacote:

$ rpm -ql pacote

Exemplo:

$ rpm -ql sox

/usr/bin/play

/usr/bin/rec

/usr/bin/sox

/usr/bin/soxmix

/usr/bin/soxplay

/usr/share/doc/sox-12.17.7

/usr/share/doc/sox-12.17.7/Changelog

/usr/share/doc/sox-12.17.7/README

...corte...

Se quisermos saber unicamente quais são os arquivos de configuração de um pacote:

$ rpm -qc crontabs

/etc/crontab

/etc/sysconfig/crontab

Ou se quisermos saber apenas quais são os arquivos de documentação de um pacote:

$ rpm -qd wget

/usr/share/doc/wget-1.10.2/AUTHORS

/usr/share/doc/wget-1.10.2/COPYING

/usr/share/doc/wget-1.10.2/MAILING-LIST

/usr/share/doc/wget-1.10.2/NEWS

/usr/share/doc/wget-1.10.2/PATCHES

/usr/share/doc/wget-1.10.2/README

...corte...

RPM: Verificação

Uma vez que os pacotes estejam instalados no sistema, além das consultas, é possível fazer também verificações nestes pacotes. Em um consulta, o rpm apenas pega informações sobre um pacote e mostra ao usuário. Em uma verificação, o rpm compara essas informações do banco de dados com o estado atual dos arquivos no sistema. Na verificação, se um arquivo estiver faltando ou tiver sido alterado, o rpm irá avisá-lo sobre isto.

Este tipo de tarefa é muito boa para auditoria e para verificar se todos os pacotes e arquivos do sistema estão instalados e funcionando corretamente.

Para fazer a verificação, utilizamos o parâmetro -V:

# rpm -V pacote

Caso tudo esteja em ordem, o rpm não mostrará nada. Se algum arquivo for modificado de alguma forma, ele mostrará algumas letras de estado antes do arquivo. Exemplo:

# rpm -V httpd

S.5....T c /etc/httpd/conf.d/proxy_ajp.conf

missing   c /etc/httpd/conf.d/welcome.conf

S.5....T c /etc/httpd/conf/httpd.conf

Os primeiros 8 caracteres indicam testes que o rpm fez. Quando um ponto (.) aparecer, o teste foi bem sucedido. Se um sinal de interrogação (?) aparecer, significa que o teste não pode ser completado (geralmente por causa de permissões do arquivo). Cada uma das 8 letras significa:

S

O tamanho do arquivo não é igual ao original (conteúdo foi modificado).

M

As permissões do arquivo foram alteradas.

5

A soma MD5 diferente do original (conteúdo foi modificado).

D

Número Major/Minor do dispositivo não coinscide.

L

Link simbólico inválido.

U

Usuário dono diferente do original.

G

Grupo dono diferente do original.

T

A hora da última modificação diferente do original (conteúdo foi modificado).

Depois destes 8 caracteres, pode ser que haja uma letra antes do nome do arquivo, que indica qual a função do arquivo no pacote. Por exemplo: c para arquivos de configuração, d para arquivos de documentação e nada para arquivos normais.

Para fazer uma verificação completa em todos os pacotes instalados, usamos:

# rpm -Va

Para verificarmos apenas um arquivo, usamos:

# rpm -Vf /usr/bin/file

0 comentários :

Enviar um comentário