lunes, 31 de enero de 2011

Ejecutar programas sin necesidad de usar chroot

For english version


Advertencia: Lo siguiente puede que no te funcione. Si al hacer lo aquí expuesto tu máquina explota o no funciona como debería es tu única e intransferible responsabilidad. Debiste probar primero en un sistema de pruebas y no en producción. Ojala tengas un respaldo. No es mi culpa (^_^) .

Hace unos días, tuve la necesidad de ejecutar una aplicación en 32 bits en un sistema en 64 bits. El típico caso de uso para usar chroot. El problema era que la aplicación debe ser ejecutada por otra aplicación, la cual se ejecuta sin privilegios de root (ser root es estar sin protección, be safe kid (^_^) ). Esto limita el uso de chroot (sólo puede ser ejecutado por root), además no quería lidiar con conflictos en las versiones de las librerías  (puede ser nocivo para la salud).

Después de un poco de google y man, llegué a la solución ld.so. Todo consistía en indicarle a la aplicación la ruta de las librerías a usar . Para hacer esto, se ponen primero las rutas a las librerías en la variable de entorno LD_LIBRARY_PATH. Posiblemente esto haga servir tu aplicación. En mi caso no funciono (;_;) . Me salieron errores como por ejemplo problemas de símbolos, etc. Seguí leyendo de ld.so y conseguí la solución. Se estaba usando el loader del sistema, no el que la aplicación debería utilizar. La solución que encontré, además de recompilar la aplicación, es invocar directamente al loader especifico. Para hacer esto, hay que revisar con: ldd <ruta completa aplicación> . Buscar la línea ld-linux, grep es tu amigo, y así obtenemos el ld-linux<algo>.so (enlace simbólico al ld-<version>.so) que utiliza la aplicación.

Un ejemplo

Suponiendo un sistema en 64 bits con una aplicación en 32 bits

Con la siguiente estructura de directorios








Ejecutando
$ ldd /home/<usuario>/<carpeta_aplicación>/bin/<aplicación> | grep ld-linux


Obtenemos (este archivo lo sacamos del sistema original donde funcionaba la aplicación)
/lib/ld-linux.so.2


Copiamos ese loader a
/home/<usuario>/<carpeta_aplicación>/lib/ld-linux.so.2

Para ejecutar la aplicación
$ env LD_LIBRARY_PATH=/home/<usuario>/<carpeta_aplicación>/lib/:$LD_LIBRARY_PATH \
/home/<usuario>/<carpeta_aplicación>/lib/ld-linux.so.2 \
/home/<usuario>/<carpeta_aplicación>/bin/<aplicación> <argumentos>*


Algo engorroso, pero se puede hacer un script. Para cualquier duda se vale preguntar.


Alejandro

No hay comentarios:

Publicar un comentario