17 años en Internet

23 febrero 2012

Ubuntu bajo Android, prueba de concepto

La demostración de ayer sobre la integración de Ubuntu sobre Android fue demoledora. ¿Cómo han conseguido crear una aplicación que acceda al kernel de Android mientras este continúa ejecutándose y a la vez tener acceso a los recursos y aplicaciones del smartphone? ¡Y todo ello sin virtualización!

Bueno, a priori parece que hagan uso de una especie de imagen de Live USB persistente. "Persistente" quiere decir que todos los cambios que hagas mientras la sesión esté activa, serán almacenados en dicha imagen. Lo primero que intuyo que hará la aplicación será montar esta imagen dentro de alguna carpeta del directorio "/mnt". Una vez esté montado su sistema de archivos, harán uso otra vez de mount para sustituir los módulos /proc, /sys y /dev, finalizando con un chroot de la carpeta donde se encuentre montada la imagen.

Esta técnica nos permite tener ambos sistemas operativos funcionando al mismo tiempo, accediendo al mismo kernel. Además los chicos de Canonical habrían configurado la distribución para volcar el contenido de la pantalla por defecto del chroot a través del puerto usb que se conecta a su base. Es decir, deben de haber realizado un aplicativo especial para dicha base (falta por ver como integrarlo sin tocar el kernel original y sin disponer de las cabeceras de este para realizar un módulo*), que permita tener acceso a una pantalla externa a través de las conexiones de la base.

*Recordemos que al igual que en GNU/Linux, cada dispositivo Android utiliza su propia versión del núcleo de Android y que las cabeceras de cada versión (ya sea por modificación privativa, simple alteración o por actualización oficial) no tienen por qué coincidir en todas. Por lo tanto habría que descartar la creación de un módulo de kernel. A no ser que se trate de un nuevo driver genérico que fuera liberado e incluido en un kernel determinado, declarando incompatible a todos los usuarios de dispositivos actuales.

Si quisiéramos rizar más el rizo, además no sería descabellado afirmar que para evitar sobrecargar la ram (o el procesador del dispositivo), el aplicativo pudiera matar las "X" del sistema chrootado siempre que no exista conexión con la base. Aunque claro, esto es una suposición y no una afirmación, puesto que en el vídeo no se muestra claro y pudiera ser que me equivocara. También cabe la posibilidad de que las "X" (el sistema gráfico de Linux)  estuvieran vivas en todo momento, pero que siempre que el dispositivo no esté conectado a la base, se le asigne una prioridad baja a los procesos del chroot, aligerando las labores del Android nativo. A lo mejor es mucho más simple que eso, a lo mejor lo que se pudiera realizar es que el sistema hiberne siempre que no esté conectada la base.

Todo esto es teórico, por desgracia hasta finales de este año no podremos hincarle el diente a Ubuntu for Android para salir de dudas.


Prueba de concepto:
Pese a ello, podemos hacer uso de un chroot para comprobar qué tal de fluido iría Ubuntu sobre nuestra tablet o smartphone. La siguiente prueba no la hagas si tu dispositivo tiene un procesador poco potente. Para haceros una idea he hecho la prueba con mi Folio 100, una tableta con procesador tegra 2 (1 GHz con doble núcleo) y la interfaz con GNome funciona de forma bastante lenta.

Para ello vamos a necesitar las siguientes herramientas:
  • Un dispositivo Android "rooteado". Es decir, que podamos tener acceso al usuario root.
  • Por lo menos 4 GB de espacio en tarjeta SD.
  • Un procesador potente.
Primero entremos en la web del proyecto "Linux on Android" y nos bajamos el ubuntuV5-script.zip y el ubuntuV5-image.zip. El primero es un script de bash encargado de automatizar todas las tareas de montado y a su vez se encarga de realizar el chroot. El segundo es una imagen de una distribución Ubuntu compilada en ARM con la herramienta RootStock. Esta imagen trae instalados los escritorios LXDE y GNOME.

Si tienes curiosidad, aquí tienes el contenido del script:

- La línea 6 y 7 sirven para verificar que el usuario invocante es root. 
- De las líneas 9 a 16 se definen una serie de variables que serán usados para el correcto funcionamiento del script. Fíjate que la imagen descargada debe de estar en el directorio /sdcard/ubuntu/ con nombre ubuntu.img. 
- Desde la línea 17 hasta la 29 se hacen todas las labores de montado, tanto de la imagen chroot como de los falsos dispositivos /proc o /sysfs. 
-  En las líneas 31 y 32 se fuerza que las DNS del sistema chroot sean las oficiales de Google (8.8.8.8 y 8.8.4.4). Si en tu red tienes el acceso bloqueado a esos servidores, puedes reemplazar dichos valores por los de tu red local. 
- En la línea 35 el script nos informará de la dirección ip de nuestro dispositivo, puesto que más tarde accederemos a él a través de un cliente de VNC.
- En la línea 37 se lanza la instancia que hace levantar el sistema operativo de este chroot, el cual está configurado con un servidor VNC para que puedas tener acceso a todo lo que vuelca por pantalla. Si quisieras aplicar una configuración especial, podŕias tocar el /root/init.sh de la imagen o bien modificar este script (a base de "echo" y redirecciones, como se hace en las líneas 31, 32 y 33). 
- Desde la línea 38 hasta el final nos indica que, una vez apaguemos el Ubuntu, se desmontarán todos los dispositivos falsos que hemos empleado.
Bueno, volvamos al experimento. Descomprime ambos archivos y conecta tu dispositivo Android a tu ordenador a través de USB para montar la tarjeta SD. Crea en la raíz de la SD una carpeta llamada ubuntu y vuelca en el el contenido de los dos comprimidos.

A continuación vamos a necesitar dos aplicaciones en tu dispositivo Android: Una terminal y un cliente VNC. Si no los tienes vas a tener que instalarlos ([1] y [2]).

Abre la terminal y teclea lo siguiente:
su -
cd sdcard/ubuntu
sh ubuntu.sh
El primer comando era necesario para ser usuario root, de hecho lo lógico sería que te salga un cuadro de diálogo preguntando si realmente quieres dar permisos de administrador a esta sesión. Enhorabuena, una vez ejecutes el script tendrás ya Ubuntu funcionando en segundo plano en tu dispositivo Android.

Acto seguido, abrimos el cliente de VNC que vienes de instalar e inserta los siguientes parámetros:
  • IP: localhost
  • Usuario: ubuntu
  • Contraseña: ubuntu
  • Calidad gráfica: 24 bits
Lo mejor es que, al estar configurado por VNC, también podrás acceder desde cualquier otro equipo de tu casa. Ejemplo:


Por cierto, se trata de una imagen persistente que incluye una Ubuntu compilada en ARM, el cual tiene soporte por parte de Ubuntu (aunque no tengo claro si está mantenido por la comunidad o por Canonical). Con esto quiero remarcar que podéis instalar o eliminar aplicaciones a través de apt-get o synaptic para configurar el sistema a vuestro gusto.

2 comentarios:

  1. Se ve como un concepto muy interesante, esperemos tenga futuro

    ResponderEliminar
  2. Lástima que el método del chroot sea tan lento. Me muero de ganas por probar el Ubuntu for Android oficial =)

    ResponderEliminar

Si te ha gustado la entrada o consideras que algún dato es erróneo o símplemente deseas dar algún consejo, no dudes en dejar un comentario. Todo feedback es bienvenido siempre que sea respetuoso. También puedes contactarme vía Twitter @Hamster_ruso si lo consideras necesario.