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. ]