GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo crear un paquete RPM de Linux

Este artículo le muestra cómo empaquetar un script en un archivo RPM para una fácil instalación, actualización y eliminación de sus sistemas Linux. Antes de pasar a los detalles, explicaré qué es un paquete RPM y cómo puede instalarlo, consultarlo, eliminarlo y, lo que es más importante, crear uno usted mismo.

Este artículo cubre:

  • Qué es un paquete RPM.
  • Cómo crear un paquete RPM.
  • Cómo instalar, consultar y eliminar un paquete RPM.

¿Qué es un paquete RPM?

RPM significa Administrador de paquetes de Red Hat . Fue desarrollado por Red Hat y se usa principalmente en sistemas operativos Linux basados ​​en Red Hat (Fedora, CentOS, RHEL, etc.).

Un paquete RPM usa el .rpm extensión y es un paquete (una colección) de diferentes archivos. Puede contener lo siguiente:

  • Archivos binarios, también conocidos como ejecutables (nmap , stat , xattr , ssh , sshd , etc.).
  • Archivos de configuración (sshd.conf , updatedb.conf , logrotate.conf , etc.).
  • Archivos de documentación (README , TODO , AUTHOR , etc.).

El nombre de un paquete RPM sigue este formato:

<name>-<version>-<release>.<arch>.rpm

Un ejemplo:

bdsync-0.11.1-1.x86_64.rpm

Algunos paquetes también incluyen una versión abreviada de la distribución para la que fueron creados, como:

bdsync-0.11.1-1.el8.x86_64.rpm

[ También puede disfrutar: Administración de paquetes de Linux con YUM y RPM ]

Cómo crear un paquete RPM

Necesitará los siguientes componentes para crear un paquete RPM:

  • Una estación de trabajo o una máquina virtual que ejecuta una distribución basada en RPM, como RHEL o Fedora.
  • Software para construir el paquete.
  • Código fuente del paquete.
  • Archivo SPEC para construir el RPM.

Instalación del software necesario

Es necesario instalar los siguientes paquetes para compilar el paquete RPM:

$ sudo dnf install -y rpmdevtools rpmlint

Después de instalar rpmdevtools , cree el árbol de archivos que necesita para crear paquetes RPM:

$ rpmdev-setuptree

Usted construye paquetes RPM como un usuario normal (no root), por lo que su entorno de construcción se coloca en su directorio de inicio. Contiene esta estructura de directorio:

rpmbuild/
├── BUILD
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS
  • La CONSTRUCCIÓN El directorio se utiliza durante el proceso de compilación del paquete RPM. Aquí es donde se almacenan, mueven, etc. los archivos temporales.
  • El RPMS El directorio contiene paquetes RPM creados para diferentes arquitecturas y noarch si se especifica en .spec archivo o durante la compilación.
  • Las FUENTES El directorio, como su nombre lo indica, contiene fuentes. Esto puede ser un script simple, un proyecto C complejo que necesita compilarse, un programa precompilado, etc. Por lo general, las fuentes se comprimen como .tar.gz o .tgz archivos.
  • Las ESPECIFICACIONES directorio contiene el .spec archivos El .spec El archivo define cómo se construye un paquete. Más sobre eso más adelante.
  • El SRPMS directorio contiene el .src.rpm paquetes Un paquete RPM de origen no pertenece a una arquitectura o distribución. El .rpm real la compilación del paquete se basa en .src.rpm paquete.

Un .src.rpm El paquete es muy flexible, porque se puede construir y reconstruir en cualquier otra distribución y arquitectura basada en RPM.

Ahora está familiarizado con lo que contiene cada directorio, así que ahora cree un script simple para distribuir:

$ cat << EOF >> hello.sh
#!/bin/sh
echo "Hello world"
EOF

Esto crea un script de shell llamado hello.sh , que imprime "Hola mundo" en la terminal. Es simple, pero es suficiente para demostrar el empaque.

Coloque el script en el directorio designado

Para construir un paquete para su secuencia de comandos, debe colocar su secuencia de comandos en el directorio en el que el sistema de compilación RPM espera que esté. Cree un directorio para él, utilizando versiones semánticas como lo hacen la mayoría de los proyectos, y luego mueva hello.sh en él:

$ mkdir hello-0.0.1
$ mv hello.sh hello-0.0.1

La mayoría del código fuente se distribuye como un archivo, así que use el comando tar para crear un archivo:

$ tar --create --file hello-0.0.1.tar.gz hello-0.0.1

Luego mueva el tarball que acaba de crear a SOURCES directorio:

$ mv hello-0.0.1.tar.gz SOURCES

Cree un archivo .spec

Un paquete RPM está definido por un .spec expediente. La sintaxis de un .spec el archivo es estricto, pero rpmdev puede generar un archivo repetitivo para usted:

$ rpmdev-newspec hello

Esto genera un archivo llamado hello.spec , que debe mover a SPECS directorio. Ejecute tree ~/rpmbuild para ver cómo se ve la estructura del directorio:

/home/tux/rpmbuild/
├── BUILD
├── BUILDROOT
├── RPMS
├── SOURCES
│   └── hello-0.0.1.tar.gz
├── SPECS
│   └── hello.spec
└── SRPMS

El hello.spec generado El archivo proporciona un buen punto de partida, pero no tiene información específica sobre lo que está creando. El .spec generado archivo asume que voy a compilar y crear software.

Está empaquetando un script Bash, por lo que puede simplificar un poco. Por ejemplo, no hay Build proceso porque no hay código para compilar. He agregado BuildArch:noarch porque este paquete es válido para 32 bits, 64 bits, Arm y cualquier otra arquitectura de CPU que ejecute Bash.

También he añadido Requiere:bash para que el paquete asegure que Bash está instalado. Este sencillo script "hola mundo" se ejecuta en cualquier shell, por supuesto, pero eso no es cierto para todos los scripts, por lo que es una buena manera de demostrar las dependencias.

Name:           hello
Version:        0.0.1
Release:        1%{?dist}
Summary:        A simple hello world script
BuildArch:      noarch

License:        GPL
Source0:        %{name}-%{version}.tar.gz

Requires:       bash

%description
A demo RPM build

%prep
%setup -q

%install
rm -rf $RPM_BUILD_ROOT
mkdir -p $RPM_BUILD_ROOT/%{_bindir}
cp %{name}.sh $RPM_BUILD_ROOT/%{_bindir}

%clean
rm -rf $RPM_BUILD_ROOT

%files
%{_bindir}/%{name}.sh

%changelog
* Sun Nov  18 2020 Valentin Bajrami <[email protected]> - 0.0.1
- First version being packaged

Como puede ver, hay muchos atajos en .spec archivos Se llaman macros y hay una excelente lista de lo que está disponible en la documentación del paquete de Fedora. Es importante usar macros en su .spec archivos Ayudan a garantizar la coherencia en todos los sistemas RPM, lo ayudan a evitar errores en los nombres de archivo y la numeración de versiones, y facilitan la actualización de .spec archivo cuando publique una nueva versión de su secuencia de comandos.

Por ejemplo, es necesario que especifique exactamente qué archivos están instalados en %files sección. Aquí he puesto explícitamente la siguiente línea:

%files
%{_bindir}/%{name}.sh

Esto funciona porque quiero que la secuencia de comandos vaya a %{_bindir} (que es una macro que se traduce como /usr/bin por defecto, pero es configurable cuando los usuarios quieren instalar en una ubicación diferente, como /usr/local/bin ). Puede verificar los valores de las macros ejecutando:

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

Otras macros útiles:

  • %{name} nombre del paquete (como se define en el Nombre: campo)
  • %{version} versión del paquete (como se define en la Versión: campo)
  • %{_datadir} datos compartidos (/usr/sbin por defecto)
  • %{_sysconfdir} directorio de configuración (/etc por defecto)

Comprobando el archivo .spec en caso de error (rpmlint)

El rpmlint El comando puede encontrar errores en .spec archivos:

$ rpmlint ~/rpmbuild/SPECS/hello.spec
SPECS/hello.spec: W: no-%build-section
SPECS/hello.spec: W: invalid-url Source0: hello-0.0.1.tar.gz
0 packages and 1 specfiles checked; 0 errors, 2 warnings.

Hay 2 errores informados, pero ambos son aceptables. No hay código para compilar, por lo que no es necesario un %build y el archivo fuente es un archivo local y no tiene URL de red.

Todo se ve bien.

Construyendo el paquete (rpmbuild)

Para compilar el paquete RPM, utilice rpmbuild dominio. Anteriormente en este tutorial, mencioné la diferencia entre .src.rpm (Paquete RPM de origen) y .rpm paquete.

Para crear el .src paquete rpm:

$ rpmbuild -bs ~/rpmbuild/SPECS/hello.spec

Las banderas -bs tienen los siguientes significados:

  • -b:construir
  • -s:fuente

Para crear el paquete binario .rpm:

$ rpmbuild -bb ~/rpmbuild/SPECS/rm-ssh-offendingkey.spec

Las banderas -bb tienen los siguientes significados:

  • -b:construir
  • -b:binario

Utilice -ba para construir ambos.

Una vez finalizado el proceso de compilación, tiene la siguiente estructura de directorios:

$ tree ~/rpmbuild/
/home/tux/rpmbuild/
├── BUILD
│   └── hello-0.0.1
│       ├── hello.sh
├── BUILDROOT
├── RPMS
│   └── noarch
│       └── hello-0.0.1-1.el8.noarch.rpm
├── SOURCES
│   └── hello-0.0.1.tar.gz
├── SPECS
│   └── hello.spec
└── SRPMS

Instalación del paquete RPM

Después de una compilación exitosa del paquete, puede instalar el paquete RPM usando el dnf comando:

$ sudo dnf install ~/rpmbuild/RPMS/noarch/hello-0.0.1-1.el8.noarch.rpm

Se puede instalar alternativamente con el rpm comando directamente:

$ sudo rpm -ivh ~/rpmbuild/RPMS/noarch/hello-0.0.1-1.el8.noarch.rpm

Verifique que el paquete se haya instalado

Para verificar que el paquete se haya instalado correctamente, ejecute el siguiente comando:

$ rpm -qi hello
Name        : hello
Version     : 0.0.1
Release     : 1
Architecture: noarch
Install Date: Mon 09 Nov 2020 01:29:51 AM CET
Group       : Unspecified
Size        : 294
License     : GPL
Signature   : (none)
Source RPM  : hello-0.0.1-1.el8.src.rpm
Build Date  : Mon 09 Nov 2020 01:08:14 AM CET
Build Host  : slimmerAI
Summary     : A simple hello world script
Description : A demo RPM build

El %registro de cambios También se puede ver la entrada de un paquete:

$ rpm -q hello --changelog
* Sun Nov 08 2020 Valentin Bajrami <[email protected]> - 0.1
- First version being packaged

Vea lo que hay en el paquete RPM

Es fácil ver qué archivos contiene un paquete RPM:

$ rpm -ql hello
/usr/bin/hello.sh

Eliminar el paquete RPM

Quitar el paquete del sistema es tan fácil como instalarlo. Puedes usar el dnf comando:

$ sudo dnf remove hello

O las rpm comando directamente:

$ sudo rpm --verbose --erase hello

Reflexiones finales

En este documento, cubrí los conceptos básicos del empaquetado, incluido cómo compilar, instalar y eliminar un paquete RPM de su sistema. El .spec El archivo puede volverse muy complicado a medida que crea software más avanzado, pero puede leer ejemplos del mundo real en repositorios de software públicos, como src.fedoraproject.org, para obtener más información.

[ Curso gratuito en línea:Descripción general técnica de Red Hat Enterprise Linux. ] 


Linux
  1. Cómo empaquetar aplicaciones de Python para Linux

  2. Cómo construir paquetes rpm

  3. Cómo crear un intercambio en Linux

  4. Cómo crear un servicio Systemd en Linux

  5. Cómo verificar la integridad del paquete rpm en Linux

Cómo crear un archivo en Linux

Cómo crear accesos directos en el escritorio de Linux

Cómo crear un alias SSH en Linux

Cómo crear un alias en Linux

Cómo crear un paquete RPM a partir de un Tarball

¿Cómo crear un paquete en WHM?