Construir nuestro propio backport en Debian (ntfs-3g)

Sin ánimo de entrar en polémicas, una de las características de Debian es que en su versión estable las versiones de los paquetes van bastante por detrás de la última versión de software proporcionada por cada desarrollador.

Esto se hace precisamente mirando por la seguridad y la estabilidad de la distribución pero puede conducir a encontrarnos con bugs ya resueltos hace tiempo por los desarrolladores de un determinado software.

En otras ocasiones, se puede haber habilitado una determinada funcionalidad de la que queramos echar mano y que no esté disponible en la versión incluida en la rama estable.

Para estos casos, es muy recomendable darse una vuelta por los backports de debian para ver si tenemos disponible la versión que necesitamos.

Como leemos en la introducción:

It is therefore recommended to select single backported packages that fit your needs, and not use all available backports.

(para eso, ya tenemos la versión testing).

Si el paquete que buscamos no está disponible en los backports, siempre podemos bajar los fuentes, compilar nosotros mismos e instalar con el make install, pero este debería ser el último recurso, para algo se hizo el sistema APT.

Instalando un .DEB, en cambio, el sistema APT será consciente de su existencia, podremos actualizar llegado el caso, sabremos perfectamente qué ficheros incluye el paquete y dónde se instalan, tendremos resolución de dependencias y evitaremos que un make-install desafortunado sobreescriba ficheros pudiendo conducir a la inestabilidad del sistema…es decir, el mantenimiento a lo largo del tiempo será mucho más sencillo.

Además, con un número elevado de servidores, podríamos tener un sistema dedicado únicamente a la compilación y construir los paquetes que necesitemos haciéndolos accesibles al resto montando un repositorio local…

El caso es que el otro día me encontraba una situación que viene al pelo para instruir lo que vengo diciendo:

Tenía la necesidad de copiar a un disco externo formateado con NTFS una gran cantidad de ficheros y me encontré con que la ejecución de rsync me devolvía el siguiente error:

rsync: mkstemp "/mnt/usbdisk/.somefile.ext.FbGJUT" failed: Operation not supported (95)

En un principio, pensé que se trataba de algún fallo relacionado con rsync pero observé que tampoco podía crear nuevos ficheros con un simple touch y en el syslog tenía el siguiente mensaje:

server ntfs-3g[7536]: Not enough space to extended mft data: Operation not supported

Tras la búsqueda de rigor en Google, concluí que el problema estaba en el driver ntfs-3g y efectivamente buscando en debian-packages vi que la versión disponible en squeeze corresponde a Marzo de 2010! cuando en la página de Tuxera tenemos una versión de Enero de 2012.

Una vez comprobado que no hay versión disponible en los debian-backports y que el paquete en Wheezy sí corresponde al de 2012 decidí crear mi propio backport mediante los siguientes pasos:

En un servidor destinado a compilacion con Debian Squeeze, instalamos los paquetes necesarios para compilar y construir los .deb:

apt-get install build-essential devscripts

Añadimos al fichero sources.list el repositorio de fuentes correspondiente a wheezy:

deb-src http://ftp.us.debian.org/debian/ wheezy main

Hacemos una apt-get update e instalamos las dependencias para hacer el build del ntfs-3g:

apt-get build-dep ntfs-3g

En este punto, tendremos un error informándonos de que la versión que tenemos instalada de debhelper no es lo suficientemente moderna:

E: La dependencia Build-Depends en ntfs-3g no puede satisfacerse porque ninguna versión disponible del paquete debhelper satisface los requisitos de versión

Para solucionarlo, usaremos los backports ya que ahí tenemos la versión 9 necesaria, por lo que añadimos al sources.list la línea correspondiente a los backports:

deb http://backports.debian.org/debian-backports squeeze-backports main

hacemos un apt-get update y actualizamos debhelper con la orden:

apt-get -t squeeze-backports install debhelper

Ahora ya no tendremos problemas para instalar las dependencias:

compilacion-[root]-16:58:34:~# apt-get build-dep ntfs-3g
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias
Leyendo la información de estado... Hecho
Se instalarán los siguientes paquetes NUEVOS:
  chrpath libfuse-dev libfuse2 libgcrypt11-dev libgnutls-dev libgpg-error-dev libselinux1-dev libsepol1-dev libtasn1-3-dev
0 actualizados, 9 se instalarán, 0 para eliminar y 0 no actualizados.
Necesito descargar 2531 kB de archivos.
Se utilizarán 7262 kB de espacio de disco adicional después de esta operación.
¿Desea continuar [S/n]?
Des:1 http://ftp.fr.debian.org/debian/ stable/main chrpath i386 0.13-2 [13,6 kB]
Des:2 http://ftp.fr.debian.org/debian/ stable/main libfuse2 i386 2.8.4-1.1 [137 kB]
Des:3 http://ftp.fr.debian.org/debian/ stable/main libsepol1-dev i386 2.0.41-1 [536 kB]
Des:4 http://ftp.fr.debian.org/debian/ stable/main libselinux1-dev i386 2.0.96-1 [297 kB]
Des:5 http://ftp.fr.debian.org/debian/ stable/main libfuse-dev i386 2.8.4-1.1 [178 kB]
Des:6 http://ftp.fr.debian.org/debian/ stable/main libgpg-error-dev i386 1.6-1 [35,9 kB]
Des:7 http://ftp.fr.debian.org/debian/ stable/main libgcrypt11-dev i386 1.4.5-2 [362 kB]
Des:8 http://ftp.fr.debian.org/debian/ stable/main libtasn1-3-dev i386 2.7-1+squeeze+1 [381 kB]
Des:9 http://ftp.fr.debian.org/debian/ stable/main libgnutls-dev i386 2.8.6-1+squeeze2 [591 kB]

A partir de aquí la compilación se realizará como un usuario no privilegiado. Creamos un directorio en nuestro HOME y descargamos los fuentes desde el repositorio de testing:

compilacion-[admlocal]-17:00:25:~$ cd /home/admlocal/build
compilacion-[admlocal]-17:01:47:~/build$ apt-get source ntfs-3g
...
compilacion-[admlocal]-17:02:11:~/build$ cd ntfs-3g-2012.1.15AR.6/

Para generar un número de versión apropiado, con el fin de que un upgrade a la siguiente versión de Debian stable funcione sin problemas, ejecutamos el comando:

debchange --bpo

Se nos abrirá un editor de texto con el fichero debian/changelog en el que pondremos la información que consideremos oportuna, por ejemplo:

ntfs-3g (1:2012.1.15AR.5-2.1~bpo60+1) squeeze-backports; urgency=low

  * Rebuild for squeeze-backports.

 -- admlocal   Tue, 25 Sep 2012 18:04:00 +0200

Como vemos, al número de versión se añade «~bpo60+1«, «bpo» de backport, «60» de la versión 6 de Debian y el «+1» de primera versión del backport y esto lo dejaremos tal cual porque cuando actualicemos a la siguiente versión de Debian estable el sistema APT detectará esta versión como una versión anterior a la oficial y por tanto la actualizará a la estable.

Actualmente en la versión estable no esta soportada la opción Multiarch por lo que si compilamos directamente en este punto obtendremos el siguiente error:

DEB_HOST_MULTIARCH no es un nombre de variable aceptado at /usr/bin/dpkg-architecture line 214.

Por ello necesitamos modificar los fuentes para eliminar cualquier referencia al soporte para multiples arquitecturas.

En estos casos, los ficheros a editar suelen ser debian/rules, debian/control y varios ficheros debian/*.install

Para facilitar las cosas, he creado un parche que realiza las modificaciones oporturnas.

Aplicamos el parche y (por fin) podremos compilar:

Ahora que tenemos los fuentes preparados, estando situados en el directorio donde se extrajron los fuentes, ejecutamos el comando:

compilacion-[admlocal]-16:35:41:~/build/ntfs-3g-2012.1.15AR.5$ dpkg-buildpackage -rfakeroot -us -uc

Tras unos minutos tendremos nuestro flamante ntfs-3g_2012.1.15AR.5-2.1~bpo60+1_i386.deb generado en el directorio superior.

En honor al gran supercoco:

:wq

tags: ,
Escrito en Software por Ignacio Vazquez

Follow comments via the RSS Feed | Deja un comentario | Trackback URL

Leave Your Comment

 
desdelaconsola.es