Creando un paquete .deb (debian) a partir de archivos y binarios

Estuve buscando información de como crear un paquete .deb (instalador GNU Debian) a partir únicamente de archivos binarios, archivos de configuración y ayudas, sin tener el código fuente.

La mayoría de las cosas que encuentro de ayuda en google tienen que ver con crear paquetes a partir del fuente (usando dh_make), sin embargo, mi caso es distinto, simplemente deseo crear un paquete conteniendo una configuración «lista para usar» de un conjunto de paquetes.

Tal vez no sea la guía más perfecta del mundo y algún Debian user la podrá corregir, pero es lo más «newbie-friendly» que pude hacerla y realmente no se encontraba nada más.

Usando dpkg-deb: el caso

Tengo la configuración para una serie de paquetes, incluyendo Samba, NIS, NSS, Pam, Kerberos para conectar una estación de trabajo Linux a un controlador de Dominio Samba, y realmente es fastidioso tener que viajar con los archivos de configuración en un pendrive, mejor aún, con un .deb lo colocamos en el mirror local y se podrá instalar una máquina rápidamente.

Instalamos los paquetes requeridos (para crear cualquier tipo de .deb):

apt-get install build-essential autoconf automake autotools-dev dh-make debhelper devscripts fakeroot xutils lintian pbuilde

Creando el paquete:

Primeramente, creamos un directorio para el paquete:

mkdir dominiovive-0.1

Donde el directorio tiene la forma <paquete>-<version>

Luego nos cambiamos a la carpeta:

cd dominiovivetv-0.1

Dentro, crearemos las siguientes carpetas:

mkdir -p {DEBIAN,etc,usr/share/doc/dominiovivetv}

DEBIAN es una carpeta especial, requerida por el empaquetador, etc, usr y share/doc replican la estructura de archivos del paquete.

En nuestro caso, copiaremos los archivos de acuerdo a como deberían quedar dentro del árbol de directorios, ejemplo, en /usr/share/doc/<paquete> copiaremos el README.Debian, la licencia del paquete, el copyright, el archivo changelog (de existir) y cualquier archivo de información que pudiera ser necesario.

Para mi caso, no busco empaquetar algo para Debian, sino simplemente para facilitar mi vida! xD.

Luego, cambiaremos al directorio DEBIAN y crearemos 3 archivos:

touch {conffiles,control,postinst,prerm}

Explicando que:

control: Es el archivo de control _maestro_ del paquete, describe el paquete, define sus dependencias, etc

prerm: permite definir qué archivos serán removidos *antes* de iniciar la instalación del paquete

postinst: indica los comandos que se ejecutarán al momento de finalizar la instalación del paquete.

conffiles: define las rutas de los archivos que deberán ser tratados como archivos de configuración.

Opcionalmente, pueden agregar un quinto archivo, md5sums, que agrega las sumas md5 (checksum) de los archivos, por razones de seguridad.

Ejemplo:

2f356768104a09092e26a6abb012c95e  usr/share/doc/dominiovivetv/README.Debian
a6259bd193f8f150c171c88df2158e3e  usr/share/doc/dominiovivetv/copyright
7f8078127a689d647586420184fc3953  usr/share/doc/dominiovivetv/changelog.Debian.gz
98f217a3bf8a7407d66fd6ac8c5589b7  usr/share/doc/dominiovivetv/changelog.gz

y le asignamos sus permisos correctamente:

chmod 0755 control
chmod 0644 conffiles
chmod 0755 postinst
chmod 0644 usr/share/doc/dominiovivetv/* -R

Y para el resto de las carpetas del directorio:

find ./dominiovivetv-0.1 -type d | xargs chmod 755

Ya podemos agregar información a cada uno.

Archivo copyright

Contiene la información de licencia y derechos de autor sobre el paquete.

dominiovivetv
This is the Debian package of dominiovivetv

Copyright (C) 2010 Jesus Lara <jesuslara@devel.com.ve>

Contact address is <jesuslara@devel.com.ve>.

The entire code base may be distributed under the terms of the GNU General
Public License (GPL), which appears immediately below.  Alternatively, all
of the source code as any code derived from that code may instead be
distributed under the GNU Lesser General Public License (LGPL), at the
choice of the distributor. The complete text of the LGPL appears at the
bottom of this file.

See /usr/share/common-licenses/(GPL|LGPL)

Archivo conffiles

En mi caso, los archivos de configuración que voy a re-emplazar:

/etc/host.conf
/etc/hosts.allow
/etc/libnss-ldap.conf
/etc/libnss-ldap.secret
/etc/nss-ldapd.conf
/etc/nsswitch.conf
/etc/pam_ldap.conf
/etc/pam_ldap.secret
/etc/ldap/ldap.conf
/etc/samba/smb.conf
/etc/pam.d/common-auth
/etc/pam.d/common-session
/etc/pam.d/common-password
/etc/pam.d/common-account

El archivo changelog:

dominiovivetv (0.1.0) unstable; urgency=low
 * First release
 -- Jesús Ignacio Lara Giménez (Linux User 407988) <jesuslara@devel.com.ve>  Thu, 20 May 2010 18:40:24 -0430

Nota: El archivo tiene una sintaxis muy estricta, debe existir par de espacios entre:

  • Inicio de línea y definición del release
  • Los doble-guión de inicio del nombre del mantenedor
  • La separación entre nombre y fecha de empaquetado

Si este formato no se cumple, cuando evaluamos el paquete con Lintian, se retorna un error:

W: dominiovivetv: syntax-error-in-debian-changelog line 5 "badly formatted trailer line"

Además de ser un initial-release (primera vez que empaqueto esto), debemos mencionar la versión del paquete, y la fecha, pero además, el nombre del «empaquetador» (maintainer), el nombre debe ir EXACTAMENTE como aparece en tu clave GPG (si llegara el caso que desees firmar el paquete).

changelog.Debian

dominiovivetv Debian maintainer and upstream author are identical.
Therefore see also normal changelog file for Debian changes.

Luego de creado el changelog y el changelog.Debian, los debemos comprimir:

cd usr/share/doc/dominiovivetv/
gzip --best {changelog,changelog.Debian}

El README.Debian es un archivo descriptivo del paquete.

Archivo postinst:

El archivo es un guión (shell SH), para ejecutar comandos post-instalación, en mi caso (muy personalizado) voy a ejecutar una serie de comandos posteriores a la instalación del paquete referentes a la sincronización del reloj, reinicio del samba y winbind.

#!/bin/sh
ntpdate ntp.vive.gob.ve
invoke-rc.d samba restart

Archivo control

El archivo más importante pues gestiona el paquete, veamos el ejemplo:

Package: dominiovivetv
Version: 0.1
Maintainer: Jesus Lara <jesuslara@devel.com.ve>Architecture: i386
Section: adminPriority: optional
Description: PAM-Samba-VIVETV
 Instala los archivos de configuracion para el dominio samba covetelsa.org
Depends: samba-common, samba-client, samba-tools, libnss-ldapd, libnss-ldap, libpam-ldap, libpam-cracklib, libpam-mkhomedir, resolvconf, nscd, ntpdate, sudo-ldap, openssl, openssh-server, openssh-client, nss-updatedb, libnss3-tools, sudo-ldap, ldap-utils, libnss-db, libsasl2-modules, finger, finger-ldap, samba, samba-tools, winbind

Depends: define los nombres de los paquetes que son requeridos por este (en mi caso, pam, nis, nss y samba-tools, entre otros).

Me imagino que el resto de atributos es auto-descriptivo, ¿no?

Creando el paquete

Luego que tenemos todo correctamente configurado, salimos del directorio y ejecutamos (como root) el siguiente comando:

dpkg-deb --build dominiovivetv-0.1

Esto, generará un archivo llamado dominiovivetv-0.1.deb.

Chequeando el paquete con Lintian

Lintian es un paquete que verifica «la calidad» de un paquete .deb, en mi caso, al ejecutar lintian sobre el .deb

Me muestra una serie de Advertencias (no críticas):

lintian dominiovivetv-0.1.deb

respuesta:

W: dominiovivetv: copyright-without-copyright-notice
W: dominiovivetv: maintainer-script-ignores-errors postinst

Y listo!, ya podemos instalar este paquete con el usual comando:

dpkg -i --force-confnew dominiovivetv-0.1.deb

En mi caso, como el archivo contiene archivos de configuración «contenidos» en otros paquetes, le indico que fuerce la sobre-escritura de dichos archivos de configuración (–force-confnew).

Fuente: http://tldp.org/HOWTO/html_single/Debian-Binary-Package-Building-HOWTO/

Usando EPM

Existe un empaquetador especial, que permite hacer este tipo de tareas de manera más automática; se llama EPM.

aptitude install epm

EPM solicita una carpeta con el nombre del paquete y dentro un archivo <nombre de paquete>.list

Pueden ver un ejemplo acá:

%product PAM-SAMBA-VIVETV
%copyright 2010 by Jesus Lara <jesuslara@devel.com.ve>
%vendor DEVEL
%description Instala los archivos de configuracion para el dominio samba vivetv.org
%version 0.1
%readme README
%license LICENSE
%requires samba-common
%requires samba-client
%requires samba-tools
%requires libnss-ldapd
%requires libnss-ldap
%requires libpam-ldap
%requires libpam-cracklib
%requires libpam-mkhomedir
%requires resolvconf
%requires nscd
%requires nslcd
%requires ntpdate
%postinstall echo "netbios name = `hostname --s`" >> /etc/samba/smb.conf
%postinstall echo "172.16.80.12    ldap.vive.gob.ve        ldap" >> /etc/hosts
%postinstall echo "172.16.80.10    ntp.vive.gob.ve ntp" >> /etc/hosts
%postinstall /usr/sbin/ntpdate ntp.vive.gob.ve

c 644 root root /etc/ldap/ldap.conf ldap.conf
c 644 root root /etc/host.conf host.conf
c 644 root root /etc/hosts.allow hosts.allow
c 644 root root /etc/nss-ldapd.conf nss-ldapd.conf
c 644 root root /etc/pam_ldap.conf pam_ldap.conf
c 640 root root /etc/pam_ldap.secret pam_ldap.secret
c 644 root root /etc/libnss-ldap.conf libnss-ldap.conf
c 640 root root /etc/libnss-ldap.secret libnss-ldap.secret
c 644 root root /etc/nsswitch.conf nsswitch.conf
d 755 root root /etc/pam.d -
c 644 root root /etc/samba/smb.conf smb.conf

Con EPM, este único archivo controla la creación del paquete, donde:

%postinstall: ejecuta tareas luego de instalado el paquete

%preinstall: ejecuta tareas antes de instalar el paquete

%requires: paquetes requeridos

%removes: paquetes que debe remover

%replaces: paquetes que debe re-emplazar

%conflicts: paquetes con los que entra en conflicto

La operación c 644 root root indica:

c: copiar

644: chmod del archivo al ser copiado en el destino

root root : uid y gid del dueño del archivo

Luego indica hacia DONDE va el archivo y luego «desde donde» lo saco.

Luego que tenemos el archivo list configurado, creamos el paquete

Creando el paquete con epm

epm -n -f deb dominiovive-0.1

Donde -f admite el tipo de formato de paquete (rpm, deb, etc)

Conclusiones

Espero esta guía sea de utilidad, realmente me costó encontrar información concisa y directa al grano en español (casi todos los HOWTO son cuando se tiene el fuente del programa), así que tuve que traducir los HOWTO de ambas formas para poderlos a disposición de los hispano-hablantes.

4 comentarios sobre “Creando un paquete .deb (debian) a partir de archivos y binarios

  1. La razón por la que no hay más ‘ayudantes’ para esto es que en Debian nunca trabajamos con los paquetes binarios. Si sólo quieres obtener un deb con archivos binarios igual se hace el paquete fuente correspondiente. Sí, tiene una gran utilidad para aplicaciones muy puntuales y personales, pero hay que tener cuidado: en proyectos como Canaima se debe evitar publicar modificaciones binary-only. Nota, también puedes usar equivs, que fue uno de los primeros ayudantes que tuvimos en Debian para hacer metapaquetes y paquetes de propósito especial. No uso epm, pero tiene un gran valor para hacer distribuciones en varios tipos de paquetes. Normalmente, si debo hacer paquetes binarios, hago el fuente o utilizo el procedimiento de dpkg -b (es lo mismo que dpkg-deb -b) Saludos

    1. Claro, la idea no es «agregarlo» a Debian o distro alguna, en mi caso puntual y personal (es un conjunto de archivos de configuración, scripts de shell y más nada), no hay binarios, solo archivos de configuración ya listos para lanzar al cliente, no, no tengo un puppet montado, entonces la forma más expedita era crear un paquete .deb personalizado para la institución.
      Como usas dh_make con un archivo de texto, uno de configuración y un shell script?, es entonces obvio que necesito usar dpkg-deb -b.
      Gracias por el comentario …

Deja un comentario