Aula #27 - RPM



O Red Hat Package Manager (RPM) é utilizado por um grande número de distribuições para controlar a instalação, verificação, atualização e remoção de programas em sistemas Linux. O programa de baixo nível rpm pode realizar todas essas operações, em apenas um pacote, ou em uma lista de pacotes. Operações que podem causar problemas, como a remoção de um pacote de que outro pacotes dependem, são impedidas para garantir que o sistema esteja me bom estado.



O RPM (Redhat Package Manager) foi desenvolvido (sem surpresa) pela Red Hat. Todos os arquivos relacionados a uma aplicação (ou tarefa) específica são empacotados em um único arquivo rpm, que também contém informações sobre como e onde instalar e desinstalar os arquivos. Novas versões do software geram novos arquivos rpm que são então utilizados para a atualização.

Arquivos rpm também contêm informações de dependência. A menos que uma URL seja usada para instalar um pacote, o rpm, não recupera pacotes de um repositório na rede, e só alcança pacotes na máquina local com caminhos absolutos ou relativos.

Arquivos rpm são geralmente feitos para uma distribuição específica; instalar um pacote em uma distribuição diferente da distribuição para o qual o pacote foi criado pode ser difícil se não impossível. 





Vantagens do RPM


Para os administradores de sistema, o sistema de pacotes RPM facilita:

    Determinar de qual pacote (se houver) instalam os arquivos presentes no sistema.
    Determinar qual a versão instalada.
    Instalar e desinstalar (apagar) pacotes sem deixar restos.
    Verificar se um pacote foi instalado corretamente, o que é útil tanto para solução de problemas e auditoria do sistema.
    Distinguir arquivos de documentação do resto do pacote e, opcionalmente, optar por não instalá-los para economizar espaço.
    Usar FTP ou HTTP para instalar os pacotes através da Internet. 

Para os desenvolvedores, o RPM também oferece vantagens:

    Software muitas vezes é disponibilizado em mais de um sistema operacional. Com RPM o código fonte completo e original é usado como base, mas um desenvolvedor pode incluir patches necessários para construir para o Linux.
    Mais do que uma arquitetura pode ser construída utilizando apenas um pacote fonte. 


Os nomes de pacotes RPM são baseados em campos que representam informações bem específicas que fazem parte do padrão RPM documentado em (http://www.rpm.org/).

    ​O nome padrão para um pacote binário é:
    --...rpm
Exemplo:     sed-4.2.1-10.el6.x86_64.rpm

    O nome padrão para um arquivo de código fonte é:
    --..src.rpm
Exemplo:
    sed-4.2.1-10.el6.src.rpm

Observe que o campo distro costuma especificar o repositório que fornece o pacote, já que ferramentas como o yum suportam vários repositórios diferentes.


O /var/lib/rpm é o diretório padrão que contém arquivos de banco de dados RPM, na forma de arquivos do banco de dados Berkeley DB. Os arquivos do banco de dados não devem ser modificados manualmente; atualizações devem ser feitas somente através da utilização do programa rpm.

Um diretório alternativo para o banco de dados pode ser especificado com a opção --dbpath do programa rpm. Pode-se fazer isso, por exemplo, para examinar um banco de dados RPM copiado de outro sistema.

Você pode usar a opção --rebuilddb para reconstruir os índices do banco de dados a partir dos pacotes instalados; isso é mais um reparo, do que uma reconstrução a partir do zero. 


Programas auxiliares e scripts usados pelo RPM ficam na pasta /usr/lib/rpm. E existem vários; por exemplo em um RHEL 7:

$ ls /usr/lib/rpm | wc -l
69

(O pipe "|" seguindo do comando 'wc -l' conta o número de linhas que o comando anterior retornou)

Você pode criar um arquivo rpmrc que determina as opções padrão do rpm. Por padrão o rpm considera:

    /usr/lib/rpm/rpmrc

    /etc/rpmrc
    ~/.rpmrc

na ordem apresentada. Observe que todos estes arquivos são lidos; O rpm não para quando encontra o primeiro arquivo. Um arquivo rpmrc alternativo pode ser especificado usando a opção --rcfile .




Todas as consultas com o comando rpm incluem a opção -q que tem várias sub opções como em:

    Qual é a versão do pacote instalado?
    $ rpm -q bash
     
    De que pacote este arquivo veio?
    $ rpm -qf /bin/bash
     
    Quais arquivos são instalados por este pacote?
    $ rpm -ql bash
     
    Mostra as informações sobre o pacote.
    $ rpm -qi bash
     
    Mostra as informações sobre o pacote, mas a partir do arquivo rpm e não a partir da base de dados rpm
    $ rpm -qip foo-1.0.0.1.noarch.rpm
     
    Mostra todos os pacotes instalados no sistema.
    $ rpm -qa 

Outras opções úteis são --requires e --whatprovides.



    Mostra a lista de pacotes que precisam estar disponíveis para que este pacote seja instalado:
    $ rpm -qp --requires foo-1.0.0-1.noarch.rpm
     
    Mostra quais pacotes fornecem o requisito, neste caso o requisito é libc.so.6:
    $ rpm -q --whatprovides libc.so.6 




A opção -V do comando rpm permite verificar se os arquivos em disco instalados a partir de um pacote estão consistentes com o banco de dados RPM de pacotes instalados no sistema. Para verificar todos os pacotes instalados no sistema:

$ rpm -Va
missing   /var/run/pluto
....
S.5....T. c /etc/hba.conf
S.5....T. /usr/share/applications/defaults.list
....L.... c /etc/pam.d/fingerprint-auth
....L.... c /etc/pam.d/password-auth
....
.M....... /var/lib/nfs/rpc_pipefs
....
.....UG.. /usr/local/bin
.....UG.. /usr/local/etc


mostrando apenas alguns itens. (Esse comando pode levar muito tempo para concluir porque ele verifica todos os pacotes.)


O programa só emite mensagens quando encontra problemas. 

Cada uma das letras acima representa o resultado de uma comparação de atributo(s) do arquivo em disco com o valor dos mesmos atributo(s) registrados no banco de dados. Um . (ponto) indica que o teste passou, enquanto um ? (ponto de interrogação) indica que o teste não pôde ser feito (por exemplo, por falta de permissões nos arquivos). Caso contrário, a letra indica o que falhou:

    S: tamanho do arquivo diferente
    M: permissões e/ou tipo do arquivo diferente
    5: checksum MD5 diferente
    D: números major/minor diferente
    L: link simbólico diferente
    U: dono do arquivo diferente
    G: grupo do arquivo diferente
    T: data/hora de modificação diferente
    P: recursos diferentes
     

Muitos destes testes de verificação não indicam um problema. Por exemplo, arquivos de configuração podem ser modificados.

Você pode especificar um ou mais pacotes como argumento, como nos exemplos a seguir:

    Nada é impresso quando não há problemas:
    $ rpm -V bash
     
    Saída indica que o tamanho, checksum MD5, e hora de modificação mudaram:
    $ rpm -V talk
    S.5....T in.ntalkd.8


    Saída indicando que um arquivo está faltando:
    $ rpm -V talk
    missing /usr/bin/talk






Como instalar um pacote ou arquivo RPM

Instalar um pacote é simples:
$ sudo rpm -ivh foo-1.0.0-1.noarch.rpm

onde o -i é para instalar, -v é para mostrar detalhes (verbose), e -h indica que o progresso da instalação será exibido com símbolos # (hash).

RPM executa várias tarefas durante a instalação de um pacote:
    Faz verificações sobre dependências:
    Necessário porque alguns programas não vão funcionar corretamente a não ser que um ou mais pacotes adicionais também estejam instalados.
    Executa verificações de conflito:
    Inclui tentativas de instalar um pacote já instalado, ou instalar uma versão mais antiga sobre uma versão mais nova.
    Executa comandos necessários antes da instalação:
    O desenvolvedor que cria o pacote pode especificar scripts para serem executados antes e após a instalação.
    Lida com arquivos de configuração de forma inteligente:
    Ao instalar um arquivo de configuração, caso o arquivo exista e se foi alterado pelo usuário, o RPM salva a versão antiga com a extensão .rpmsave. Isso permite a você integrar as suas alterações feitas no arquivo antigo na nova versão do arquivo de configuração. Este recurso depende da criação correta de pacotes RPM.
    Descompacta arquivos do pacote e os instala com os atributos corretos:
    Além de instalar arquivos no local correto, RPM também configura atributos como permissões, donos, e hora de modificação (build).
    Executa comandos necessários após a instalação:
    Executa tarefas após a instalação que possa ser necessária para configuração ou inicialização.
    Atualiza a base de dados RPM local:
    Toda vez que o RPM instala um pacote, ele atualiza os metadados na base de dados locais. Essa informação é usada durante a verificação de conflitos.



A opção -e diz para o rpm desinstalar (remover) um pacote.  Normalmente o rpm  -e retorna uma mensagem de erro se o pacote que você está tentando desinstalar ou não está instalado, ou é exigido por outros pacotes do sistema. A desinstalação com sucesso não produz saída.

$ sudo rpm -e system-config-lvm

package system-config-lvm is not installed
Error due to dependencies:

$ sudo rpm -e xz

error: Failed dependencies:
        xz is needed by (installed) dracut-033-161.el7.x86_64
        xz is needed by (installed) sos-3.0-23.el7.noarch
        xz is needed by (installed) libvirt-daemon-driver-qemu-1.1.1-29.el7_0.1.x86_64
        xz is needed by (installed) rpm-build-4.11.1-16.el7.x86_64
        /usr/bin/xz is needed by (installed) kmod-14-9.el7.x86_64

Você pode usar a opção --test com a opção -e para determinar se a desinstalação terá sucesso, sem fazer a desinstalação. Se o teste for bem sucedido, rpm não imprime nada na tela. Adicione a opção -vv para obter mais informações.

Lembre-se de que o argumento para remover um pacote é o nome do pacote e não o nome do arquivo rpm.

Nota importante (mas não obvia): Nunca remova o pacote do rpm. Você pode precisar reinstalar o sistema operacional para ter um sistema funcional novamente.


Atualizar substitui o pacote original (se instalado) como em:
$ sudo rpm -Uvh bash-4.2.45-5.el7_0.4.x86_64.rpm

Você pode passar uma lista de pacotes e não apenas um.

Ao fazer o upgrade, o pacote já instalado é removido e a versão mais recente será instalada. A única exceção são os arquivos de configuração da instalação original, que são mantidos com a extensão .rpmsave.

Se você usar a opção -U e o pacote ainda não estiver instalado, ele será instalado sem erros.

A opção -i não é feita para atualizações, tentar instalar uma versão mais nova de um pacote RPM sobre uma versão mais antigo falha com mensagens de erro.

No entanto diferentes versões do mesmo pacote podem ser instalados se os mesmos arquivos não estão presentes em mais de um pacote. O exemplo mais comum é o pacotes do kernel, mas o mesmo acontece com pacotes de bibliotecas de outras arquiteturas.

Se você quiser fazer uma desatualização (instalar a versão mais antiga), use rpm -U com a opção  --oldpackage.




O comando:
$ sudo rpm -Fvh *.rpm

vai tentar renovar (freshen) todos os pacotes no diretório atual.  Funciona assim:

    Se uma versão mais antiga de um pacote está instalada, ela será atualizada para a versão mais recente que está no diretório.
    Nada acontece se a versão do sistema é a mesma que a versão do diretório.
    O pacote no diretório é ignorado se não há uma outra versão do mesmo pacote instalada no sistema.

A ação de renovar (freshen) pode ser útil para aplicar várias atualizações em uma única operação.


Quando você instalar um novo kernel em seu sistema, será necessário fazer um reboot (uma das poucas atualizações que tem essa necessidade) para o novo kernel ser usado. Você não deve fazer um upgrade (-U) de um pacote do kernel, já que uma atualização elimina o kernel atualmente em execução.

Apenas isso não vai parar o sistema, mas se depois do reboot algo parar de funcionar, você não vai conseguir reiniciar no kernel antigo, já que ele foi removido ao atualizar o pacote. No entanto, se você instalar (-i), as duas versões do kernels vão coexistir e você pode escolher qual iniciar; ou seja, você pode voltar para o antigo, se necessário.

Para instalar um novo kernel:
$ sudo rpm -ivh kernel-{versão}.{arquitetura}.rpm

trocando a versão e arquitetura pelos valores corretos.

Quando você fizer isso, o arquivo de configuração do GRUB será atualizado para incluir a nova versão; ela vai ser a nova escolha padrão no boot a menos que você reconfigure o sistema para fazer outra coisa.

Uma vez que a nova versão do kernel foi testada, você pode remover a versão antiga, embora isso não seja necessário. A menos que você tenha problema de espaço em disco, é recomendado manter um ou mais kernels antigos disponíveis. 








RPM2CPIO

Como extrair um arquivo ou pacote RPM


Suponha que você tenha a necessidade de extrair arquivos de um pacote rpm, mas não queira instalar o pacote.

O programa rpm2cpio pode ser usado para extrair arquivos de um pacote rpm e criar um arquivo cpio, e também extrair os arquivos, caso seja o que você quer.

Crie o arquivo cpio com:
$ rpm2cpio foobar.rpm > foobar.cpio

Para listar os arquivos em um rpm:
$ rpm2cpio foobar.rpm | cpio -t

mas a melhor maneira é fazer:
$  rpm -qilp foobar.rpm

Para extrair os arquivos diretamente:
$ rpm2cpio bash-4.2.45-5.el7_0.4.x86_64.rpm |  cpio -ivd bin/bash

$ rpm2cpio foobar.rpm | cpio --extract --make-directories


Mais vistos no mês:

As melhores distribuições Linux para 2017

TuxMath - Tux, do Comando da Matemática. Ensino e diversão a crianças.

Teste de Performance de Rede com Iperf

OPNsense - Firewall Open Source

DHCP - Guia Completo

Aula #14 - Os sistemas de arquivos ext2/ext3/ext4

Ophcrack: Descubra todas as senhas do Windows

SSD no linux

Administração de sistema e Deploys: Ansible, Chef, Fabric, Puppet ou Salt?