Red Hat Training

A Red Hat training course is available for RHEL 8

Capítulo 3. Software de embalagem

3.1. Pacotes de RPM

Esta seção cobre os conceitos básicos do formato de embalagem RPM.

3.1.1. O que é um RPM

Um pacote RPM é um arquivo contendo outros arquivos e seus metadados (informações sobre os arquivos que são necessários ao sistema).

Especificamente, um pacote de RPM consiste no arquivo cpio.

O arquivo cpio contém:

  • Arquivos
  • Cabeçalho RPM (metadados do pacote)

    O gerenciador de pacotes rpm utiliza estes metadados para determinar as dependências, onde instalar arquivos e outras informações.

Tipos de pacotes de RPM

Há dois tipos de pacotes de RPM. Ambos os tipos compartilham o formato do arquivo e as ferramentas, mas têm conteúdos diferentes e servem a propósitos diferentes:

  • Fonte RPM (SRPM)

    Um SRPM contém o código fonte e um arquivo SPEC, que descreve como construir o código fonte em um RPM binário. Opcionalmente, os patches para o código-fonte também são incluídos.

  • RPM Binário

    Um RPM binário contém os binários construídos a partir das fontes e remendos.

3.1.2. Listagem das utilidades da ferramenta de embalagem RPM

Os seguintes procedimentos mostram como listar as utilidades fornecidas pelo pacote rpmdevtools.

Pré-requisitos

Para poder utilizar as ferramentas de embalagem RPM, você precisa instalar o pacote rpmdevtools, que fornece várias utilidades para embalagem de RPMs.

# yum instalar rpmdevtools

Procedimento

  • Liste as utilidades da ferramenta de embalagem RPM:

    $ rpm -ql rpmdevtools | grep bin

Informações adicionais

  • Para mais informações sobre as utilidades acima, consulte suas páginas de manual ou diálogos de ajuda.

3.1.3. Criação de espaço de trabalho de embalagem RPM

Esta seção descreve como configurar um layout de diretório que é o espaço de trabalho de embalagem RPM, usando o utilitário rpmdev-setuptree.

Pré-requisitos

O pacote rpmdevtools deve ser instalado em seu sistema:

# yum instalar rpmdevtools

Procedimento

  • Execute o utilitário rpmdev-setuptree:
$ rpmdev-setuptree

$ tree ~/rpmbuild/
/home/user/rpmbuild/
|-- BUILD
|-- RPMS
|-- SOURCES
|-- SPECS
`-- SRPMS

5 directories, 0 files

Os diretórios criados servem a estes propósitos:

Diretório

Objetivo

CONSTRUÇÃO

Quando as embalagens são construídas, vários diretórios %buildroot são criados aqui. Isto é útil para investigar uma construção falhada se a saída dos logs não fornecer informações suficientes.

RPMS

Os RPMs binários são criados aqui, em subdiretórios para diferentes arquiteturas, por exemplo, nos subdiretórios x86_64 e noarch.

FONTES

Aqui, o empacotador coloca arquivos de código fonte comprimido e patches. O comando rpmbuild procura por eles aqui.

SPECS

O embalador coloca aqui os arquivos SPEC.

SRPMS

Quando rpmbuild é usado para construir um SRPM em vez de um RPM binário, o SRPM resultante é criado aqui.

3.1.4. O que é um arquivo SPEC

Você pode entender um arquivo SPEC como uma receita que o utilitário rpmbuild usa para construir um RPM. Um arquivo SPEC fornece informações necessárias para o sistema de construção definindo instruções em uma série de seções. As seções são definidas no Preamble e na parte Body. A parte Preamble contém uma série de itens de metadados que são usados na parte Body. A parte Body representa a parte principal das instruções.

3.1.4.1. Preâmbulo Itens

A tabela abaixo apresenta algumas das diretrizes que são usadas com freqüência na seção Preamble do arquivo SPEC da RPM.

Tabela 3.1. Itens utilizados no Preamble seção do arquivo SPEC da RPM

Diretriz SPECDefinição

Name

O nome base do pacote, que deve combinar com o nome do arquivo SPEC.

Version

O número da versão upstream do software.

Release

O número de vezes que esta versão do software foi lançada. Normalmente, defina o valor inicial para 1%{?dist}, e aumente-o a cada novo lançamento do pacote. Redefinir para 1 quando um novo Version do software for construído.

Summary

Um breve resumo de uma linha do pacote.

License

A licença do software que está sendo embalado.

URL

A URL completa para mais informações sobre o programa. Na maioria das vezes este é o site do projeto upstream para o software que está sendo empacotado.

Source0

Caminho ou URL para o arquivo comprimido do código-fonte a montante (não corrigido, as correções são tratadas em outro lugar). Isto deve apontar para um armazenamento acessível e confiável do arquivo, por exemplo, a página a montante e não o armazenamento local do empacotador. Se necessário, mais diretrizes do SourceX podem ser adicionadas, incrementando o número a cada vez, por exemplo: Fonte1, Fonte2, Fonte3, e assim por diante.

Patch

O nome do primeiro patch a ser aplicado ao código fonte, se necessário.

A diretiva pode ser aplicada de duas maneiras: com ou sem números no final do Patch.

Se nenhum número for dado, um é atribuído à entrada internamente. Também é possível dar os números explicitamente usando Patch0, Patch1, Patch2, Patch3, e assim por diante.

Estes remendos podem ser aplicados um a um utilizando a macro %patch0, %patch1, %patch2 e assim por diante. As macros são aplicadas dentro da diretiva %prep na seção Body do arquivo SPEC da RPM. Alternativamente, é possível usar a macro topatch que aplica automaticamente todos os patches na ordem em que são dados no arquivo SPEC.

BuildArch

Se o pacote não for dependente da arquitetura, por exemplo, se for escrito inteiramente em uma linguagem de programação interpretada, defina isso para BuildArch: noarch. Se não for definido, o pacote herda automaticamente a Arquitetura da máquina sobre a qual é construído, por exemplo x86_64.

BuildRequires

Uma lista separada por vírgula ou espaço em branco dos pacotes necessários para construir o programa escrito em uma linguagem compilada. Pode haver múltiplas entradas de BuildRequires, cada uma em sua própria linha no arquivo SPEC.

Requires

Uma lista separada por vírgula ou espaço em branco dos pacotes requeridos pelo software para ser executado uma vez instalado. Pode haver múltiplas entradas de Requires, cada uma em sua própria linha no arquivo SPEC.

ExcludeArch

Se um software não puder operar em uma arquitetura de processador específica, você pode excluir essa arquitetura aqui.

Conflicts

Conflicts são inversos para Requires. Se houver um pacote compatível Conflicts, o pacote não pode ser instalado independentemente se a tag Conflict está no pacote que já foi instalado ou em um pacote que vai ser instalado.

Obsoletes

Esta diretiva altera a forma de trabalho das atualizações dependendo se o comando rpm é usado diretamente na linha de comando ou se a atualização é realizada por um solucionador de atualizações ou dependência. Quando usado em uma linha de comando, o RPM remove todos os pacotes que correspondem a pacotes obsoletos que estão sendo instalados. Ao usar uma atualização ou resolvedor de dependência, pacotes contendo Obsoletes: correspondente são adicionados como atualizações e substituem os pacotes correspondentes.

Provides

Se Provides for adicionado a um pacote, o pacote pode ser referido por outras dependências além de seu nome.

As diretrizes Name, Version, e Release compreendem o nome do arquivo do pacote RPM. Os mantenedores do pacote RPM e os administradores do sistema freqüentemente chamam estas três diretivas de N-V-R ou NVR, porque os nomes dos arquivos do pacote RPM têm o formato NAME-VERSION-RELEASE.

O exemplo a seguir mostra como obter a informação NVR para um pacote específico consultando o comando rpm.

Exemplo 3.1. Consultar as rpm para fornecer as informações NVR para o pacote bash

# rpm -q bash
bash-4.4.19-7.el8.x86_64

Aqui, bash é o nome do pacote, 4.4.19 é a versão, e 7.el8 é o lançamento. O marcador final é x86_64, que sinaliza a arquitetura. Ao contrário do NVR, o marcador de arquitetura não está sob controle direto do empacotador RPM, mas é definido pelo ambiente de construção rpmbuild. A exceção a isto é o pacote noarch independente da arquitetura.

3.1.4.2. Itens do corpo

Os itens usados no arquivo Body section do RPM SPEC estão listados na tabela abaixo.

Tabela 3.2. Itens utilizados na seção Corpo do arquivo SPEC da RPM

Diretriz SPECDefinição

%description

Uma descrição completa do software embalado no RPM. Esta descrição pode abranger várias linhas e pode ser dividida em parágrafos.

%prep

Comando ou série de comandos para preparar o software a ser construído, por exemplo, desempacotar o arquivo em Source0. Esta diretiva pode conter um script de shell.

%build

Comando ou série de comandos para construir o software em código de máquina (para idiomas compilados) ou código de byte (para alguns idiomas interpretados).

%install

Comando ou série de comandos para copiar os artefatos de construção desejados do diretório %builddir (onde a construção acontece) para o diretório %buildroot (que contém a estrutura do diretório com os arquivos a serem empacotados). Isto geralmente significa copiar os arquivos de ~/rpmbuild/BUILD para ~/rpmbuild/BUILDROOT e criar os diretórios necessários em ~/rpmbuild/BUILDROOT. Isto só é executado quando se cria um pacote, e não quando o usuário final instala o pacote. Veja Seção 3.2, “Trabalhando com arquivos SPEC” para detalhes.

%check

Comando ou série de comandos para testar o software. Isto normalmente inclui coisas tais como testes unitários.

%files

A lista de arquivos que serão instalados no sistema do usuário final.

%changelog

Um registro das mudanças que aconteceram com o pacote entre as diferentes construções do Version ou Release.

3.1.4.3. Itens avançados

O arquivo SPEC também pode conter itens avançados, tais como Scriptlets ou Triggers. Eles têm efeito em diferentes pontos durante o processo de instalação no sistema do usuário final, não no processo de construção.

3.1.5. BuildRoots

No contexto da embalagem RPM, buildroot é um ambiente chroot. Isto significa que os artefatos de construção são colocados aqui usando a mesma hierarquia do sistema de arquivos que a hierarquia futura no sistema do usuário final, com buildroot atuando como diretório raiz. A colocação dos artefatos de construção deve estar de acordo com o padrão de hierarquia do sistema de arquivos do sistema do usuário final.

Os arquivos em buildroot são posteriormente colocados em um arquivo cpio, que se torna a parte principal do RPM. Quando o RPM é instalado no sistema do usuário final, estes arquivos são extraídos no diretório root, preservando a hierarquia correta.

Nota

A partir do Red Hat Enterprise Linux 6, o programa rpmbuild tem seus próprios padrões. Substituir estes padrões leva a vários problemas; portanto, a Red Hat não recomenda que você defina seu próprio valor desta macro. Você pode usar a macro %{buildroot} com os defaults do diretório rpmbuild.

3.1.6. Macros RPM

Uma macro rpm é uma substituição de texto reto que pode ser atribuída condicionalmente com base na avaliação opcional de uma declaração quando determinada funcionalidade embutida é utilizada. Portanto, o RPM pode realizar substituições de texto para você.

Um exemplo de uso é a referência ao software embalado Version várias vezes em um arquivo SPEC. Você define Version apenas uma vez na macro %{version}, e usa esta macro em todo o arquivo SPEC. Cada ocorrência será automaticamente substituída por Version que você definiu anteriormente.

Nota

Se você vir uma macro não familiar, você pode avaliá-la com o seguinte comando:

$ rpm --eval %{_MACRO}

Avaliando as macros %{_bindir} e %{_libexecdir}

$ rpm --eval %{_bindir}
/usr/bin

$ rpm --eval %{_libexecdir}
/usr/libexec

Uma das macros mais usadas é a macro %{?dist}, que sinaliza qual distribuição é usada para a construção (etiqueta de distribuição).

# On a RHEL 8.x machine
$ rpm --eval %{?dist}
.el8