segunda-feira, 18 de março de 2013

Gerenciamento de pacotes RPM em modo texto em distros Red Hat e compatíveis

Neste artigo vamos explanar o gerenciamento de pacotes RPM, utilizando o Shell (Terminal) do Linux. Embora o gerenciamento de pacotes RPM também possa ser feito em modo gráfico, é fundamental que administradores de sistemas Linux dominem o gerenciamento em modo texto, pois, em servidores, nem sempre dispomos do modo gráfico instalado.
A distro Linux que estou utilizando é a CentOS 5.6, uma distro classe empresarial baseada na distro Red Hat Enterprise Linux 5.6, com a qual mantém 100% de compatibilidade binária.
No entanto, as técnicas aqui explanadas são também aplicáveis a outras distros Linux que utilizam o sistema RPM para gerenciamento de pacotes, como Oracle Enterprise Linux, Fedora e SuSE.

Pacotes RPM e Sistema de Gerenciamento de Pacotes RPM

Em sistemas Linux, softwares são organizados e distribuídos para instalação em outros computadores por meio de pacotes. Pacote é um arquivo binário, compactado ou não, que contém os arquivos binários do software, scripts de configuração, documentação, ícones, imagens, licenças GPL e, por vezes, os próprios arquivos-fonte. Um pacote pode ser criptografado e assinado digitalmente, apesar de nem todos o serem.
RPM (Red Hat Package Manager) é um sistema de gerenciamento de pacotes desenvolvido pela Red Hat para ser utilizado em sua própria distro. Posteriormente outras distros Linux, e mesmo alguns outros sistemas operacionais, também adotaram o formato RPM para gerenciamento de seus pacotes. A LSB (Linux Standard Base) indicou o formato RPM como o padrão para distros Linux.
Outro utilitário para gerenciamento de pacotes RPM em modo texto é o Yum (Yellow Dog Updater, Modified), disponível nas distros Red Hat Enterprise Linux, CentOS, Oracle Entreprise Linux e Fedora.
Com o Yum, é possível realizar instalações e atualizações de pacotes localmente ou a partir de repositórios de pacotes localizados na internet. Sua grande vantagem em relação ao utilitário RPM é tentar resolver automaticamente todas as dependências requeridas por pacotes que estiverem sendo instalados ou atualizados e também por proporcionar uma forma fácil de atualizar todo o sistema pela Internet.
Os três principais formatos de pacotes utilizados em sistemas Linux são:
  1. RPM: utilizado pela distro Red Hat Enterprise Linux (RHEL) e por distros derivadas como CentOS, Oracle Enterprise Linux, Fedora e SuSE.
  2. DEB: utilizado pela distro Debian e por distros derivadas como Ubuntu.
  3. TGZ: utilizado pela distro Slackware e por distros derivadas como Vector Linux.
Além destes formatos, há também outros. No entanto, não vou me prolongar a respeito deles para não perder o foco do artigo e também para não deixá-lo extenso.
O rótulo (nomenclatura) típico de um pacote RPM é nome-versao-release.arquitetura.rpm, onde:
  • Nome: é o nome do software que está sendo distribuído.
  • Versão: é a versão do software.
  • Release: é o versão de construção do pacote para a mesma versão do software.
  • Arquitetura: é a plataforma para a qual o software foi desenvolvido. Noarch significa que o software não foi desenvolvido para uma plataforma específica, podendo ser utilizado em qualquer uma. Src significa que o pacote contém os arquivos-fonte do software.
  • .rpm: é a extensão do nome do arquivo de pacote RPM.
Exemplo: oracle-xe-univ-10.2.0.1-1.0.i386.rpm, sqldeveloper-3.0.04.34-1.noarch.rpm

Instalação

Para instalar pacotes RPM em sistemas Linux, é necessário estar logado como root (su). Note que o sistema de gerenciamento de pacotes RPM não resolve as dependências automaticamente para você.
Portanto, as dependências necessárias deverão ser instaladas antes da instalação do pacote que as requer. Uma outra forma de resolver isso é executar a instalação utilizando o utilitário Yum em distros RHEL e derivadas ou o equivalente em outras distros.
Instalações locais:
Para instalar um pacote localizado localmente, execute o comando # rpm -ivh <pacote>, onde:
  • -i: é o modo de instalação.
  • -v: (opcional) apresenta mensagens detalhadas de saída para o processo de instalação.
  • -h: (opcional) exibe cerquilhas (#) à medida em que o processo de instalação avança.
  • <pacote>: é o nome do arquivo do pacote RPM a ser instalado no sistema; pode ser mais de um ao mesmo tempo, neste caso, separe-os com espaços.
Exemplo: # rpm -ivh AdobeReader_ptb-8.1.7-1.i486.rpm

É possível testar a instalação de um pacote antes de instalá-lo no sistema # rpm -ivh –test <pacote>, onde:
  • –test: esta opção testa o processo de instalação do pacote e, caso haja algum problema, notifica a respeito.
Exemplo: # rpm -ivh –test AdobeReader_ptb-8.1.7-1.i486.rpm

Instalações com o utilitário Yum:
A forma típica do comando Yum para instalações é # yum -y install –nogpgcheck <pacote>, onde:
  • -y: (opcional) resposta automática positiva para a confirmação do processo de instalação.
  • install: é a opção de instalação do Yum.
  • –nogpgcheck: (opcional) instrui o Yum a não verificar a assinatura do pacote.
  • <pacote>: é o nome do pacote RPM disponível localmente ou na Internet em repositórios do Yum.
Exemplo:
  1. # yum -y install –nogpgcheck AdobeReader_ptb-8.1.7-1.i486.rpm
  2. # yum -y install gparted
Observação: No exemplo 1, acima, o pacote está disponível localmente. Em 2, o pacote está localizado em um repositório utilizado pelo Yum, isto é, na Internet. Em ambos os casos, o Yum tenta resolver quaisquer dependências, baixando-as e instalando-as automaticamente.

Atualização

Para atualizar pacotes RPM instalados em sistemas Linux, é necessário estar logado como root (su). Lembre-se de que o sistema de gerenciamento de pacotes RPM não resolve quaisquer dependências requeridas automaticamente.
Caso haja dependências requeridas pelo pacote a ser atualizado que não estejam instaladas no sistema, será necessário baixá-las e instalá-las antes de atualizar o pacote.
Outra forma de resolver isso é executar a atualização utilizando o utilitário Yum em distros RHEL e derivadas ou o equivalente em outras distros.
Atualizações locais: 
Para atualizar um pacote localizado localmente, execute o comando # rpm -Uvh <pacote>, onde:
  • -U: é o modo de atualização.
  • -v: (opcional) apresenta mensagens detalhadas de saída para o processo de atualização.
  • -h: (opcional) apresenta cerquilhas (#) à medida em que o processo de atualização avança.
  • <pacote>: é o nome do arquivo do pacote RPM a ser atualizado no sistema. Pode ser mais de um ao mesmo tempo, neste caso, separe-os com espaços.
Exemplo: # rpm -Uvh flash-plugin-10.2.153.1-release.i386.rpm
Observação: Caso o pacote em atualização não estiver instalado no sistema, ele será automaticamente instalado com este comando.
Também é possível testar a atualização de um pacote antes de atualizá-lo no sistema # rpm -Uvh –test <pacote>, onde:
  • –test: esta opção testa o processo de atualização do pacote e, caso haja algum problema, notifica a respeito.
Exemplo: # rpm -Uvh –test flash-plugin-10.2.153.1-release.i386.rpm

Atualizações com o utilitário Yum:
O processo de atualização com o Yum é muito útil, pois, com ele, é possível atualizar até mesmo todo o sistema de uma só vez. Neste caso, o processo poderá ser um pouco demorado, dependendo da quantidade de pacotes a serem atualizados e da velocidade de sua conexão à Internet.

  • Para atualizar pacotes, a forma típica do comando Yum é # yum -y update [pacote]
Exemplo: # yum -y update flash-plugin-10.2.153.1-release.i386.rpm
  • Para verificar se há atualizações disponíveis # yum check-update [pacote]
Exemplo: # yum check-update flash-plugin-10.2.153.1-release.i386.rpm
                 # yum check-update

  • Para atualizar todo o sistema Linux # yum -y update
Nas formas do comando Yum apresentadas acima, o nome do pacote a ser atualizado é opcional. É possível informar vários nomes de pacotes a serem atualizados em em único comando, basta separá-los com espaços.
Quando não for informado nenhum nome de pacote, o Yum processará todos os pacotes instalados em seu sistema Linux. O -y é opcional e serve como resposta positiva automática para as questões formuladas pelo Yum.

Downgrade

Downgrade significa baixar a versão de um dado pacote instalado em um sistema Linux, isto é, atualizar para uma versão mais antiga do pacote. A principal razão para que isso seja feito é quando um determinado aplicativo ou sistema funcionava adequadamente com uma versão “X” de um determinado pacote e, após este pacote ter sido atualizado para uma versão “Y” superior, o mesmo aplicativo ou sistema passa a não funcionar bem com esta nova versão “Y” do pacote considerado.
Neste caso, o administrador do sistema deverá fazer o downgrade deste pacote para a versão “X”. Para fazer donwgrade de um pacote instalado em um sistema Linux, é necessário estar logado como root (su).
Downgrades locais:
Para fazer o downgrade de um pacote localizado localmente, execute o comando # rpm -Uvh –oldpackage <pacote>, onde:
  • -U: é o modo de atualização.
  • -v: (opcional) apresenta mensagens detalhadas de saída para o processo de downdrade.
  • -h: (opcional) exibe cerquilhas (#) à medida em que o processo de downgrade avança.
  • –oldpackage: força o downgrade de pacotes.
  • <pacote>: é o nome do pacote RPM da versão anterior, isto é, para o qual você está fazendo downgrade.
Exemplo: # rpm -Uvh –oldpackage flash-plugin-10.2.153.1-release.i386.rpm

É possível testar o downgrade de um pacote antes de atualizá-lo no sistema # rpm -Uvh –oldpackage –test <pacote>, onde:

  • –test: esta opção testa o processo de downgrade do pacote e, caso haja algum problema, notifica a respeito.
Downgrades com o utilitário Yum:
Com o Yum você poderá fazer downgrade de pacotes a partir de repositórios do Yum localizados na Intenet. A forma do comando é # yum -y downgrade <pacote>.

Exemplo: # yum -y downgrade flash-plugin-10.2.153.1-release.i386.rpm
O -y é opcional e serve como resposta positiva automática ao Yum para conformar a execução do processo.

Observação: Seja criterioso ao fazer downgrade de pacotes em seu sistema, pois o mesmo poderá apresentar comportamentos indesejados como, por exemplo, instabilidade e/ou vulnerabilidades.

Consultas

Com o sistema de gerenciamento de pacotes RPM, é possível realizar diversas formas de consultas de informações sobre pacotes instalados ou não no sistema. Note que para consultas de pacotes, não é necessário estar logado como root (su). A seguir, as formas mais usuais de consultas.
Consultas de informações de pacotes instalados no sistema:
  • Para listar todos os pacotes instalados no sistema:
$ rpm -qa
  • Para listar, em ordem alfabética ascendente, todos os pacotes instalados no sistema:
$ rpm -qa | sort
  • Para obter a contagem dos pacotes instalados no sistema, sem listá-los:
$ rpm -qa | wc -l
  • Para verificar se um pacote está instalado no sistema, informando uma parte do nome do pacote:
$ rpm -qa | grep -i <substring> 
Onde <substring> é uma parte do nome do pacote que você está consultando. Nesta forma de consulta, será ignorada a diferença entre maiúsculas e minúsculas.
Exemplo: $ rpm -qa | grep -i java
  • Para gerar um arquivo texto contendo a listagem, em ordem alfabética ascendente, de todos os pacotes instalados no sistema:
$ rpm -qa | sort > <nome_arquivo_txt>
Exemplo: $ rpm -qa | sort > ListPctsInstalados.txt
  • Para consultar informações sobre um pacote específico instalado no sistema:
$ rpm -qi <pacote>
Exemplo: $ rpm -qi java-1.6.0-openjdk-1.6.0.0-1.20.b17.el5
Observação: Note que o nome do pacote deverá ser digitado exatamente por completo, da mesma forma em que estiver registrado no banco de dados do RPM, levando-se em consideração maiúsculas e minúsculas.
  • Para listar todos os arquivos de um pacote específico instalado no sistema:
$ rpm -ql <pacote>
Exemplo: $ rpm -ql java-1.6.0-openjdk-1.6.0.0-1.20.b17.el5
Consultas de informações de pacotes não instados no sistema:
  • Para consultar informações sobre um pacote específico não instalado no sistema:
$ rpm -qpi <pacote>
Exemplo: $ rpm -qpi AdobeReader_ptb-8.1.7-1.i486.rpm
  • Para listar todos os arquivos de um pacote específico não instalado no sistema:
$ rpm -qpl <pacote>
Exemplo: $ rpm -qpl AdobeReader_ptb-8.1.7-1.i486.rpm
  • Para obter a contagem dos arquivos de um pacote específico não instalado no sistema, sem listar estes arquivos:
$ rpm -qpl <pacote> | wc -l
Exemplo: $ rpm -qpl AdobeReader_ptb-8.1.7-1.i486.rpm | wc -l
  • Para gerar um arquivo texto contendo a listagem, em ordem alfabética ascendente, dos arquivos de um pacote específico não instalados no sistema:
$ rpm -qpl <pacote> | sort > <nome_arquivo_txt>
Exemplo: $ rpm -qpl AdobeReader_ptb-8.1.7-1.i486.rpm | sort > ListArqsPct.txt

Desinstalação

Para executar a desinstalação de pacotes RPM em sistemas Linux, você deverá estar logado como usuário root (su) e executar o comando a seguir:
# rpm -e <pacote>
 Exemplo: # rpm -e  AdobeReader_ptb-8.1.7-1
Observação: Note que o nome do pacote a ser desinstalado deve ser exatamente igual ao nome registrado no banco de dados do RPM. Você pode descobrir o nome exato do pacote instalado no sistema, utilizando as opções de consulta apresentadas na seção Consultas deste artigo.

Outra forma de executar a desinstalação de pacotes RPM é combinar recursos de consulta de nomes de pacotes e pesquisa de substrings em subshell do Linux, em uma única linha de comando.
A forma típica do comando, neste caso, é  # rpm -e  $(rpm -qa | grep -i <substring>), onde:
  • $(…): é o subshell. Os comandos internos à este subshell são processados antes do comando externo.
  • rpm -qa: é o comando de consulta de todos os pacotes RPM instalados no sistema.
  • grep -i substring: este comando procura ocorrências do texto fornecido em substring na lista de pacotes RPM instalados no sistema, obtida pelo comando rpm -qa anterior e ignorando maiúsculas e minúsculas.
  • <substring>: é um texto representando parte do nome do pacote RPM a ser desinstalado do sistema.   
Exemplo: # rpm -e $(rpm -qa | grep -i adobe
Neste exemplo, serão desinstalados do sistema todos os pacotes RPM que contiverem adobe como parte de seu nome, desconsiderando-se maiúsculas e minúsculas.
Observação: Tenha muito cuidado ao executar desinstalações desta forma, pois qualquer erro poderá ser fatal. Podem ser desinstalados outros pacotes que não os desejados e/ou que sejam importantes a seu sistema ou a seu trabalho!

Reconstrução do banco de dados do RPM

O sistema RPM utiliza um banco de dados Berkeley DB, localizado no diretório /var/lib/rpm/, para armazenar metadados dos pacotes instalados em um sistema Linux.
Embora sistemas Linux sejam bastante seguros e confiáveis, o banco de dados do RPM pode, eventualmente, sofrer quebras (corrupções). Caso isso ocorra, você não conseguirá gerenciar seus pacotes RPM. Por exemplo, você não conseguirá instalar novos pacotes no sistema.
Para tentar corrigir este problema, estando logado como usuário root (su), execute o seguinte comando de reconstrução do banco de dados do RPM:
# rpm --rebuilddb
Embora este comando seja utilizado em casos de corrupção do banco de dados do RPM, você poderá utilizá-lo periodicamente, de forma preventiva, mesmo que o banco de dados do RPM não apresente problemas aparentes.

Solução de problemas de transações não concluídas com o Yum

Outro problema que também pode ocorrer, sobretudo quando ocorre instalação ou atualização de pacotes RPM, é a interrupção, por diversos motivos, do processo antes de sua conclusão, gerando transações não concluídas.
Quando isso ocorrer, sempre que você for instalar ou atualizar pacotes com o Yum, receberá uma mensagem como a seguinte: There are unfinished transactions remaining. You might consider running yum-complete-transaction first to finish them.
Para sanar este problema, será necessário estar logado como root (su) e executar o utilitário yum-complete-transaction, o qual está contido no pacote yum-utils:
# /usr/sbin/yum-complete-transaction
Caso o pacote yum-utils não esteja instalado no sistema, instale-o com o comando a seguir:
# yum -y install yum-utils
Por enquanto é isso, deixem seus feedbacks sobre testes com gerenciamento de pacotes RPM nos comentários e vamos trocando ideias.