viernes, mayo 07, 2010

linux aplicaciones portables

http://qtoctave.wordpress.com/2010/05/06/creacion-de-binarios-para-linux-transporte-de-bibliotecas/#more-391


Creación de binarios para Linux: Transporte de bibliotecas
Por acisif
La técnica que se ha diseñado para realizar los binarios para Linux de QtOctave, la he bautizado como transporte de bibliotecas. La idea consiste en “en paquetar” el programa junto a las bibliotecas de las que depende. Así se consigue que funcione casi en cualquier distribución de Linux, sin necesidad de realizar un paquete específico para cada distribución.
Desde el punto de vista del usuario, las plicaciones son ficheros comprimidos, que descarga, descomprime y ejecuta. Cuando quiere desinstalarlos, sólo tiene que moverlos a la papelera. Ya está :)
Se podría aplicar sin muchos problemas a otros proyectos de software libre.
Como ejemplo se pueden descargar los binarios de QtOctave-0.9.1, Octave-3.2.4 y Gnuplot-4.4. que he realizado usando esta técnica. Veréis que son muy intuitivos de manejar:
http://forja.rediris.es/frs/download.php/1840/QtOctave-0.9.2_Linux-x86.tar.bz2
¿En qué se basa esta técnica?
Los programas en Linux, a no ser que estén compilados estáticamente, dependen de una serie de bibliotecas (librerías). Las bibliotecas de las que depende un programa se pueden ver usndo el comenda ldd. Por ejemplo, para saber las dependencias del comando ls:
ldd ls
linux-gate.so.1 => (0xffffe000)
librt.so.1 => /lib/i686/librt.so.1 (0xb7752000)
libcap.so.2 => /lib/libcap.so.2 (0xb774c000)
libacl.so.1 => /lib/libacl.so.1 (0xb7743000)
libc.so.6 => /lib/i686/libc.so.6 (0xb75e2000)
libpthread.so.0 => /lib/i686/libpthread.so.0 (0xb75c7000)
/lib/ld-linux.so.2 (0xb7769000)
libattr.so.1 => /lib/libattr.so.1 (0xb75c1000)
Se puede ver las bibliotecas de las que depende y dónde están localizadas.
En la salida del comando anterior hay que prestar atención la entrada que pone /lib/ld-linux.so.2, ¿por qué es diferente del resto? ld-linux.so.2 es el programa que se encarga de buscar ls bibliotecas de las que depenen las aplicaciones. Por lo tanto, podemos usar este programa para que busque las biliotecas en el lugar que nosotros deseemos que s busque y no entre las biliotecas del sistema. Así por ejemplo:
ld-linux.so.2 –library-path /tmp/libs/ qtoctave-0.9.1
Ejecutaría qtoctave usado las bibiotecas que hay localiadas en /tmp/libs/ y no las bibliotecas instaladas en el sistema.
Se podría entonces empaquetar un programa con sus bibliotecas y usar ld-linux.so.2 para cargarlas.
Por lo tanto, sólo hay que:
Para empaquetar un programa usando esta técnica hay que seguir los siguientes pasos (los voy a particularizar para el caso de QtOctave):
Se compila e instala el programa que se desee empaquetar en un directorio por ejemplo en /opt (configure –prefix=/opt). Es mejor usar el directorio /tmp (conigure –prefix=/tmp), ya veremos la causa.
Usando ldd, se buscan las dependencias de cada uno de los ejecutables de la aplicación y se copian junto a los ejecutables. También hay que copiar ld-linux.so.2.
Se le cambia el nombre a cada ejecutable, por ejemplo de qtoctave a qtoctave-0.9.1.
Para cada ejecutable original se escribe un script (debe tener permisos de ejecución) que lo ejecute usando ld-linux.so.2. En el ejemplo de qtoctave, el ejecutabe se llamaría qtoctave y va a contener lo siguente:
#!/bin/bash
/tmp/libs/ld-linux.so.2 –library-path /tmp/libs/ /tmp/qtoctave-0.9.1/bin/qtoctave-0.9.1 “$@”
Evidentemente hay sustituir /tmp/libs/ por la ruta donde se hayan copiado las bibliotecas. /tmp/qtoctave-0.9.1/bin/qtoctave-0.9.1 se debe cambiar por la ruta al ejecutable.
Se comprime todo. Por ejemplo, se puede generar un qtoctave-0.9.1.tar.gz.
Si e escribe un instalador, aquí ya se podría terminar y distribuir la aplicación, pero los siguientes pasos hacen que todo sea más simple ara el usuario.
Se escribe un script que será el que lance la aplicación. Para QtOctave he escrito el siguiente script llamado qtoctave.sh:
#!/bin/bash
echo “Starting QtOctave”
cd `dirname “$0″`
ln -s `pwd`/`basename “$0″` /tmp/qtoctave-0.9.1.tar.gz
cd /tmp
tail -c 21923071 qtoctave-0.9.1.tar.gz | tar -xz
rm -f qtoctave-0.9.1.tar.gz
export PATH=$PATH:/tmp/gnuplot-4.4.0/bin:/tmp/octave-3.2.4/bin:/tmp/qtoctave-0.9.1/bin
/tmp/qtoctave-0.9.1/bin/qtoctave
rm -Rf /tmp/gnuplot-4.4.0 /tmp/octave-3.2.4 /tmp/qtoctave-0.9.1 /tmp/libs
exit
En la línea que contiene tail -c 21923071, el número es el tamaño en bytes del fichero comprimido generado en el punto anterior. El script lo que hace es descomprimir y ejecutar qtoctave. Al terminar la ejecución vueve a borrar los ficheros descompridos.
Se junta el sccript anterior con el fichero comprimido usando cat:
cat qtoctave.sh qtoctave-0.9.1.tar.gz > QtOctave.sh
Al fichero resultante, QtOctave.sh, se le dan permisos de ejecución.
Ya está.
Antes se ha comentado que es más práctico usar /tmp para instalar la aplicación. Todos los usuarios de Linux tienen permisos para usar /tmp, por lo que el usuario no va a necesitar ser administrador para copiar allí las aplicaciones. La parte mala es que tmp se suele borrar cada reinicio del ordenador, pero tal como se ha orientado el lanzador, esto no es un problema.
No es oro todo lo que reluce.
La técnica permite que el binario generado funcione casi en cualquier distribución de Linux, sin necesidad de realizar un paquete específico para cada distribución.
El problema radica en que los programas necesitan dependencias que no son fáciles de encontrar. En el caso de QtOctave, se necesita añadir la biblioteca libXi.so, ya que, aunque ldd no la muestre como dependencia, algunas distribuciones la necesitan.
También hay otra serie de problemas más simples, pero también molestos, como los tipos de letra que usa la aplicación, que pueden no estar instados y reemplazados por otros más desagradables.
El núcleo del sistema, el kernel, también influye, pues de unas versiones a otras pueden cambiar algunas cosas que la aplicación necesite.
P.L. Lucas

No hay comentarios: