Crear .rpm en Debian y RedHat

Linux Nivel Medio 21 de ene. de 2024

Paquetería RPM

Los paquetes RPM, son básicamente, la forma que tiene RedHat y sus derivados de empaquetar un conjunto de ficheros (aplicaciones y scripts de configuración), junto a las instrucciones básicas para resolver dependencias a la hora de instalar un fichero .rpm

En este ejemplo vamos a crear un paquete sencillo en formato .rpm, y lo vamos a construir desde Debian y/o desde RedHat o cualquiera de sus derivados.

Herramientas necesarias

Para el proceso de creación y empaquetado de un .rpm necesitamos una serie de herramientas, que debemos instalar en el equipo en que vayamos a generar los RPM. Para ello salimos a la terminal y dependiendo si se trata de un equipo con Debian o RedHat escribiremos:

S.O. Debian S.O. Redhat
sudo apt -y install rpm rpm2cpio sudo yum install rpmdevtools

Crear estructura de directorios necesaria

RedHat tiene aplicación propia para crear la estructura, en Debian usaremos un comando para realizar lo mismo:

S.O. Debian
mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
S.O. RedHat
rpmdev-setuptree

Fichero de Especificaciones

Para poder generar correctamente el RPM, el empaquetador necesita un fichero de especificaciones (.spec) en el que se le indique que acciones tiene que realizar y que dependencias tiene que satisfacer cuando vaya a instalar el programa.

S.O. RedHat
rpmdev-newspec rpmbuild/SPECS/nombre-paquete.spec

En Debian, no hay paquete que genere el .spec directamente, así que podéis crear a mano un fichero 'plantilla.spec' que nos servirá de plantilla para crear posteriormente todos los ficheros .spec que necesitemos.
Lo creamos en la ruta ~/rpmbuild/SPECS/ con el siguiente contenido:

Name:           plantilla
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
* DIA_SEMANA MES DIA AÑO usuario <usuario@email.es>
-

Si no quieres escribirlo, puedes descargarlo del siguiente enlace:

Creación de un paquete RPM sencillo

Vamos a crear un .rpm muy sencillo, para explicar algunos de los puntos y apartados que nos encontraremos dentro.

Vamos a crear un RPM que nos instale unas fuentes que necesitamos en nuestro equipo/servidor RedHat o derivado y que luego lo podamos usar en otros equipos basados en paquetería rpm.
Para este ejemplo vamos a instalar la fuente open-source Vremena.
La descargaremos desde la web de Font Libray:

Vremena
Vremena: Vremena project is a tribute to two most widespread typefaces of the early millennium — Times New Roman and Arial. The family consists of four regular weights and four italics. http://abstrkt.ru/index.php?p=freefonts# Unknown or Proprietary License. Category: Serif

Descargamos el fichero .zip y lo descomprimimos, veremos que tenemos los siguientes ficheros:

Creamos nuestro fichero SPEC con el nombre vremena-font.spec

RedHat
rpmdev-newspec rpmbuild/SPECS/vremena-font.spec

Debian (a partir de la plantilla generada)
cp ~/rpmbuild/SPECS/plantilla.spec ~/rpmbuild/SPECS/vremena-font.spec

Ahora con nuestro editor de texto favorito editamos el fichero y deberá quedar con el siguiente contenido:

Name:           vremena-font
Version:        0.1
Release:        1%{?dist}
Summary:        Vremena Font

License:        GPLv3

%description
vremena-font incluye las siguientes fuentes:
Regular Bold Bold Italic Book Book Italic Italic Medium Medium Italic

%install
mkdir -p %{buildroot}/usr/share/fonts/vremena-serif/
cp -a /home/luisgulo/vremena-serif/*otf %{buildroot}/usr/share/fonts/vremena-serif/

%post
fc-cache /usr/share/fonts/

%files
/usr/share/fonts/vremena-serif/VremenaBoldItalic.otf
/usr/share/fonts/vremena-serif/VremenaBold.otf
/usr/share/fonts/vremena-serif/VremenaBookItalic.otf
/usr/share/fonts/vremena-serif/VremenaBook.otf
/usr/share/fonts/vremena-serif/VremenaItalic.otf
/usr/share/fonts/vremena-serif/VremenaMediumItalic.otf
/usr/share/fonts/vremena-serif/VremenaMedium.otf
/usr/share/fonts/vremena-serif/VremenaRegular.otf

%changelog
* Sun Jan 21 2024 Luis GuLo <luisgulo@soloconlinux.org.es>
-

Notas sobre el fichero .spec

  • Version: Si generamos nueva versión del rpm, es necesario aumentar el valor
  • %{buildroot}: Es el directorio temporal que usa RedHat para crear el .rpm
  • %install: Proceso que se ejecuta en la instalacion del paquete.
    Siempre hay que usar rutas relativas a %{buildroot}, pues utiliza un chroot para generar la estructura previa antes de empaquetar el rpm
  • %post: Procesos (scripts, comandos)  que se ejecutan tras la instalación.
    En nuestro ejemplo tras la copia de las fuentes, necesitamos ejecutar el comando fc-cache (Font Config Caché) para que las fuentes estén disponible.
  • %files: Ficheros que queremos se proceda a su copia en la ruta destino
  • BuildRequires: Si contiene código fuente que aplicaciones necesita para compilar. En nuestro ejemplo eliminamos esa línea.
  • Requires: lista separada por comas de todos los paquetes que necesita nuestro paquete para instalarse y cumplir dependencias. En nuestro ejemplo eliminamos esta línea.

Si quieres una explicación completa de todos los apartados y opciones, puedes ver la guía oficial de RedHat en el siguiente enlace:

Empaquetado y distribución de software Red Hat Enterprise Linux 8 | Red Hat Customer Portal
Este documento describe cómo empaquetar software en un RPM. También muestra cómo preparar el código fuente para el empaquetado, y explica algunos escenarios de empaquetado avanzados, como el empaquetado de proyectos Python o RubyGems en RPM.
Guía de RedHat para paquetes RPM

Creación del RPM

Una vez que tengamos nuestro fichero SPEC, con el contenido que deseamos, tan solo hay que generar el fichero RPM, para ello abrimos un terminal y ejecutamos:

Debian y RH:

rpmbuild -ba rpmbuild/SPECS/vremena-font.spec

Esperamos a que realice todos los pasos y nos fijamos en la última línea de salida de la ejecución:

Salida de la ejecución de rpmbuild
+ exit 0

Si obtenemos un valor de cero, nuestra creación del rpm ha sido correcta, y podemos encontrar el RPM generado en rpmbuild/RPMS/<arquitectura>:

ls -1 ~/rpmbuild/RPMS/x86_64/
vremena-font-0.1-1.x86_64.rpm

Instalación del paquete RPM

En la maquina con S.O. RedHat o derivada, tan solo tienes que copiar el fichero RPM y ejecutar el siguiente comando para instalarlo:

rpm -i vremena-font-0.1-1.x86_64.rpm

NOTA: Se trata de un ejemplo sencillo.
No entramos en cómo firmar los RPMs generados o como distribuirlos a un repositorio propio de paquetería RPM.

Comprobaciones sobre el RPM

Una lista de algunos comandos útiles (desde Debian o RedHat) para gestionar el RPM que hemos generado:

Extraer contenido del RPM

mkdir contenidoRPM; cd contenidoRPM
rpm2cpio /ruta/fichero.rpm |cpio -iumd

Ver Scripts del RPM
rpm -qp --scripts /ruta/fichero.rpm

En resumen, una forma fácil de crear paquetes RPMs ya sea desde Debian GNU/Linux o desde RedHat (y derivados).

Etiquetas

Luis GuLo

🐧 SysAdmin GNU/Linux - 🐳 Docker - 🖥️ Bash Scripting - 🐪 Perl - 🐬 MySQL - 👥 Formador de TI - 👥 Formador de SysAdmin's - 💢 Ansible - ☁️ Cloud Computing - ❤️ Debian GNU/Linux