Entorno de desarrollo para el Chumby

Chumby
Se pretende construir un entorno de desarrollo para crear aplicaciones en diferentes lenguajes (c/c++ y flash mayormente) para el Chumby

Ingredientes

  1. Una máquina con Debian (preferiblemente SID), actualizada
  2. Un Chumby
  3. Las aplicaciones pertinentes en cada sección

Al tema

Existen varias formas de crear un entorno de desarrollo para nuestra plataforma (ARM). Algunas ensucian más el sistema que otras. Por ejemplo, en el wiki de Chumby, te explican que debes bajarte un paquetito (bastante grande, por cierto), y descomprimirlo en /. Esto mete en /usr todo lo necesario, pero no te da nada de control sobre lo que ha pasado. Si tienes que volver al estado anterior, tendrás que hacerlo a mano.

La opción que me he planteado, además de ser más divertida e instructiva, te permite tener más flexibilidad y control sobre todo lo que usas para el Chumby: hacer una jaula (un entorno chroot que lo llaman) donde poner todo lo que necesites.

Creando la jaula

Para hacer el entorno chroot, he seguido la receta de javieralso, con algunas modificaciones (pero no muchas, porque esto es muy sencillo). Básicamente lo que hay que hacer es buscarse una carpeta donde hacer el despliegue (os aconsejo no poner espacios en el nombre, o quizá tengáis problemas):

user@box:~$ mkdir chumby

Y ahora, si no tienes instalado cdebootstrap , ¿a que esperas? Eye-wink Ya sabes, puedes usar apt* para instalarlo de la forma usual. Si tienes dudas, pregunta.

Lo siguiente es el despliegue, que consiste en instalar un sistema Debian básico para ir tirando… Sticking out tongue

user@box:~$ sudo cdebootstrap unstable chumby http://ftp.es.debian.org/debian

Si tienes dudas sobre qué hace este último comando, mírate la receta de javieralso. Una vez que haya terminado, que tardará un ratejo (cosa normal, teniendo en cuenta que, salvo algunos detalles, es una instalación de Debian completamente funcional), lo siguiente antes de continuar es arreglar un par de cosillas pendientes. Para ello, entramos en la jaula:

user@box:~$ sudo chroot chumby
root@box:/#

Eres root, así que ten cuidado con lo que haces Eye-wink Lo primero de todo es instalar algunos paquetes que son vitales para la vida: emacs, bash-completion, locales…

root@box:/# apt-get update

root@box:/# apt-get install emacs bash-completion locales file

Si te quieres librar del problema de las locales (en caso de que te aparezca), pues simplemente con un reconfigure (‘dpkg-reconfigure locales’) y seleccionando ES_UTF-8 como el predeterminado del sistema (o el que quieras) debe bastar.

Luego, ya que no hay usuarios, puedes crear en /home carpetas con los usuarios del sistema no-chroot que van a usar la jaula, y añadir los scripts de inicio que creas convenientes, alias, prompts, etc.:

root@box:/# mkdir /home/user
root@box:/# cd
root@box:~#

Este es el .bashrc que he puesto para mi usuario:

alias ls='ls --color' 
alias clean='rm *~ \#*\# -rfv' 
alias emacs='emacs -nw'
 
. /etc/bash_completion 
 
PS1='\[\033[01;29m\]CHROOT@Chumby\[\033[00m\]:\[\033[01;34m\]\W\[\033[00m\]\$ ' 
 
# Mount /proc filesystem
if [ ! -f /proc/cpuinfo ];
  then mount -t proc none /proc
fi;
 
# Go to home... :-p
cd

Con un bonito ‘prompt’ para distinguir cuando estas dentro del chroot y cuando no. Ten cuidado al cortar y pegar, pues puede que a bash no le gusten las comillas de tu navegador… Sticking out tongue Otro detalle de la jaula es que hay ciertos sistemas de ficheros que no te monta automáticamente, por ejemplo /proc y /dev. Si necesitas montarlos, sigue la receta de javieralso, aunque algunos, como /proc y /sys se pueden montar desde la jaula.

El proc es casi imprescindible, así que puedes montarlo de la siguiente forma:

Nota: como puedes ver, he añadido una linea en el .bashrc para que se monte cuando inicies sesión. Así no te tienes que preocupar de estos menesteres.

CHROOT@Chumby:/# mount -t proc none /proc

La GNU Toolchain para ARM

Existen mil formas de instalarla. Desde la web de Chumby te aconsejan que te bajes un paquete comprimido con todo ya compilado y lo descomprimas en /, lo que meterá en /usr todo lo necesario, pero que te dejará el sistema hecho unos zorros. Si lo haces en una jaula, no es tanto el daño. Así que, bájate el fichero (unos 120 MiB), y lo descomprimes en la carpeta raíz:

CHROOT@Chumby:~# cd /
CHROOT@Chumby:/# wget -c http://files.chumby.com/toolchain/arm-linux-v4.1.2b.tar.gz

CHROOT@Chumby:/# tar zxvf arm-linux-v4.1.2b.tar.gz

¡Y ya está! Lo podemos probar con un ejemplo muy sencillo en C++, el típico, conocido y sufrido Hello world:

// -*- mode: C++; coding: utf-8 -*-
 
#include <iostream>
 
int 
main(int argc, char* argv[]) {
  std::cout << “Hola desde el Chumby!<< std::endl;
  return 0;
}

Y lo puedes compilar así:

CHROOT@Chumby:samples# arm-linux-g++ test.cpp -o test
CHROOT@Chumby:samples# ls
test test.cpp
CHROOT@Chumby:samples# file test
test: ELF 32-bit LSB executable, ARM, version 1, dynamically linked (uses shared libs), for GNU/Linux 2.6.0, not stripped
CHROOT@Chumby:samples#

Para ejecutarlo, hay que meterlo en el Chumby. Más abajo explico cómo montar una partición NFS para poder mover directamente nuestros binarios allí y tenerlos disponibles en el Chumby automágicamente.

Flash con Haxe

Haxe es un “lenguaje de programación open source multiplataforma” (sic) un tanto especial. Permite compilar el código a otros lenguajes (javascript, php) o al bytecode de ciertas máquinas virtuales (NekoVM) y, que es lo que nos interesa, a Flash (swf).

La instalación es sencilla, puesto que es paquete Debian Eye-wink:

CHROOT@Chumby:samples# apt-get install haxe

El lenguaje no es muy complejo, sintácticamente parecido a C++ o Java. Tiene algunas librerias interesantes y un sistema para instalarlas basado en repositorios, HaxeLib. Pero, como dice el refrán, un trozo de código vale más que mil comentarios Sticking out tongue . Veamos un ejemplo (el que viene en la documentación, por cierto):

Nota: ¡Cuidado con los nombres! Sucede como en Java, el nombre del fichero .hx debe ser igual al nombre de la clase que contiene. El nombre del .hxml no es crítico.

// -*- mode: haxe; coding: utf-8 -*-
 
// Test.hx
class Test {
    static function main() {
        trace("Hello World !");
    }
}
# compile.hxml
-swf test.swf
-main Test

Y para compilarlo, basta con:

CHROOT@Chumby:samples# haxe compile.hxml
CHROOT@Chumby:samples# ls
compile.hxml Test.hx test.swf
CHROOT@Chumby:~# file test.swf
test.swf: Macromedia Flash data (compressed), version 8

Si quieres probarlo, de nuevo hay que llevarlo al Chumby. Esto, al ser Flash, presenta varias alternativas. La más sencilla pasa por copiarlo a la partición NFS que montas en el Chumby, y ejecutarlo con el FlashPlayer que tiene dentro. También puedes crear un profile de los que usa el panel del aparato para que lo gestione él. Más abajo veremos la primera. La segunda opción se deja como ejercicio para el lector Eye-wink En Mixing local widgets into a chanel tienes algunos detalles…

Exportando por NFS

El objetivo es tener una carpeta donde podamos intercambiar ficheros con nuestro aparatito. Quizá lo más sencillo sea usar un PenDrive, pero montar una partición por NFS es sin duda mas cómodo a largo plazo. Como hay muchas recetas ya, simplemente enlazo una:

Como el Chumby lo usamos siempre como usuario root tenemos que tener en cuenta una funcionaldiad sobre seguridad hecha por NFS: no permite montar en modo escritura archivos pertenecientes al usuario “root” y grupo “root”. Ese caso es el nuestro, si montamos por NFS un directorio dentro del chroot. Para saltarnos esa feature tan sólo añadir a la línea de configuración del archivo /etc/exports la opción “no_root_squash”.

La parte de configuración del Chumby explica como montar esa partición para probar los tests.

Configurar el Chumby

Pues eso, veamos principalmente como configurar el Chumby para que monte la partición NFS automáticamente en el arranque. Antes de nada, es necesario que consigas acceso por ssh, permanente o no. Para ello, esta receta te viene que ni pintada Eye-wink :


Tenemos dos formas de automatizar el montado: usando un PenDrive o modificando los scripts de inicio del GNU/Linux.

La opción más sencilla sin duda es la del PenDrive, pero un tanto incómoda. Hacemos uso de una característica del GNU que lleva el cacharro: cuando arranca, comprueba si hay un fichero en el Pen, llamado debugchumby con permisos de ejecución. Si lo hay, lo ejecuta. Obviamente, lo que hacemos es crearlo y meter el comando pertinente:

#!/usr/bin/env sh
 
cd /mnt
mkdir nfs
mount -t nfs -o nolock 192.168.0.1:/home/user/chumby/mnt/nfs nfs

Por supuesto, cambia el comando con las opciones que quieras y que te apliquen.

Si quieres hacer esto mismo sin usar el pen, tienes que seguir estas recomendaciones: Running something at boot without debugchumby. Es un hack muy chapucero, y susceptible a fallos ante actualizaciones grandes del sistema. Se me ocurre otra forma de hacerlo, pero pasa por actualizar el firmware, así que será carne de otra receta Eye-wink

Hay una tercera, que no deja de ser un hack chapucero, pero que es menos peligroso. Se trata de editar el fichero /psp/.profile que se ejecuta cada vez que inicias sesión en el sistema. Tiene el inconveniente de que no se montará automáticamente, a menos que entres por SSH al Chumby. Si te vale, edita el fichero /psp/.profile y añade estas lineas (o algo análogo):

# Mount nfs partitions (oscarah)
if [ ! -d /mnt/nfs ]; then
  mkdir /mnt/nfs
  mount -t nfs -o nolock 192.168.0.1:/home/user/chumby/mnt/nfs /mnt/nfs
fi;

Una vez montado en NFS, puedes copiar allí los ejemplos de arriba y probarlos:

chumby:/# cd /mnt/nfs
chumby:/mnt/nfs# ls
test test.swf
chumby:/mnt/nfs# ./test
Hola desde el Chumby!
chumby:/mnt/nfs# stop_control_panel
stopping control panel

chumby:/mnt/nfs# chumbyflashplayer.x -i test.swf

El ejemplo en Flash debe verse desde el Chumby. No cambia la iluminación del display, por lo que si estaba en modo noche no se verá muy bien… Para recuperar el panel de control, simplemente usa start_control_panel.

Garantía de calidad

Esta receta la terminé de hacer en julio de 2008. Al momento de redactarla, probé todo en una Debian/SID recién instalada y actualizada. Y que conste que todo funcionaba… Sticking out tongue

Referencias

  1. Web oficial
  2. Chumby para desarrolladores
  3. Wiki de Chumby
  4. Entornos chroot con cdebootstrap en Debian
  5. La GNU ToolChain desde Chumby.com
  6. SSH en el Chumby
  7. Haxe, Flash para GNU

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Sería posible meterle el

Sería posible meterle el mplayer para escuchar streams mms?

Imagen de oscarah

Interesante...

Según el site de mplayer:

Most of time-critical parts are optimized for Intel/AMD (MMX/MMX2/SSE/SSE2/3DNow!/3DNowEx), PowerPC G4 (Altivec), SPARC (VIS), ARM PDAs and the Sony Playstation 2.

Por lo que deduzco que han pensado en optimizarlo para ARM, y quizá haya algún proyecto sobre el que basarse. De todos modos, no esperes muchas de las features de mplayer, ni que tenga que hacer mucho trabajo estresante, porque el Chumby no esta para esos trotes.

Suerte si te animas...
Saludos.
_________________________________________________________________________________________________________
"aviso: la dereferencia de punteros de tipo castigado romperá las reglas de alias estricto" -GCC 4.3.1-

"aviso: la dereferencia de punteros de tipo castigado romperá las reglas de alias estricto" --GCC 4.3.1

Muchas gracias por una

Muchas gracias por una receta tan interesante...

Una pregunta: lo del chroot debe ser porque no te fias de binarios compilados por chumby.com, ¿me equivoco?

Y si es así... ¿has probado a cross-compilar la toolchain estandar de Debian o a usar las precompiladas en www.emdebian.org a ver si funciona?

Salud,
Paco

Imagen de oscarah

Pues...

…lo del chroot sigue fundamentalmente tres razones:

  1. la instalación de la toolchain que dan los de chumby es un poco precaria, descomprimir en / no me inspira confianza. Si algo sale mal, puede dar ruido arreglarlo.
  2. me gustaba la idea de tener todas las herramientas, librerías, configuraciones, buildroot, etc para desarrollar con el chumby recogidas juntitas en un entorno diseñado a tal fin.
  3. nunca había probado a usar chroot, y ya era hora de trastear un poco Sticking out tongue

En lo que respecta a cross-compilar, no me lo había planteado, pero ahora que lo dices, me parece mejor idea. Lo voy a probar, si todo va bien, modifico la receta (o si alguien se siente con ganas… Smiling)

¡Gracias por la recomendación! Eye-wink
Saludos.
_________________________________________________________________________________________________________
“aviso: la dereferencia de punteros de tipo castigado romperá las reglas de alias estricto”, —GCC 4.3.1

"aviso: la dereferencia de punteros de tipo castigado romperá las reglas de alias estricto" --GCC 4.3.1