Por Bill Courington y Gary Collins
Publicado en abril 2013
Linux y Java SE Embedded listos para ejecutar en Raspberry Pi en menos de una hora...
Es apenas más grande que una tarjeta de crédito. Cuesta casi lo mismo que un libro sobre programación en Java.
Es la computadora Raspberry Pi, que admite Java SE runtime completo para permitir la ejecución de aplicaciones de línea de comando incrustadas. Este artículo brinda una introducción a la programación de Java en Raspberry Pi e incluye los siguientes temas:
NOTA: existen muchas variaciones posibles de las instrucciones que se ofrecen aquí, en especial respecto de las operaciones que se ejecutan en el equipo host (computadora de escritorio o portátil) y las que se ejecutan en la Raspberry Pi. Utilice sus conocimientos y preferencias (y, quizá, algunos de los temas que se tratan en el apartado Ajustes y modificaciones opcionales de Linux) para crear un flujo de trabajo adecuado para usted.
Raspberry Pi
Raspberry Pi es una placa pequeña, de baja potencia, construida a partir de una CPU de 700 mHz ARMv6, con unidad de punto flotante (FPU) y procesador gráfico integrados en un único chip. El procesador gráfico y la CPU comparten 256 MB de memoria RAM. La placa incluye conexiones para USB, Ethernet, gráficos de alta definición, audio, tarjeta SD y E/S para fines generales. En la figura 1 se puede observar una Raspberry Pi modelo B con una tarjeta SD insertada como referencia del tamaño. La tarjeta SD desempeña una función especial: la Raspberry Pi arranca desde allí. Este artículo ofrece mayormente instrucciones para crear y modificar archivos en una tarjeta SD de arranque.

Figura 1 Raspberry Pi modelo B
Puede interactuar con la Raspberry Pi mediante un teclado y un mouse USB y un monitor o televisor HDMI (de hasta 1080 p). La conexión Ethernet de la placa brinda una opción adicional: interactuar desde un host conectado en red por medio de sesiones ssh. En la sección Ajustes y modificaciones opcionales de Linux de este artículo se describe cómo habilitar inicios de sesión seguros ssh.
Requisitos
Para configurar la ejecución de Java SE Embedded en la Raspberry Pi modelo B se debe contar con:
Instalación básica de Linux
Cuando la Raspberry Pi recibe alimentación, el firmware arranca desde la ranura de la tarjeta SD. Java SE Embedded se ejecuta en Linux, por lo tanto el primer paso consiste en instalar Linux en una tarjeta SD.
Descargue la imagen de Debian Squeeze Linux para Raspberry Pi
NOTA: las instrucciones que aquí se proporcionan corresponden a Debian Squeeze. Es probable que otras implementaciones de Linux para Raspberry Pi funcionen sin inconvenientes, pero es indispensable que hayan sido concebidas para las operaciones de punto flotante por software del chip ARM. Es probable que las imágenes a las que se incluyen vínculos en el sitio web de Raspberry Pi se hayan creado para unidades de punto flotante (hardware): no funcionan con Java SE Embedded.
En http://elinux.org/RPi_Distributions#Debian_ARM, encontrará un vínculo a una imagen comprimida de Debian Squeeze para Raspberry Pi. El archivo pesa aproximadamente 450 MB. En las siguientes instrucciones se presupone que ha descargado en un directorio nuevo ~/RaspberryPi/. Para comprobar el archivo descargado, siga las instrucciones SHA-1 Checksum de la página que se muestra cuando comienza la descarga.
Descomprima la imagen de la siguiente manera:
$ cd ~/RaspberryPi $ unzip *.zip
La descompresión crea un subdirectorio con un nombre similar a debian6-19-04-2012.
Copie la imagen de Debian Squeeze a la tarjeta SD
En su equipo host, halle el identificador de la tarjeta SD siguiendo las instrucciones que aparecen a continuación (proceda de un modo diferente si lo prefiere):
[ 110.084625] sdb: detected capacity change from 0 to 3963617280 [ 118.055249] sd 2:0:0:0: [sdb] 7741440 512-byte logical blocks: (3.96 GB/3.69 GiB) [ 118.059409] sd 2:0:0:0: [sdb] Assuming drive cache: write through [ 118.064547] sd 2:0:0:0: [sdb] Assuming drive cache: write through [ 118.066015] sdb: sdb1La clave es sdb, que indica que el identificador del dispositivo es /dev/sdb. sdb1 se refiere a la única partición de la tarjeta de nuestro ejemplo. Su tarjeta puede tener diversas particiones.
En las siguientes instrucciones se considera que el identificador de la tarjeta SD es /dev/sdb y que la tarjeta tiene una partición única sdb1. Modifique las instrucciones si su entorno lo requiere.
$ sudo umount /dev/sdb1
$ cd ~/RaspberryPi/debian6-19-04-2012 $ sudo dd if=yourDebian.img of=/dev/sdb bs=1M 1859+1 records in 1859+1 records out 1950000000 bytes (2.0 GB) copied, 212.344 s, 9.2MB/sLa operación de copiado mediante dden una tarjeta SD es lenta. Puede llevar entre 5 y 10 minutos en el caso de una tarjeta de 4 GB clase 4. El comando dd no ofrece indicación de progreso, de modo que es necesario aguardar pacientemente a que termine la tarea.
Si desea comprobar en este punto si la instalación de Linux en la tarjeta SD funciona correctamente, vaya a la sección Primer arranque y después vuelva a Cambio de tamaño de las particiones de la tarjeta SD.
Cambio de tamaño de las particiones de la tarjeta SD
La tarjeta SD contiene ahora tres particiones y espacio no asignado. A continuación, añadiremos el espacio no asignado al sistema de archivos de Linux para crear más lugar para Java SE Embedded y las aplicaciones. Para asignar espacio no asignado al sistema de archivos, modificaremos las particiones de la tarjeta SD eliminando y volviendo a crear una de las particiones y cambiando el tamaño de otra.
$ sudo gpartedGparted muestra inicialmente las particiones del disco del host. No modifique estas particiones.

Figura 2 Particiones iniciales de la tarjeta SD
Las tres particiones son
Aproximadamente la mitad del espacio de la tarjeta se encuentra sin asignar. La mayor porción del espacio libre sigue a la partición /dev/sdb3 . Para añadir ese espacio a /dev/sdb2 (el sistema de archivos), se debe eliminar temporalmente /dev/sdb3, ampliar /dev/sdb2y volver a crear a continuación /dev/sdb3.




Primer arranque
Nota: para llevar adelante estos pasos, debe tener los siguientes componentes conectados a la Raspberry Pi: monitor, teclado y cable Ethernet operativo.
$ sudo /etc/rc.local RaspberryIP
$ sudo update-rc.d -f ssh defaults 20
$ sudo sync; sudo shutdown -r nowSi el apagado lleva demasiado tiempo, puede apagar y encender la Raspberry Pi.
Ahora estamos en condiciones de leer y grabar la tarjeta SD de la Raspberry Pi mediante la red desde el equipo host.
Instalación de Java SE Embedded
En esta sección, se explica cómo usar el equipo host para descargar Java SE Embedded y copiarlo en el sistema de archivos de Linux de la Raspberry Pi a través de la red. A continuación, se muestra cómo descomprimir la descarga e iniciar Java también en forma remota.
Obtención del software de evaluación de Java SE Embedded


$ ssh pi@RaspberryIP mkdir /home/pi/java
$ scp ~/Downloads/*.gz pi@RaspberryIP:/home/pi/java
$ ssh pi@RaspberryIP $ cd /home/pi/java $ tar -zxvf *.gz ...
$ ls ejre* ejre1.7.0_04 $ cd ejre* $ ./bin/java -version java version "1.7.0_04-ea" Java(TM) SE Runtime Environment for Embedded (build 1.7.0_04-ea-b20, headless) Java Hotspot(TM) Embedded Client VM (build 23.0-b21, mixed mode)Es probable que algunos datos, como los números de versión y compilación, hayan cambiado desde que se escribió este artículo.
$ rm /home/pi/java/*.gz
Ajustes y modificaciones opcionales de Linux
Los comandos que se incluyen en esta sección pueden aumentar la confiabilidad, nivel de respuesta o practicidad de su sistema Raspberry Pi. Seleccione los que prefiera y ejecútelos en la Raspberry Pi. Para simplificar el diagnóstico de problemas, vuelva a arrancar el sistema después de introducir cada modificación.
En esta sección:
Configurar una dirección IP estática
Si su red reutiliza direcciones IP dinámicas, puede omitir el cambio a una dirección IP estática porque la dirección IP de la Raspberry Pi será en efecto constante. Si es probable que la dirección IP dinámica de la Raspberry Pi sea diferente en cada arranque del sistema, conviene configurar una dirección IP estática pues es mejor para el inicio de sesión ssh. En las siguientes instrucciones se presupone que usted desea asignar el nombre de host raspberrypi a la Raspberry Pi.
Comience abriendo /etc/hosts como superusuario en un editor de texto (p. ej., sudo vi /etc/hosts). Agregue una línea para la Raspberry Pi, que deberá incluir una dirección IP estática válida en su red, un nombre de dominio opcional y alias. A continuación se ofrece un ejemplo hipotético en el que identificamos la Raspberry Pi como raspberrypi:
raspberrypi: 127.0.0.1 localhost 192.168.0.100 raspberrypi.yourDomain raspberrypi loghost
Guarde el archivo y salga del editor.
Abra como superusuario /etc/hostname en un editor de texto. Agregue una línea similar a la siguiente:
raspberrypi
Guarde el archivo y salga del editor.
Las siguientes instrucciones le permitirán evitar que la sobrecarga de la red haga que el sistema operativo cambie la dirección IP estática de la Raspberry Pi. En caso de producirse el cambio de dirección, el inicio ssh u otras operaciones que usan la dirección IP estática dejarían de funcionar.
Halle la dirección del hardware del puerto de Ethernet mediante los pasos siguientes.
Primero, determine el nombre del controlador de Ethernet (lasx representan los dígitos de la dirección):
$ ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1488 qdisc pfifo_fast state UNKNOWN qlen 1000 link/ether b8:27:eb:b5:e8:90 brd ff:ff:ff:ff:ff:ff inet xx.xxx.xxx.xx/xx brd xx.xxx.xxx.xxx scope global eth0
En este ejemplo, es eth0. La dirección del hardware son los dígitos hexadecimales que siguen a link/ether; en este ejemplo, b8:27:eb:b5:e8:90.
Ahora que conoce la dirección de hardware del controlador de Ethernet, abra como superusuario /etc/network/interfaces en un editor de texto y agregue líneas similares a las que siguen al comentario # New entries que se muestra a continuación, reemplazando los datos del ejemplo por los de su red.
# Used by ifup(8) and ifdown(8). See the interfaces(5) manpage or # /usr/share/doc/ifupdown/examples for more information. auto lo iface lo inet loopback # # New entries to support static IP follow: auto eth0 iface eth0 inet static hwaddress ether b8:27:eb:b5:e8:90 address 192.168.0.100 network 192.168.0.0 netmask 255.255.255.0 broadcast 192.168.0.255 gateway 192.168.0.1
Habilitar el intercambio y optimizar el tiempo de acceso al sistema de archivos
El intercambio se encuentra deshabilitado en forma predeterminada en Debian Linux. Si una operación excede los 256 KB de RAM de la Raspberry Pi, el sistema falla. Otro problema menos grave es que, también en forma predeterminada, el sistema de archivos pierde tiempo manteniendo datos del acceso más reciente a cada archivo, lo que resulta de escasa utilidad en el caso de aplicaciones incrustadas. Mantener datos sobre accesos más recientes, además, puede reducir la vida útil de una tarjeta SD. Ambas conductas predeterminadas se especifican en el archivo /etc/fstab .
Abra como superusuario /etc/fstab en un editor como vi. El archivo se ve así:
proc /proc proc defaults 0 0 /dev/mmcblk0p1 /boot vfat defaults 0 0 #/dev/mmcblk0p3 none swap sw 0 0
Para habilitar el intercambio, quite las marcas de comentario de la tercera línea.
NOTA: en una tarjeta SD, el intercambio es lento. En el caso de aplicaciones incrustadas, conviene administrar la memoria de manera de evitarlo.
Para eliminar la sobrecarga asociada a mantener datos sobre accesos más recientes, inserte un punto de montaje p2 entre p1 y p3. Las opciones noatime y nodiratime son las indicadas para lograr el resultado buscado. Cuando el archivo quede como se muestra a continuación, guárdelo y salga del editor:
proc /proc proc defaults 0 0 /dev/mmcblk0p1 /boot vfat defaults 0 0 /dev/mmcblk0p2 / auto rw,noatime,nodiratime,errors=remount-ro 0 1 /dev/mmcblk0p3 none swap sw 0 0
Asigne p3 (la partición de intercambio que se creó en el host como /dev/sdb3) como espacio para intercambio:
$ sudo mkswap /dev/mmcblk0p3
Definir la zona horaria y configuración regional
En forma predeterminada, la Raspberry Pi está configurada para la zona horaria Europa/Londres y la región en_GB_UTF-8. Para modificar la configuración regional de su computadora, proceda de la siguiente manera.
Para cambiar la zona horaria, escriba el siguiente comando:
$ sudo dpkg-reconfigure tzdata
Se muestra una interfaz gráfica falsa.

Desplace el cursor de selección por las regiones y ciudades con las teclas de flecha arriba y abajo. Para seleccionar <Ok> (aceptar) o <Cancel> (cancelar), use las flechas derecha e izquierda. Para aceptar una selección, pulse la tecla de retorno
Defina la configuración regional de la siguiente manera:
$ sudo dpkg-reconfigure -p low locales
La interfaz de usuario es similar a la que se emplea para definir la zona horaria.
Configurar un servidor horario
Muchas operaciones, entre ellas las actualizaciones de paquetes de software, dependen de que la fecha y la hora sean correctas. Para definir la fecha y la hora en forma automática, averigüe la identidad del servidor horario de la red y, a continuación, ejecute el siguiente comando:
$ sudo ntpdate yourNTPServer
Para definir la hora en cada arranque, modifique como superusuario /etc/rc.local y agregue la siguiente línea antes de la salida del código:
ntpdate yourNTPServer
Configurar un proxy de Internet
Haga ping a un host de Internet conocido, como www.lego.com. Si el host no responde, averigüe si su red está detrás de un proxy y, si fuera necesario, defina la variable de entorno http_proxy según las convenciones de su red, por ejemplo (caso hipotético):
$ sudo export http_proxy =’http:192.168.0.1:3128’
Para definir el proxy cada vez que inicia sesión, agregue el comando de exportación a ~/.bash_profile u otro equivalente si usa un shell distinto.
Cambiar las funciones y distribución del teclado
Use este comando si las teclas no se interpretan de manera correcta o si desea cambiar la distribución del teclado:
$ sudo dpkg-reconfigure keyboard-configuration
La interfaz de usuario es similar a la que se describió en la sección Definir la zona horaria y configuración regional de este artículo.
Actualizar paquetes de Debian
Antes de actualizar los paquetes que se distribuyen con Debian, abra /etc/apt/sources.list como superusuario en un editor de texto. Este archivo contiene las ubicaciones del repositorio de paquetes nuevos o actualizados. Tal como se distribuyen, las ubicaciones incluyen ftp.uk en sus URL. Si usted no se encuentra en Gran Bretaña, puede mejorar el rendimiento modificando las entradas para incluir una ubicación física más próxima. Por ejemplo, si está en Estados Unidos puede cambiar ftp.uk a ftp.us en general. En el sitio http://ftp.debian.org/debian/README.mirrors.html se brinda información sobre ubicaciones de repositorios de Debian.
Para actualizar los paquetes instalados, compruebe que la Raspberry Pi esté conectada a Internet y, a continuación, escriba estos comandos:
$ sudo apt-get update $ sudo apt-get upgrade
Si se muestra un mensaje que señala que hay duplicados en la lista de paquetes, vuelva a abrir /etc/apt/sources.list en un editor y coloque marcas de comentario en una de las entradas duplicadas. Suele convenir conservar la entrada que contiene más información.
Iniciar la interfaz gráfica de usuario automáticamente
Si desea que el sistema de ventanas se active en forma automática cuando inicia sesión localmente en la Raspberry Pi, cambie el nivel de ejecución predeterminado de la siguiente manera. Abra como superusuario /etc/inittab en un editor de texto. Busque la siguiente entrada:
# The default runlevel. id:2:initdefault: Reemplácela por 5: # The default runlevel. id:5:initdefault:
NOTA: los gráficos consumen una gran porción de la memoria RAM de la Raspberry Pi, del orden de los 90 MB.
Agregar un explorador web
Si tiene problemas con el explorador web predeterminado midori, intente con iceweasel:
$ sudo apt-get update $ sudo apt-get install iceweasel
Habilitar sonido
La salida de audio de Raspberry Pi no está habilitada en forma predeterminada. Para habilitarla, abra como superusuario /etc/modules en un editor de texto. Agregue esta línea al final del archivo:
snd_bcm2835
Guarde y cierre el archivo. Al volver a arrancar la Raspberry Pi, el sonido estará habilitado.
Publicado por Bill Courington y Gary Collins.
