Creación de un paquete RPM

De Departamento de Informatica
Saltar a: navegación, buscar

Contenido

En construcción

Aqui comenzarán los aportes del grupo:

  • Kaos_and_Zer0s
  • chon

Contenido

Definición

RPM (Red Hat Package Manager) es un sistema gestor de paquetes creado en origen para la distribución Red Hat aunque puede ser usada bajo cualquier otra distribución Linux y UNIX. Permite diferenciar etapas de construcción de software, así como almacenar en una BD interna los archivos copiados al sistema, sus permisos y su destino, con el fin de poder removerlos limpiamente.

  • Además permite generar las dependencias entre paquetes.
  • Permite la instalación de secciones de un paquete.
  • El formato utiliza compresión.
  • Es un estandar en deployment.

Estructura

La estructura (Arbol) para construir un instalador consta de 1 carpeta maestra, rpmbuild, con 5 carpetas en su interior:

  • SPECS: Carpeta Crítica/Inicial, contiene el o los archivos SPEC
  • SOURCES : Carpeta Crítica/Inicial, contiene el o las fuentes del programa a instalar.
  • BUILD: Descomprime y Compila las fuentes.
  • RPMS: Almacena el resultado final, un instalador RPM.
  • SRPMS: Almacena el resultado intermedio, un Source RPM. Con esto se puede portar la instalación a otras arquitecturas.

A lo anterior se le suma en tiempo de construcción BUILDROOT, en donde se aplican las instrucciones después de descomprimir/compilar. A la misma \ altura" de rpmbuild se genera .rpmmacros, para almacenar variables globales y llaves GPG.

Construyendo RPM

Requerimientos

Antes de comenzar con la creacion del RPM, se requiere instalar los siguientes paquetes:

dnf install rpm-build rpmdevtools kernel-devel rpmlint
 rpm-build trae el binario (programa, software) rpmbuild
 rpmdevtools trae rpmdev-* (Nos interesa rpmdev-setuptree)(Opcional)
 kernel-devel provee librerias necesarias
 rpmlint permite detectar errores en el rpm generado.

Atencion

La construcción de un paquete rpm debe ser en un usuario normal.

 [root@ip247 ~]# man useradd
 [root@ip247 ~]# useradd -U rpm
 [root@ip247 ~]# passwd rpm 

Construcción

Comprimir programa

  • Genere los programas a empaquetar (en este caso sera hello.c)
  • Introduzca los programas dentro de un comprimido tar.gz
Mkdir kaos_and_zer0s-0.1
Mv hello.c kaos_and_zer0s-0.1
Tar czvf kaos_and_zer0s-0.1.tar.gz hello.c

Crear RPM

Ahora como usuario local rpm:

  • Crear la estructura de directorios de su RPM ejecutando:
 rpmdev-setuptree
  • Mover el archivo comprimido tar.gz a la carpeta SOURCES
 mv kaos_and_zer0s-0.1.tar.gz rpmbuild/SOURCES
  • Entrar a la carpeta SPEC y crear un archivo .spec, el siguiente comando generará una plantilla
rpmdev-newspec kaosandzer0s
  • La plantilla deberia verse de la siguiente forma
Name:		
Version:	
Release:	1%{?dist}
Summary:	
Group:		
License:	
URL:		
Source0:	
BuildRoot:	%{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)

BuildRequires:	
Requires:	

%description

%prep
%setup -q

%build
%configure
make %{?_smp_mflags}

%install
rm -rf %{buildroot}
make install DESTDIR=%{buildroot}

%clean
rm -rf %{buildroot}

%files
%defattr(-,root,root,-)
%doc

%changelog
  • Posteriormente se darán detalles de su secciones.

Resumen del archivo SPEC

Insertar los comentarios con el primer carácter «#», pero evite las macros (comienzan con %) que sean potencialmente multilíneas (las que se expanden primero). Si está comentando una línea, doble los signos de porcentaje (%%). Evite también los comentarios inline en la misma línea como un comando de script.

Las principales etiquetas se enumeran a continuación. Tenga en cuenta que las macros %{name}, %{version} y %{release} pueden utilizarse para hacer referencia a las etiquetas Name, Version y Release respectivamente. Cuando cambia la etiqueta, las macros se actualizan automáticamente para utilizar el nuevo valor.

  • Name: Nombre del paquete.Debe llamarse igual que el SPEC.
  • Version: El número de versión de desarrollo.
  • Release: El valor inicial normalmente debería ser 1%{?dist}. Incremente el número cada vez que libere un nuevo paquete para la misma versión de software. Cuando una nueva versión de desarrollo es liberada, cambiar la etiqueta Version para igualar y restablecer el número de Release a 1.
  • Summary: Un resumen o descripcion corta del paquete. No terminar con punto.
  • Group: Grupo o categoria del paquete. Debe ser una de las categorías pre-existente. Ej: Applications/File
  • License: Licencias utilizadas por el paquete.
  • URL: La dirección URL completa para obtener más información sobre el programa.
  • Source0: Dirección del archivo comprimido que contiene el código fuente .
  • BuildArch: Corresponde al tipo de arquitectura que tendrá el paquete construido. Si esta empaquetando archivos de distinas arquitecturas, se debe poner 'BuildArch: noarch'
  • BuildRoot: Ruta donde se realizará la instalación virtual, es decir %{_tmppath}/%{name}-%{version}-root
  • Requires: Lista de paquetes que el software empaquetado requiere para funcionar.
  • %description: Descripción detallada sobre el paquete en cuestión. Este no tiene limite de lineas pero no debe pasar los 80 caracteres.
  • %prep: Sección con los procedimientos que son requeridos ANTES de desempaquetar el codigo fuente. Normalmente se pone "setup -q" que desempaqueta el paquete fuente y luego suprime los archivos innecesarios.
  • %build: Sección en que se realizan los procedimientos necesarios para "construir" el programa para posteriormente instalarlo.
  • %install: Sección en que se establecen los procedimientos de instalación del paquete en cuestión. La instalación será virtualy se realizara dentre de la variable BUILDROOT.

En esta sección se entregan las instrucciones referentes a:

  1. Creacion y establecimiento de los directorios en que se instalará el paquete.
  2. La distribución y orden de los archivos dentro del directorio.
  3. Creación de la base de datos en caso que requiera utilizar una.
  • %clean: Instrucciones para limpiar la raíz de construcción. Tenga en cuenta que esta sección es ahora redundante en Fedora y sólo es necesaria para EPEL. Normalmente esto sólo contiene:
rm -rf %{buildroot}
  • %post: Procedimientos que se realizan JUSTO después de realizar los de la sección %install.
  • %files: Lista de todos los componentes dentro del software empaquetado, declarados con sus rutas definitivas. Tambien se declaran los permisos y atributos de los directorios dentro del paquetes, por medio de %attr(mode, user, group). Por ejemplo:
 %defattr(-, root, root)

donde se puso - ya que no era necesario poner un valor.

  • %changelog: Bitacora de cambios del archivo .spec. Requiere del siguiente formato:
 %changelog
 * Wed Dec 16 2015 rpm
 -Algunos cambios
 -Mas cambios

Tips y Solución a Algunos problemas

En el proceso de construcción del rpm, es recomendable ir construyendo y testeando por sección ya que en el caso de existir algún error es más fácil encontrarlo, ya que se sabrá de manera más rapida cual es el error y en que seccion está. Para ir construyendo sección por sección lo podemos hacer de la siguiente manera:

  • Probar %prep:
rpmbuild -bp SPECS/tsc-152.spec
  • Probar %prep y %build
rpmbuild -bc SPECS/tsc-152.spec
  • Probar %prep, %build y %install
rpmbuild -bi SPECS/tsc-152.spec
  • Finalmete se construye el rpm con todas las secciones
rpmbuild -ba SPECS/tsc-152.spec

Una vez hecho esto podemos installar nuestro paquete rpm mediante dnf

dnf install tsc-152-0.1-1.fc22.rpm
  • Un problema frecuente durante la creación del paquete, es que se puede presentar un error con el nombre de la carpeta en donde se descomprime el Tarball con los archivos fuente, (en la carpeta SOURCES). Esto ocurre cuando el archivo Tarball se descomprime en una carpeta que no tiene el mismo nombre que el rpm (con la versión). Para solucionar esto, si el tarball se descomprime en la carpeta FOO agregamos -n en la sección %prep:
   %prep
   %setup -n FOO


  • Agregar codigo sql al rpm:

Para la creación del rpm se pide la creación de un usuario para postgres, por lo que es necesario meter codigo sql. Esto se hace en la sección %post, de la forma:

su - postgres - c “psql -c \”create user user withpassword ‘password’;\”

Para mas informacion

Herramientas personales
Espacios de nombres
Variantes
Acciones
Navegación
Herramientas