Más consejos para empaquetar su software Linux con RPM

Si está usando Red Hat Enterprise Linux (RHEL) o Fedora, pronto se encontrará usando dnf (Donde yum) para instalar paquetes de software. Red Hat Package Manager (RPM) es la herramienta de administración de software más importante en estas distribuciones de Linux. Este artículo muestra cómo puede aprovechar este marco para distribuir sus propias aplicaciones.

Espero que haya tenido la oportunidad de leer el artículo de Valentin Bajrami sobre el mismo tema. Voy a repetir algunos de los mismos conceptos aquí e ilustrar algunos problemas con los que te puedes encontrar en el camino. También usaré dos ejemplos más complejos e identificaré algunos problemas que puede descubrir al empaquetar aplicaciones nativas.

Este artículo le muestra cómo determinar cómo compilar y empaquetar su propia aplicación nativa para su distribución. En un artículo de seguimiento, explicaré cómo empaquetar aplicaciones de terceros que no tienen un paquete RPM o, si lo tienen, desea personalizarlas.

Los requisitos previos incluyen:

  • Tiene conocimientos básicos sobre el uso de RPM para solicitar paquetes y instalar o quitar paquetes Si no es así, primero familiarícese con estos conceptos y luego vuelva aquí para divertirse.
  • Tiene instalados Make, Git, GCC y Java, ya que los necesitará para completar los ejercicios que se incluyen aquí. No es obligatorio, pero sería bueno que practicaras a medida que avanzo.

Para instalar Make, GCC, Java 11 y Git usando el DNF administrador de paquetes, ejecute:

$ sudo dnf install 
make gcc-10 java-11-openjdk-headless git
Índice

Empaquete su propio software usando RPM

Este artículo utiliza un pequeño proyecto de código abierto llamado jdumpertools para este paso.

En su terminal Linux, clone jdumpertools luego compílelo (ha instalado Make y el compilador GCC, ¿no es así?):

$ git clone [email protected]:josevnz/jdumpertools.git
$ cd jdumpertools
$ make all

$ ls -l jdu jutmp *.so
-rwxrwxr-x 1 josevnz josevnz 32728 Oct  3 16:40 jdu
-rwxrwxr-x 1 josevnz josevnz 32752 Oct  3 16:40 jutmp
-rwxrwxr-x 1 josevnz josevnz 29024 Oct  3 16:40 libjdumpertools.so

Luego puede ejecutar uno de los programas generados. Por ejemplo, intente jdu (una versión más simple de du comando que imprime los resultados en formato JSON):

$ LD_LIBRARY_PATH=$PWD $PWD/jdu /
[{"partition": "/", "free_space": 462140129280.000000, "total_space": 510405902336.000000}]

Hasta aquí todo va bien.

el jdumpertools.spec El archivo en este directorio es el archivo de especificaciones RPM que controla cómo compilar y empaquetar jdumpertools utilizando RPM.

A continuación, instale algunas herramientas de soporte antes de continuar con la creación del archivo RPM.

Instalar bloques de construcción RPM

Toma lo que necesites rpmdevtools utilidades ejecutando:

$ sudo dnf install rpm-build rpmdevtools

Luego prepare la caja de arena para crear RPM usando rpmdevtools. Nunca use root para este paso, sino su cuenta Linux personal o de desarrollador (pasará el -d indicador de depuración):

$ rpmdev-setuptree -d
josevnz       /home/josevnz    /home/josevnz/.rpmmacros
/home/josevnz/rpmbuild/RPMS    /home/josevnz/rpmbuild/SOURCES     /home/josevnz/rpmbuild/SPECS
/home/josevnz/rpmbuild/SRPMS   /home/josevnz/rpmbuild/BUILD

Aquí hay una mejor vista:

$ tree ~/rpmbuild
/home/josevnz/rpmbuild
├── BUILD
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS

5 directories, 0 files

Por ahora, solo debes prestar atención a dos directorios: SOURCES y SPECS. Más adelante explicaré los demás.

También hay un nuevo archivo llamado ~/.rpmmacros. Puedes poner o reemplazar algunos macros especiales allí para evitar tareas repetitivas al crear paquetes RPM. Este archivo es importante porque ancla el rpmbuild entorno con su directorio de inicio.

Empaqueta tu aplicación

Primero, crea un tar archivo de código fuente en el ~/rpmbuild/SOURCES directorio telefónico:

VERSION=v0.1
NAME=jdumpertools
TARFILE=$(NAME)-$(VERSION).tar.gz
/usr/bin/tar --exclude-vcs --directory ../ --create --verbose --gzip --file $(HOME)/rpmbuild/SOURCES/$(TARFILE) $(NAME)

Normalmente el tar contiene scripts y código fuente que compilará en el proceso de empaquetado.

Luego crea un RPM spec archivar. De nuevo, rpmdevtools proporciona una ventaja inicial, como esta:

$ rpmdev-newspec ~/rpmbuild/jose-package.spec
/home/josevnz/rpmbuild/jose-package.spec created; type minimal, rpm version >= 4.16.

$ cat  ~/rpmbuild/jose-package.spec
Name:           jose-package
Version:        
Release:        1%{?dist}
Summary:        

License:        
URL:            
Source0:        

BuildRequires:  
Requires:       

%description

%prep
%autosetup

%build
%configure
%make_build

%install
rm -rf $RPM_BUILD_ROOT
%make_install


%files
%license add-license-file-here
%doc add-docs-here

%changelog
* Sun Oct 03 2021 Jose Vicente Nunez <[email protected]>
- 

No se preocupe si no puede descifrar este archivo ahora. Cópialo jdumpertools.spec archivo a ~/rpmbuild/SPECS directorio telefónico:

$ cp -pv jdumpertools.spec ~/rpmbuild/SPECS

Y cree una fuente y un archivo RPM binario:

$ rpmbuild -ba rpmbuild/SPECS/jdumpertools.spec
setting SOURCE_DATE_EPOCH=1609718400
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.kBlIwO
+ umask 022
+ cd /home/josevnz/rpmbuild/BUILD
+ cd /home/josevnz/rpmbuild/BUILD
+ rm -rf jdumpertools
+ /usr/bin/gzip -dc /home/josevnz/rpmbuild/SOURCES/jdumpertools-v0.1.tar.gz
+ /usr/bin/tar -xof -
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd jdumpertools
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ RPM_EC=0
[...]
Checking for unpackaged file(s): /usr/lib/rpm/check-files /home/josevnz/rpmbuild/BUILDROOT/jdumpertools-v0.1-1.fc33.x86_64
Wrote: /home/josevnz/rpmbuild/SRPMS/jdumpertools-v0.1-1.fc33.src.rpm
Wrote: /home/josevnz/rpmbuild/RPMS/x86_64/jdumpertools-v0.1-1.fc33.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.uEyCyL
+ umask 022
+ cd /home/josevnz/rpmbuild/BUILD
+ cd jdumpertools
+ rm -rf /home/josevnz/rpmbuild/BUILDROOT/jdumpertools-v0.1-1.fc33.x86_64
+ RPM_EC=0
++ jobs -p
+ exit 0

El resultado final son dos archivos: uno Fuente RPM y un RPM binario.

Wrote: /home/josevnz/rpmbuild/SRPMS/jdumpertools-v0.1-1.fc33.src.rpm
Wrote: /home/josevnz/rpmbuild/RPMS/x86_64/jdumpertools-v0.1-1.fc33.x86_64.rpm

Qué sucede durante una instalación de RPM

Entonces, ¿qué sucede cuando instala cada uno de sus RPM personalizados?

  1. La instalación del RPM de origen crea el tar archivo y el spec archivo en su rpmbuild directorio telefónico. Esto le permite recompilar la aplicación, hacer correcciones al RPM spec archivo, etc.
    $ ls rpmbuild/{SPECS,SOURCES}
    rpmbuild/SOURCES:
    jdumpertools-v0.1.tar.gz
    
    rpmbuild/SPECS:
    jdumpertools.spec
  2. Si instala el RPM binario, en realidad instala la aplicación:
    $ sudo rpm -ihv ~/rpmbuild/RPMS/x86_64/jdumpertools-v0.1-1.fc33.x86_64.rpm
    Verifying...                ################ [100%]
    Preparing...                ################ [100%]
    Updating / installing...
       1:jdumpertools-v0.1-1.fc33  ################ [100%]
  3. Confirme que el paquete instalado está presente:
    $ rpm -qi jdumpertools
    Name        : jdumpertools
    Version     : v0.1
    Release     : 1.fc33
    Architecture: x86_64
    Install Date: Sun 03 Oct 2021 06:32:50 PM EDT
    Group       : Unspecified
    Size        : 95002
    License     : Apache License 2.0
    Signature   : (none)
    Source RPM  : jdumpertools-v0.1-1.fc33.src.rpm
    Build Date  : Sun 03 Oct 2021 06:27:11 PM EDT
    Build Host  : dmaf5.home
    URL         : https://github.com/josevnz/jdumpertools
    Summary     : Programs that can be used to dump Linux usage data in JSON format.
    Description :
    
    Jdumpertools is a collection of programs used to dump Linux usage data in JSON format to be ingested by other tools.
    
    * jdu: Similar to UNIX 'du' command.
    * jutmp: UTMP database dumper

Notar: Los lectores curiosos probablemente han abierto el Makefile y vi un objetivo llamado rpm:

rpm: all
    test -x /usr/bin/rpmdev-setuptree && /usr/bin/rpmdev-setuptree|| /bin/mkdir -p -v ${HOME}/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
    /usr/bin/tar --exclude-vcs --directory ../ --create --verbose --gzip --file $(HOME)/rpmbuild/SOURCES/$(TARFILE) $(NAME)
    /usr/bin/rpmbuild -ba jdumpertools.spec

Este es un atajo útil para preparar un rpmbuild cajón de arena, tar archivos después de ser compilados con makey empaquetarlos usando el rpmbuild pedido. No dudes en llamarme make rpm y mira lo que pasa.

[ Get more tips by downloading the Bash shell scripting cheat sheet. ]

Te mostré los comandos y herramientas que se utilizan para Produce archivos RPM, pero ahora es el momento de escribir las RPM spec archivar.

Cree un archivo de especificación para herramientas jdumper

Trabajar con archivos de especificación requiere completar varias etiquetas de metadatos, así como describir cómo va a compilar o empaquetar la aplicación. Jdumpertools es una aplicación ANSI C simple, así que descomprima las fuentes, compílelas, cópielas en un área de preparación (~/rpmbuild/BUILDROOT), luego empaquetarlos para su distribución.

Primero, eche un vistazo a las RPM archivo de especificaciones:

Name:           jdumpertools
# TODO: Figure out a better way to update version here and on Makefile
Version:        v0.1        
Release:        1%{?dist}
Summary:        Programs that can be used to dump Linux usage data in JSON format. 

License:        Apache License 2.0
URL:            https://github.com/josevnz/jdumpertools
Source0:        %{name}-%{version}.tar.gz

BuildRequires:  bash,tar,gzip,rpmdevtools,rpmlint,make,gcc >= 10.2.1
Requires:       bash

%global debug_package %{nil}

%description

Jdumpertools is a collection of programs you can use to dump Linux usage data in JSON format to be ingested by other tools.

* jdu: Similar to UNIX 'du' command.
* jutmp: UTMP database dumper

%prep
%setup -q -n jdumpertools

%build
make all

%install
rm -rf %{buildroot}
/usr/bin/mkdir -p %{buildroot}/%{_bindir}
/usr/bin/cp -v -p jdu jutmp %{buildroot}/%{_bindir}
/usr/bin/mkdir -p %{buildroot}/%{_libdir}
/usr/bin/cp -v -p libjdumpertools.so %{buildroot}/%{_libdir}

%clean
rm -rf %{buildroot}

%files
%{_bindir}/jdu
%{_bindir}/jutmp
%{_libdir}/libjdumpertools.so
%license LICENSE
%doc README.md


%changelog
* Mon Jan  4 2021 Jose Vicente Nunez <[email protected]> - 0.1
- First version being packaged

Revisa lo que es importante aquí:

  • Metadatos, incluida la versión, el nombre y Source0; puedes usar variables o macros
  • Descomprima las fuentes en el %prep sección usando el %setup macro (la guía RPM tiene muchos detalles sobre las banderas)
  • ConstruirRequiere: debe enumerar las dependencias que necesita para construir el paquete. Estos no se pueden detectar dinámicamente.
  • %para construir sección: Compilar con make
  • %instalar sección: Copia lo que necesitas para que el programa funcione (programa, bibliotecas, etc.)
  • %archivos sección: donde puede especificar si un archivo es un documento (% Doc), archivo de licencia (% Licencia), o un archivo ordinario

También es importante :

  • Deshabilité la creación de código de depuración al empaquetar con %global debug_package %{nil}.
  • el changelog documenta lo que ha cambiado con esta nueva versión del paquete.

Compruebe si hay errores en el archivo de especificaciones con rpmlint

No querrá descubrir por las malas que su RPM no es perfecto. Por lo tanto, es bueno verificar errores obvios o formas de mejorar sus RPM:

$ sudo dnf install rpmlint

Ahora revisa las RPM spec archivar:

$ rpmlint /home/josevnz/rpmbuild/SPECS/jdumpertools.spec 
/home/josevnz/rpmbuild/SPECS/jdumpertools.spec: W: invalid-url Source0: jdumpertools-v0.1.tar.gz
0 packages and 1 specfiles checked; 0 errors, 1 warnings.

Documentación de Rpmlint dilo Fuente0 debe ser una URL bien definida (el valor debe ser una URL pública HTTP, HTTPS o FTP válida). No te preocupes por esta advertencia.

¿Qué pasa con el propio RPM?

$ make rpm
...
$ rpmlint --info ~/rpmbuild/RPMS/x86_64/jdumpertools-v0.2-1.fc33.x86_64.rpm
jdumpertools.x86_64: W: summary-ended-with-dot C Programs that can be used to dump Linux usage data in JSON format.
jdumpertools.x86_64: W: spelling-error %description -l en_US du -> dew, doe, Du
jdumpertools.x86_64: E: description-line-too-long C Jdumpertools is a collection of programs that can be used to dump linux usage data in JSON format, so it can be ingested by other tools.
jdumpertools.x86_64: W: incoherent-version-in-changelog 0.1 ['v0.1-1.fc33', 'v0.1-1']
jdumpertools.x86_64: W: invalid-license Apache License 2.0
jdumpertools.x86_64: W: unstripped-binary-or-object /usr/bin/jdu
jdumpertools.x86_64: W: unstripped-binary-or-object /usr/bin/jutmp
jdumpertools.x86_64: W: unstripped-binary-or-object /usr/lib64/libjdumpertools.so
jdumpertools.x86_64: W: no-soname /usr/lib64/libjdumpertools.so
jdumpertools.x86_64: W: no-manual-page-for-binary jdu
jdumpertools.x86_64: W: no-manual-page-for-binary jutmp
1 packages and 0 specfiles checked; 1 errors, 10 warnings.

Diez advertencias y un error. Algunos son fáciles de arreglar:

  • La licencia debe ser una formato
  • Se requieren páginas de manual para los programas, así que escribí uno muy simple con troff
  • Incluir la apellido en la biblioteca

Después de las correcciones, solo queda una advertencia:

$ make rpm
...
$ rpmlint --info ~/rpmbuild/RPMS/x86_64/jdumpertools-v0.2-1.fc33.x86_64.rpm 
jdumpertools.x86_64: W: spelling-error %description -l en_US du -> dew, doe, Du
The value of this tag appears to be misspelled. Please double-check.

Esta advertencia le advierte que la palabra du parece estar mal escrito. Es solo una referencia a un comando válido, por lo que puede ignorar la advertencia.

Ahora actualice el RPM con la versión mejorada:

$ sudo rpm -Uhv ~/rpmbuild/RPMS/x86_64/jdumpertools-v0.2-1.fc33.x86_64.rpm

Yo uso el rpm comando para que sea más obvio que actualicé el paquete desde una versión de disco local en lugar de una nueva versión desde un repositorio. Si lo prefieres, puedes hacer lo mismo con dnf:

$ sudo dnf install --upgrade 
~/rpmbuild/RPMS/x86_64/jdumpertools-v0.2-1.fc33.x86_64.rpm

Lo que has aprendido y lo que sigue

Empaquetar software con RPM parece intimidante al principio, pero con un poco de paciencia lo logrará en poco tiempo. A medida que encuentre problemas, también encontrará formas adecuadas de mejorar su código. Aquí hay algunos recursos y recomendaciones finales:

  • Hágase un gran favor y obtenga una copia del Guía de empaque RPM escrito por Adam Miller, Maxim Svistunov y Marie Doleželová. Es muy completo y bien organizado. En serio, hazlo ahora; es tan bueno
  • el Guía oficial de embalaje de RPM y el RPM de Fedora guía también están llenos de detalles; manténgalos alejados de un marcador.
  • Usar RPMlint. Se sorprenderá de la cantidad de pequeñas cosas que puede agarrar y arreglar antes de enviar sus paquetes RPM.
  • ¿No demasiado? Fedora tiene un lista de consejos puede utilizar al empaquetar el software.
  • ¿Todavía tienes curiosidad? Definitivamente deberías echar un vistazo a Pautas de empaque RPM.


Si quieres conocer otros artículos similares a Más consejos para empaquetar su software Linux con RPM puedes visitar la categoría Linux.

Artículos de interés

Subir

Si continuas utilizando este sitio aceptas el uso de cookies. Más información