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
.specarchivo 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.gzo.tgzarchivos. - Las ESPECIFICACIONES directorio contiene el
.specarchivos El.specEl archivo define cómo se construye un paquete. Más sobre eso más adelante. - El SRPMS directorio contiene el
.src.rpmpaquetes Un paquete RPM de origen no pertenece a una arquitectura o distribución. El.rpmreal la compilación del paquete se basa en.src.rpmpaquete.
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 <valentin.bajrami@slimmer.ai> - 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/sbinpor defecto)%{_sysconfdir}directorio de configuración (/etcpor 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 <valentin.bajrami@slimmer.ai> - 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. ]