Como criar um pacote de rpm
- 2566
- 770
- Arnold Murray
O RPM é o gerenciador de pacotes e o formato de embalagem usado por muitas distribuições Linux, como Fedora, Red Hat e Centos, para gerenciar e distribuir software em forma binária. Neste tutorial, veremos como construir e empacotar um aplicativo simples.
Neste tutorial, você aprenderá:
- Quais são os conceitos básicos por trás do processo de construção do RPM.
- Qual é o ambiente de construção.
- O que é um especfile de especificação.
- Como usar macros dentro de um especfile.
- Como instalar as dependências de construção.
- Como criar um especfile.
- Como construir um pacote de rpm.
Requisitos de software e convenções usadas
Categoria | Requisitos, convenções ou versão de software usada |
---|---|
Sistema | Fedora 29 |
Programas | N / D |
Outro | Acesso privilegiado ao seu sistema Linux como raiz ou através do sudo comando para instalar os pacotes necessários. |
Convenções | # - requer que os comandos Linux sejam executados com privilégios root diretamente como usuário root ou por uso de sudo comando$ - Requer que os comandos do Linux sejam executados como um usuário não privilegiado regular |
RPM Conceitos básicos
Instalando, removendo, atualizando (em uma palavra, gerenciamento) o software é uma tarefa essencial em todos os sistemas operacionais. Quando os gerentes de pacotes não eram uma coisa, a única maneira de instalar um programa era compilar seu código -fonte e colocar os arquivos resultantes nos locais apropriados no sistema de arquivos. Manter o controle das dependências de cada pedaço de código foi realmente difícil e demorado. Em seguida, os gerentes de pacotes foram introduzidos, e tudo ficou mais fácil.
Atualmente, cada distribuição moderna do Linux tem, hoje em dia, seu gerente de pacotes: Debian e seus derivativos usam dpkg
, enquantoRPM
é usado na família Red Hat de Distribuições. O software é fornecido pré-compilado sob a forma de pacotes
, que são basicamente arquivos compactados contendo metadados sobre a versão de software, suas dependências e possíveis conflitos com outros pacotes.
Neste tutorial, veremos como criar um pacote de rpm a partir de um código -fonte do aplicativo. O aplicativo que embalaremos é Feh
, Um visualizador de imagem simples da linha de comando: é muito pequeno e tem poucas dependências. Antes de começar a construir nosso primeiro pacote, existem, no entanto, alguns conceitos essenciais que devemos entender.
O ambiente de construção
A raiz de uma árvore de ambiental de construção de RPM é a rpMbuild
Diretório, que contém 6 subdiretos: CONSTRUIR
, BuildRoot
, Rpms
, FONTES
, Especificações
e Srpms
. Veremos como é possível gerar esse ambiente lançando um comando simples; Por enquanto, vamos mencionar o papel desses diretórios. Aqui está uma representação da árvore de trabalho:
rpmbuild |- build |- buildroot |- rpms |- fontes |- especificações |- srpms
Cada um desses diretórios tem um papel específico no processo de construção:
- O
CONSTRUIR
Diretório é onde o código -fonte do programa que queremos embalar é construído - O
BuildRoot
O diretório é onde os arquivos resultantes da compilação do software dentro do diretório de compilação são copiados, refletindo a estrutura do sistema de destino dentro de um subdiretório com o pacote Mame:
No nosso caso, o binário "Feh" que seria instalado em/usr/bin
será relatado como BuildRoot/Feh-3.0-1.FC29.x86_64/usr/bin. - O
Rpms
diretório, é ondeRPM
Os pacotes são gerados: cada RPM será colocado em um subdiretório
nomeado após sua arquitetura, ou,Noarch
Se não for específico da arquitetura. - O
FONTES
O diretório hospeda o código -fonte compactado do software que queremos empacotar, geralmente sob a forma de um tarball de um arquivo zip. - O
Especificações
diretório, é onde colocamos o.espec
Arquive com as instruções para construir nosso pacote: analisaremos a estrutura deste arquivo em um momento. - O
Srpms
O diretório é o equivalente a RPMs, mas para RPMs de origem. Esses pacotes especiais contêm o código fonte original do aplicativo, os patches eventuais e o especfile usado para construir o pacote.
O arquivo de especificações
O arquivo em que todas as instruções e informações necessárias para criar um pacote de rpm são definidas é o .espec
arquivo. Um specfile contém, entre as outras coisas, o construir dependências
(o software necessário para compilar o programa que queremos empacotar), o dependências de tempo de execução
(As bibliotecas necessárias para o programa executar corretamente) e os omoms que devem ser executados para compilar o software.
O arquivo é composto por duas macro-seções: A preâmbulo
e a corpo
. Em cada uma dessas seções, diferentes instruções podem ser especificadas. Vamos ver alguns deles. O preâmbulo
A seção pode conter as seguintes instruções:
-
- Nome: O nome da base do pacote (isso deve corresponder ao nome do arquivo de especificações)
- Versão: A versão upstream do software embalado
- Liberar: O número de liberação do pacote
- Licença: A licença usada para o software que queremos empacotar
- Url: O URL a montante do software
- Fonte0: O URL direto ou o caminho do código -fonte compactado do software (Tarball ou Arquivo Zippeado)
- BuildArch: A arquitetura do pacote: se nenhuma arquitetura for especificada, o do sistema host será usado
- BuildRequires: As dependências necessárias para construir o software
- Requer: As dependências necessárias para executar o software
O corpo
A seção do specFile, normalmente contém as seguintes seções:
- %descrição: Uma descrição opcionalmente multi-line do software embalado
- %preparação: Os comando (s) necessários para preparar o código -fonte (por exemplo, os comandos necessários para extrair um tarball)
- %construir: Os comando (s) necessário para construir o software
- %instalar: Os comando (s) precisavam copiar o arquivo resultante do processo de construção para o
BuildRoot
diretório - %arquivos: A lista dos arquivos fornecidos pelo pacote, que serão instalados no sistema
Macros
Para facilitar nosso trabalho, dentro de um specFile, podemos usar algumas macros que vamos referenciar muitas coisas úteis e executar automaticamente determinadas tarefas. Primeiro de tudo, temos o Macros do diretório RPM
que permitem que o uso de referência nos diretórios de nosso ambiente de construção; Devemos sempre usá -los em vez de caminhos diretos:
- %_ topdir: Esta macro referencia o
rpMbuild
diretório - %_ BuildDir: Referências o
CONSTRUIR
diretório dentro de nossa árvore de construção - %_ rpmdir: Referências o caminho do
Rpms
diretório - %_ Sourcedir: Esta macro é avaliada no caminho do
FONTES
diretório - %_ specdir: Uma macro que representa o caminho do
Especificações
diretório - %_ srcrpmdir: Referências o caminho de
Srpms
diretório - %_ Buildrootdir: Referências o caminho do
BuildRoot
diretório
Outras macros vamos referenciar os diretórios mais importantes no sistema de arquivos de nossa máquina, por exemplo:
- %_ sysconfigdir: O
/etc
diretório - %_prefixo: O
/usr
diretório - %_ bindir: O
/usr/bin
diretório - %_ mandir: O caminho para o
/usr/share/homem
diretório
O acima, não é uma lista completa, mas lhe dá uma ideia. Além disso, também podemos usar um conjunto de macros que executam tarefas específicas. Para expandir a definição de uma macro e, para ver seu conteúdo, podemos usar o RPM --eval
comando, que toma a macro como seu argumento. Aqui estão alguns exemplos de macros usadas com frequência:
- O
%configurar
macro, é usado no%config
A seção do especfile e basicamente executa as seguintes ações:- Extrai o código -fonte do programa que queremos empacotar para o
BuildDir
diretório - Muda para o diretório extraído
- Define as permissões de arquivo apropriadas dentro dele
- Extrai o código -fonte do programa que queremos empacotar para o
- O
%make_build
Macro é usado no%construir
seção do especfile e basicamente executa ofazer
comando com um conjunto de opções predefinidas, para compilar o código -fonte do software. Se expandirmos, podemos verificar o comando que ele é executado:$ rpm --eval "%make_build"/usr/bin/make -o -j4
- O
%make_install
Macro, em vez disso, é usado no%instalar
seção do arquivo e executafaça instalar
com oDestdir
Parâmetro, usado para instruir o comando para instalar os arquivos compilados relativamente a um determinado diretório em vez do sistema real/
:$ rpm --eval "%make_install"/usr/bin/faça instalar destdir =/home/egdoc/rpmbuild/buildroot/%name-%versão-%release.x86_64 install = "/usr/bin/install -p"
Como criar um pacote de rpm passo a passo instruções
Agora que aprendemos o conceito básico do processo de criação de pacotes, podemos ver como criar nosso ambiente de construção e nosso primeiro pacote de RPM. Vamos criar nosso pacote.
Instale as dependências de construção
Como primeira coisa, precisamos instalar rpmdevTools
, Além das dependências necessárias para construir Feh
:
$ sudo dnf install rpmdevTools gcc faça imlib2-devel libjpeg-devel libpng-devel libxt-devel libxinerama-devel libexif-devel \ perl-teste-command perl-harness harness libcurl-desvelo
Depois que os pacotes forem instalados, podemos gerar nosso ambiente de construção. Tudo o que precisamos fazer é lançar o seguinte comando:
$ rpmdev-setuptree
Neste ponto rpMbuild
diretório, e todos os subdiretos que vimos antes, devem ser criados. O próximo passo é escrever nosso specFile.
Crie o especfile
Criamos o especfile com nosso editor de texto favorito e salvamos no Especificações
diretório com o mesmo nome do pacote. Aqui está como um specFile mínimo deve parecer:
Nome: FEH Versão: 3.0 liberação: 1%?Dist Resumo: Visualizador de imagem da linha de comando rápido usando o IMLIB2 Licença: MIT URL: http: // feh.finalrewind.Org Source0: http: // feh.finalrewind.org/feh-%versão.alcatrão.Bz2 BuildRequis: GCC BuildRequiss: IMLIB2-DEVEL BuildRequises: Libcurl-Devel BuildRequis: Libjpeg-devel BuildRequis: Libpng-Devel BuildRequieres: Libxt-DevelRequires: LibxineReMerReSirReSirReRequires: Libxt-DevelRequires: LibxineReMerReSirReSirReSirSirSiresIres: Teste -Harness %Descrição Visualizador de imagem da linha de comando rápido usando imlib2 %prepare /usr/bin/feh-3.0-1.FC29.x86_64.Debug/usr/share/aplicações/feh.Desktop/usr/share/doc/feh/autores/usr/share/doc/feh/changelog/usr/share/doc/feh/readme.md/usr/share/doc/feh/todo/usr/share/doc/feh/exemplos/botões/usr/share/doc/feh/exemplos/find-lowres/usr/share/doc/feh/exemplos/keys/ usr/share/doc/feh/exemplos/temas/usr/share/feh/fonts/preto.estilo/usr/share/feh/fontes/menu.estilo/usr/share/feh/fontes/yudit.ttf/usr/share/feh/imagens/feh.png/usr/share/feh/imagens/feh.svg/usr/share/feh/imagens/menubg_default.png/usr/share/icons/hicolor/48x48/apps/feh.png/usr/share/icons/hicolor/scalable/apps/feh.svg/usr/share/man/man1/feh.1.gz
Vamos analisar. Primeiro, especificamos algumas informações básicas sobre o software que queremos empacotar: seu nome e versão upstream, sua licença, a localização da página principal do projeto e o link direto para o código -fonte Tarball, depois declaramos o construir dependências
usando BuildRequires
. A lista de dependências pode ser representada como um espaço ou vírgula em linha em linha, mas, por uma questão de legibilidade, declaramos uma dependência por linha, repetindo o BuildRequires
instrução.
Depois de declarar as dependências necessárias para construir o software, fornecemos uma breve descrição no %descrição
seção, e depois prosseguiu para a parte mais importante do especfile: as instruções para preparar, construir e instalar o software, respectivamente no %preparação
, %construir
e %instalar
Seções.
No %preparação
seção, fornecendo o %Configuração -q
Macro já foi suficiente: como dito antes, essa macro executará os comandos necessários para descompactar o tarball de origem e colocar o diretório extraído no CONSTRUIR
pasta.
O %construir
Seção é onde especificamos os comandos que devem ser executados para construir o código -fonte. Mesmo aqui, tudo o que tínhamos que usar era apenas o %make_build
macro, que executa o fazer
Comando com as opções que vimos antes, no diretório que hospeda o código -fonte descompactado do aplicativo que queremos empacotar.
No %instalar
Seção, usamos outra macro, %make_install
, fornecendo também o PREFIXO
parâmetro, configurando -o para %_prefixo
, que será expandido para /usr
. O comando resultante causará os arquivos produzidos pela compilação do código -fonte, a serem colocados na "raiz falsa", definida com o Destdir
parâmetro contido na macro. Desde que no %make_install
Macro, "Destdir" está definido como /home/egdoc/rpmbuild/buildroot/%name-%versão-%release.x86_64
, Os arquivos serão instalados em: /home/egdoc/rpmbuild/buildroot/%name-%versão-%release.x86_64/usr
.
Finalmente, fornecemos, no %arquivos
Seção, uma lista dos arquivos que serão instalados pelo nosso pacote. Esta lista pode ser posteriormente inspecionada executando o RPM -QLP/PATH/TO/O/RPM
comando ou, se o pacote já estiver instalado, simplesmente executando RPM -QL Packagename
.
Obtenha as fontes e construa o pacote RPM
Agora que nosso arquivo de especificações está finalmente pronto, podemos construir nosso RPM
. Você pode notar que ainda não baixamos o tarball de origem de "feh": não há necessidade de fazer isso manualmente, pois podemos usar o SpectCool
comando:
$ SPECTOOL -G -R ~/RPMBUILD/Specs/Feh.especificando http: // feh.finalrewind.org/feh-3.0.alcatrão.bz2 para/home/egdoc/rpmbuild/fontes/feh-3.0.alcatrão.Bz2 % % % % recebeu % xferd de velocidade média tempo tempo de upload de upload dargas de d Total Speed esquerda 100 185 100 185 0 0 898 0-:-:-:-:--:-:- -898 100 2057K 100 2057K 0 0 1988K 0 0:00:01 0:00:01-:-:-4191k
Este comando baixará as fontes que referenciamos com um URL dentro do especfile, no diretório apropriado de nossa árvore de trabalho: ~/rpmbuild/fontes
. Com as fontes em vigor, podemos construir nosso RPM: tudo o que precisamos fazer é lançar o rpMbuild
comando e forneça o caminho para o especfile. Quando lançado com o -bb
opção, o rpmbuild construirá apenas um pacote binário
: se queremos gerar também um RPM de origem
, devemos usar -BA
em vez.
Uma coisa muito importante a lembrar é que o comando rpMbuild nunca deve ser lançado com permissões raiz: ao fazê -lo, mesmo um simples erro no especfile pode produzir efeitos indesejados em nosso sistema. Vamos executar rpmbuild:
$ rpmbuild -bb ~/rpmbuild/specs/feh.espec
A saída das operações executadas será impressa na tela e, se tudo correr como o esperado, o pacote RPM será gerado dentro do Rpms
diretório.
Conclusões
Neste tutorial, aprendemos os conceitos fundamentais envolvidos na criação de um pacote de RPM. Aprendemos algumas macros e como construir um .espec
arquivo, que contém todas as instruções necessárias para o processo de construção. Também fornecemos um exemplo real, construção e embalagem Feh
, um visualizador de imagem de linha de comando simples. Sugiro que você consulte o guia oficial de embalagem Red Hat para expandir ainda mais os conceitos mencionados neste tutorial.
Tutoriais do Linux relacionados:
- Uma introdução à automação, ferramentas e técnicas do Linux
- Coisas para instalar no Ubuntu 20.04
- Mastering Bash Script Loops
- Mint 20: Melhor que o Ubuntu e o Microsoft Windows?
- Coisas para fazer depois de instalar o Ubuntu 20.04 fossa focal linux
- Como atualizar o CentOS
- Download do Linux
- Ubuntu 20.04 Guia
- Como migrar de CentOS para Almalinux
- Arquivos de configuração do Linux: os 30 primeiros mais importantes