En el mundo del desarrollo de software muchas veces se requiere compilar aplicaciones para arquitecturas o sistemas diferentes al equipo donde se compila, esto requiere en muchos casos tener equipos adicionales, por ejemplo para compilar aplicaciones que funcionen en Raspberry pi, se debe compilar directamente en la tarjeta, o por medio de una compilación cruzada que cuando no se tiene experiencia en ello puede resultar "tediosa". En otros casos aunque se disponga de un Raspberry, las limitaciones de hardware (memoria RAM o tamaño de partición Swap) no permiten realizar la compilación directamente en la tarjeta.
Es posible configurar una maquina virtual de Raspbian utilizando la herramienta Qemu pero yo mostrare una forma diferente construyendo un sistema enjaulado completo de raspbian sobre un sistema anfitrión en GNU/Linux, permitiendo utilizar todos los recursos de hardware de la maquina anfitrión y garantizando que el software compilado funcionara perfectamente en la placa de Raspberry Pi.
Algunos conceptos básicos
¿Que es un sistema enjaulado?
Básicamente un sistema enjaulado se refiere a una instalación completa de un sistema operativo (SO) en un directorio del SO anfitrión lo que permite tener la libertad de hacer pruebas o instalaciones sin colocar en peligro nuestro sistema base, ya que todo lo que ocurra en el directorio enjaulado se queda allí y no existe ninguna manera de acceder desde allí al SO anfitrión. Otra ventaja es la posibilidad de tener diferentes distribuciones y arquitecturas corriendo en una misma maquina, lo que permite al desarrollador de software corroborar el funcionamiento para todas las arquitecturas y distribuciones de interés.
Es la herramienta que permita la instalación de un sistema Debian en un directorio de otro sistema ya instalado, o dicho de otra forma, es la herramienta que permite la creación del sistema enjaulado.
¿Como enjaular Raspbian?
Para crear un sistema enjaulado para Raspberry Pi sobre un sistema Debian se requiere instalar las siguientes dependencias:
#apt install qemu qemu-user qemu-user-static binfmt-support debootstrap
luego se debe crear el directorio de trabajo, yo recomiendo instalarlo en el directorio /home/ ya que si se tienen particiones separadas en caso de una reinstalación del sistema operativo base, se evita eliminar la jaula por accidente.
Como root se ejecuta en la terminal las siguientes instrucciones:
Crear el directorio enjaulado
# mkdir /home/raspberry
Se construye el sistema enjaulado, en este caso utilizando la distribución Debian jessie y arquitectura armhf.
# debootstrap --foreign --no-check-gpg --include=ca-certificates --arch=armhf jessie /home/raspberry ?http://mirrordirector.raspbian.org/raspbian/
Configurar el sistema para que utilice el kernel ARM de Qemu
# EXTRA_OPTS="-L/usr/lib/arm-linux-gnueabihf"
# cp $(which qemu-arm-static) /home/raspberry/usr/bin
# chroot /home/raspberry /debootstrap/debootstrap --second-stage
En este punto el sistema se encuentra instalado y configurado, para entrar y comenzar a utilizarlo se ejecuta como usuario root
#chroot /home/raspberry/
En este momento ya se tiene el sistema Raspbian jessie corriendo en un equipo anfitrión Debian stretch y se puede utilizar normalmente como si se tratara de la placa Raspberry Pi con la ventaja de tener un hardware mas potente (el equipo anfitrión) y la desventaja de que en este punto solo se puede trabajar por la terminal, ahora puede ser necesario montar algunos directorios del sistema en el directorio enjaulado como el /proc ó un directorio de trabajo, para ello creas el directorio de trabajo en el sistema enjaulado y se agregan las siguientes lineas al fichero /etc/fstab
/proc /home/raspberry/proc auto bind 0 0
/home/$USERNAME/proyectos /home/raspberry/proyectos/ auto bind 0 0
y se monta con el comando
# mount -a
NOTA: en caso de querer eliminar por algún motivo el directorio enjaulado, primero debes desmontar todos los directorios pertenecientes al sistema anfitrión o se corre el riesgo de perdida de datos.
# umount /directorio/a/desmontar
Espero este pequeño tutorial pueda servir de ayuda, próximamente publicare otra entrada con la utilización de interfaz gráfica para un sistema enjaulado