Bienvenidos a un nuevo post en ByteMind. En el caso de hoy les vamos a explicar como pueden crear su propio paquete RPM personalizado. En muchas ocasiones, y sobre todo si tenemos todavía una distribución con una versión anterior, para la que no existen todas las versiones, puede darse la ocasión de que no exista un fichero RPM mediante el cual realizar la instalación del mismo en el sistema.
Ante esta situación, se puede compilar el código e instalar dicha aplicación desde el código fuente, o se puede crear un fichero RPM a partir e dicho código fuente y utilizarlo para realizar futuras instalaciones del mismo de una forma más sencilla.
También puede darse la ocasión de que desee disponer de un paquete personalizado, ya sea por una configuración específica, un cambio en los directorios, etc.
También puede darse la ocasión de que haya creado su propia aplicación y quiera crear un fichero RPM a partir de la misma. En este tutorial, vamos a explicar como construir nuestro propio paquete a partir del código fuente de la aplicación.
Para construir dicho RPM, necesitará el código fuente de la aplicación, generalmente comprimido en un fichero .tar, y el fichero SPEC, en el cual se incluye la configuración de la aplicación para la construcción del paquete.
Durante el proceso de compilación se realizarán las siguientes tareas:
- Ejecuta los comandos y macros mencionados en la sección de preparación del archivo SPEC.
- Comprueba el contenido de la lista de archivos
- Ejecuta los comandos y las macros en la sección de compilación del archivo SPEC. Las macros de la lista de archivos también se ejecutan en este paso.
- Crea el archivo del paquete binario.
- Crea el archivo del paquete fuente (si se especifica a la hora de la creación)
Este proceso, nos generará dos ficheros rpm, uno binario y uno de fuente.
El archivo de paquete binario constará de todos los arhivos de origen junto con cualquier información adicional para la instalación o desinstalación del paquete, mientras que el paquete de fuente incluirá el fichero tar con el código fuente y el fichero SPEC utilizado para la creación del mismo.
Si es nuevo en el paquete rpm, es posible que primero desee comprender cómo usar el comando rpm para instalar, actualizar y eliminar paquetes en CentOS, RedHat o Fedora.
Índice
Instalación de rpmbuild
Para construir un archivo rpm basado en el archivo SPEC que acabamos de crear, necesitamos usar el comando rpmbuild.
El comando rpmbuild es parte del paquete rpm-build. Para instalarlo puede utilizar el siguiente comando:
1 |
# yum install rpm-build |
O mediante dnf dependiendo de la versión de su OS:
1 |
# dnf install rpm-build |
rpm-build depende de los siguientes paquetes. Si aún no los tiene instalados, el comando anterior instalará automáticamente estas dependencias adicionalmente:
1 2 3 4 |
elfutils-libelf rpm rpm-libs rpm-python |
Directorios de compilación de RPM
Por defecto, con la instalación de rpm-build se crearán automáticamente las siguientes estructuras de directorios que se utilizarán durante la compilación de RPM.
1 2 3 4 5 6 7 8 |
# ls -lF /root/rpmbuild/ total 0 drwxr-xr-x 4 root root 56 dic 20 11:30 BUILD/ drwxr-xr-x 2 root root 6 dic 20 11:36 BUILDROOT/ drwxr-xr-x 3 root root 20 dic 13 14:17 RPMS/ drwxr-xr-x 2 root root 70 dic 20 11:23 SOURCES/ drwxr-xr-x 2 root root 55 dic 20 11:30 SPECS/ drwxr-xr-x 2 root root 116 dic 20 11:36 SRPMS/ |
En caso de que no se hayan creado automáticamente puede hacerlo con el siguiente comando:
1 2 |
# cd /root/rpmbuild # mkdir BUILD BUILDROOT RPMS SOURCES SPECS SRPMS |
Nota: La estructura de directorios anterior es para CentOS, Fedora y RedHat cuando se usa el paquete rpmbuild. También puede usar el directorio /usr/src/redhat, pero debe cambiar el parámetro topdir en consecuencia durante la compilación rpm. Si está haciendo esto en SuSE Enterprise Linux, use el directorio /usr/src/packages.
Si desea usar su propia estructura de directorio en lugar de /root/rpmbuild, puede usar una de las siguientes opciones:
- Use la opción –buildroot y especifique el directorio personalizado durante el rpmbuild
- Especifique el parámetro topdir en el archivo rpmrc o en el archivo rpmmacros.
Descargar el archivo Tar de origen
A continuación, descarga el archivo tar de origen para el paquete que desea compilar y guárdelo en el directorio SOURCES.
Para este ejemplo, he usado el código fuente de la aplicación openssl. Pero, los pasos son exactamente los mismos para construir RPM para cualquier otra aplicación. Solo tiene que descargar el código fuente correspondiente para el RPM que está intentando construir.
1 2 3 4 |
# cd # wget https://ftp.openssl.org/source/old/1.1.1/openssl-1.1.1.tar.gz # ls -l openssl-1.1.1.tar.gz -rw-r--r-- 1 root root 8504602 dic 20 11:22 openssl-1.1.1.tar.gz |
Crear el archivo SPEC
En este paso, dirigimos RPM en el proceso de compilación creando un archivo de especificaciones. El archivo de especificaciones generalmente consta de las siguientes ocho secciones diferentes:
- Preamble: la sección del preámbulo contiene información sobre el paquete que se está creando y define las dependencias del paquete. En general, el preámbulo consta de entradas, una por línea, que comienzan con una etiqueta seguida de dos puntos, y luego información.
- %prep: en esta sección, preparamos el software para el proceso de creación. Cualquier compilación anterior se elimina durante este proceso y el archivo fuente (.tar) se expande, etc.
- Una cosa clave más es comprender que hay macros predefinidas disponibles para realizar varias opciones de acceso directo para construir rpm. Es posible que esté utilizando estas macros cuando intente crear paquetes complejos.
- %description: la sección de descripción generalmente contiene una descripción sobre el paquete.
- %build: esta es la sección responsable de realizar la compilación. Por lo general, la sección %build es un script sh.
- %install: la sección %install también se ejecuta como script sh al igual que %prep y %build. Este es el paso que se utiliza para la instalación.
- %files: esta sección contiene la lista de archivos que forman parte del paquete. Si los archivos no forman parte de la sección %files, no estará disponible en el paquete. Se requieren rutas completas y puede establecer los atributos y la propiedad de los archivos en esta sección.
- %clean: esta sección indica al RPM que limpie los archivos que no forman parte del área de compilación normal de la aplicación. Digamos, por ejemplo, si la aplicación crea una estructura de directorio temporal en /tmp/ como parte de su compilación, no se eliminará. Al agregar un script sh en la sección %clean, el directorio se puede eliminar una vez que se completa el proceso de compilación.
Aquí está el archivo SPEC que creé para la aplicación openssl para construir un archivo RPM.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
# cat /root/rpmbuild/SPECS/bytemind-openssl.spec Release: 1 %define openssldir /opt/bytemind-openssl %define debug_package %{nil} Summary: Secure Sockets Layer and cryptography libraries and tools Name: bytemind-openssl Version: 1.1.1 Source0: ftp://ftp.openssl.org/source/openssl-%{version}.tar.gz License: OpenSSL Group: System Environment/Libraries Provides: SSL URL: http://www.openssl.org/ Packager: ByteMind BuildRoot: /var/tmp/%{name}-%{version}-root %description The OpenSSL Project is a collaborative effort to develop a robust, commercial-grade, fully featured, and Open Source toolkit implementing the Secure Sockets Layer (SSL v2/v3) and Transport Layer Security (TLS v1) protocols as well as a full-strength general purpose cryptography library. The project is managed by a worldwide community of volunteers that use the Internet to communicate, plan, and develop the OpenSSL tookit and its related documentation. %prep %setup -q -n openssl-%{version} %build %define CONFIG_FLAGS -DSSL_ALLOW_ADH --prefix=%{openssldir} --openssldir=%{openssldir} --libdir=lib no-shared zlib-dynamic %ifarch i386 i486 i586 i686 ./Configure %{CONFIG_FLAGS} linux-elf %endif %ifarch ppc ./Configure %{CONFIG_FLAGS} linux-ppc %endif %ifarch alpha ./Configure %{CONFIG_FLAGS} linux-alpha %endif %ifarch x86_64 ./Configure %{CONFIG_FLAGS} linux-x86_64 %endif LD_LIBRARY_PATH=`pwd` make %install make DESTDIR=%{buildroot} install %files %{openssldir} %defattr(0644,root,root,0755) %config %{openssldir}/*.cnf %post ldconfig %postun ldconfig %clean rm -rf $RPM_BUILD_ROOT |
En la sección %build, en nuestro caso indicamos los flags de configuración a utilizar y crearemos el paquete en función de la arquitectura de la máquina sobre la cual se construye el paquete RPM.
En la sección %install realizamos la instalación del paquete con el uso del comando “make” y, posteriormente, eliminamos los ficheros previos a la compilación desde la sección %clean.
Guardaremos el fichero generado en la ruta /root/rpmbuild/SPECS/ y procederemos a la creación del paquete RPM.
Creación del paquete RPM usando rpmbuild
Una vez completada la creación del fichero SPEC, podemos comenzar a construir el paquete rpm. Si existe algún error durante esta fase, la creación se detendrá y deberemos de resolver el error indicado antes de poder continuar con la creación de nuestro paquete.
Para ello podemos utilizar comandos en función de lo que queramos realizar. Podemos ver la ayuda de rpmbuild con la opción –help.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
# rpmbuild --help Modo de Uso: rpmbuild [OPCIN...] Opciones de construcción con [ <archivo spec> | <tarball> | <paquete fuente> ]: -bp construir a través de %prep (desempaquetar fuentes y aplicar parches) desde <specfile> -bc construir a través de %build (%prep, luego compilar) desde <specfile> -bi construir a través de %install (%prep, %build, luego instalar) desde <specfile> -bl verificar la sección %files de <specfile> -ba construir paquetes binarios y fuente desde <specfile> -bb construir paquetes binarios únicamente desde <specfile> -bs construir paquete fuente únicamente desde <specfile> -tp construir a través de %prep (desempaquetar fuentes y aplicar parches) desde <tarball> -tc construir a través de %build (%prep, luego compilar) desde <tarball> -ti construir a través de %install (%prep, %build, luego instalar) desde <tarball> -ta construir paquetes binarios y fuente desde <tarball> -tb construir paquete binario únicamente desde <tarball> -ts construir paquete fuente desde <tarball> --rebuild construir paquete binario desde <source package> --recompile construir a través de %install (%prep, %build, luego instalar) desde <paquete fuente> --buildroot=DIRECTORY sobreescribir construcción de root --clean remover árbol de construcción al finalizar --nobuild no ejecutar ningún nivel de la construcción --nodeps no verificar dependencias de la construcción --nodirtokens genera encabezado(s) de paquete(s) compatible(s) con el empaquetamiento rpm v3 (legado) --noclean no ejecutar la fase %clean de la construcción --nocheck no ejecutar la fase %check de la construcción --rmsource eliminar fuentes al finalizar --rmspec eliminar el archivo spec al finalizar --short-circuit Ir a etapa especificada (solo para c,i) --target=CPU-VENDOR-OS sobreescribir plataforma de destino Opciones comunes para todos los modos rpm y ejecutables: -D, --define='MACRO EXPR' define MACRO con valor EXPR --undefine=MACRO undefine MACRO -E, --eval='EXPR' imprimir expansión de macro de EXPR --macros=<FILE:...> leer <FILE:...> en vez del archivo(s) predeterminado --noplugins don't enable any plugins --nodigest no verificar resumen del paquete(s) --nosignature no verificar la firma(s) del paquete --rcfile=<FILE:...> leer <FILE:...> en vez del archivo(s) predeterminado -r, --root=ROOT utilizar ROOT como el directorio superior (default: "/") --dbpath=DIRECTORY utiliza la base de datos en DIRECTORY --querytags mostrar etiquetas de consulta conocidas --showrc mostrar configuración rpmrc y macro final --quiet proporcionar salida menos detallada -v, --verbose proporcionar salida más detallada --version imprimir la versión de rpm que está siendo utilizada Options implemented via popt alias/exec: --with=<option> enable configure <option> for build --without=<option> disable configure <option> for build --buildpolicy=<policy> set buildroot <policy> (e.g. compress man pages) --sign generate GPG signature (deprecated, use command rpmsign instead) Help options: -?, --help Show this help message --usage Display brief usage message |
Revisando la ayuda, en nuestro caso, queremos crear el fichero de binarios y el fichero de origen, por lo que utilizaremos la opción -ba para crear nuestros paquetes.
Dicho esto, el comando para la creación del rpm sería el siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# cd /root/rpmbuild/SPECS # rpmbuild -ba bytemind-openssl.spec Ejecutando(%prep): /bin/sh -e /var/tmp/rpm-tmp.OAhALp + umask 022 + cd /root/rpmbuild/BUILD + cd /root/rpmbuild/BUILD + rm -rf openssl-1.1.1 + /usr/bin/gzip -dc /root/rpmbuild/SOURCES/openssl-1.1.1.tar.gz + /usr/bin/tar -xf - + STATUS=0 + '[' 0 -ne 0 ']' + cd openssl-1.1.1 + /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w . + exit 0 Ejecutando(%build): /bin/sh -e /var/tmp/rpm-tmp.M8whsa + umask 022 + cd /root/rpmbuild/BUILD + cd openssl-1.1.1 + ./Configure -DSSL_ALLOW_ADH --prefix=/opt/bytemind-openssl --openssldir=/opt/bytemind-openssl --libdir=lib no-shared zlib-dynamic linux-x86_64 Configuring OpenSSL version 1.1.1 (0x1010100fL) for linux-x86_64 Using os-specific seed configuration |
La creación del paquete tardará unos minutos y, una vez completada, debería de haber creado 2 ficheros rpm.
Verificamos los ficheros RPM creados
Una vez completada la ejecución de rpmbuild, verificaremos que los paquetes se han generado correctamente.
1 2 3 4 |
# ls -l /root/rpmbuild/RPMS/x86_64/ -rw-r--r-- 1 root root 5187156 dic 20 11:36 bytemind-openssl-1.1.1-1.x86_64.rpm # ls -l /root/rpmbuild/SRPMS/ -rw-r--r-- 1 root root 8473665 dic 20 11:36 bytemind-openssl-1.1.1-1.src.rpm |
Instalación del archivo RPM
Como paso final, se debería de instalar el fichero rpm para verificar que funciona correctamente y que se resuelven todas las dependencias
1 2 3 4 |
# rpm -ivh bytemind-openssl-1.1.1-1.x86_64.rpm Preparando... ################################# [100%] Actualizando / instalando... 1:bytemind-openssl-1.1.1-1 ################################# [100%] |
Después de la instalación puede verificar que el paquete existe en el sistema y se ha instalado correctamente:
1 2 |
# rpm -qa | grep bytemind bytemind-openssl-1.1.1-1.x86_64 |
Y podemos comprobar la versión del paquete para asegurarnos de que funciona y no muestra ningún error:
1 2 |
# /opt/bytemind-openssl/bin/openssl version OpenSSL 1.1.1 11 Sep 2018 |
Esto es todo por el momento, espero les sea de utilidad y como siempre tienen la sección de comentarios disponible para exponer cualquier opinión, duda o lo que necesiten.