Grupo 4 Programación Distribuida - ASTROINGENIERIA/ASTROUFRO GitHub Wiki

Integrantes

  • Mauricio Acencio

Imagen Yocto para el Raspberry Pi

A continuación presento y explico, a partir de mi experiencia personal, el proceso de configurar, generar y montar una imagen Yocto específica para una Raspberry Pi. En mi caso, una Raspberry Pi 3 B+.

Prerrequisitos

SO; Distribución:

El ambiente para configurar yocto es relativamente específico: Debe realizarse en una distribución de linux que soporte oficialmente el proyecto yocto. En esta ocasión, el proceso toma lugar en Ubuntu 16.04 LTS. Se puede encontrar la lista de distribuciones soportadas aquí.

Paquetes requeridos:

Existe un conjunto de paquetes y librerías que requieren ser instaladas para la configuración y montaje de imágenes yocto, que en el caso de Ubuntu, son instaladas por medio del siguiente comando de terminal:

$ sudo apt-get install gawk wget git-core diffstat unzip texinfo gcc-multilib build-essential chrpath xterm libmcpp-dev

Instalación

Preparación del entorno

Creamos una carpeta dedicada para los proyecto yocto y la imagen de Raspberry Pi:

$ mkdir rpi

$ cd rpi

Dentro de la misma carpeta copiamos la última versión de yocto, específicamente la distribución denominada “poky”, desde el repositorio git:

~/rpi$ git clone -b sumo git://git.yoctoproject.org/poky

Entrando en la carpeta poky, dentro de la cual clonamos las siguientes librerías, correspondientes a las capas meta-layers en las que se basa la imagen yocto:

~/rpi$ cd poky
~/rpi/poky$ git clone -b sumo git://git.openembedded.org/meta-openembedded
~/rpi/poky$ git clone -b sumo git://git.yoctoproject.org/meta-security
~/rpi/poky$ git clone -b sumo https://github.com/meta-qt5/meta-qt5
~/rpi/poky$ git clone -b sumo git://git.yoctoproject.org/meta-raspberrypi
~/rpi/poky$ git clone -b rocko git://github.com/zeroc-ice/meta-zeroc.git
~/rpi/poky$ git clone -b sumo git://github.com/jumpnow/meta-rpi

Desde acá algunas instancias a destacar son:

  • OpenEmbedded es un framework de compilación cruzada para sistemas linux embebidos, como es este caso con Raspberry Pi
  • Qt5 es un suite que le otorga a la imagen yocto de un ambiente gráfico.
  • La capa meta-raspberrypi, la librería principal para la imagen de Raspberry Pi
  • La capa meta-zeroc, que corresponde al middleware Ice, que permite la aplicación de sistemas distribuidos.
  • La capa meta-rpi, distinta a meta-raspberrypi, que provee imágenes extra y scripts especiales que serán utilizadas más adelante.

Configuración del entorno

Ahora comienza la configuración de la imagen a montar, con la ejecución del script oe-init-build-env:

~/rpi/poky$ source oe-init-build-env

El que automáticamente genera y abre la carpeta build, la que contiene los archivos de configuración para la lectura de las librerías descargadas y la generación de la imagen linux de yocto.

bblayers.conf

A partir de aquí, se edita la lista de meta-layers en el archivo bblayers.conf en la carpeta conf:

~/rpi/poky/build$ nano conf/bblayers.conf

Acá se requiere expandir la lista presente para acomodar las capas provisionadas desde internet, más otras capas ya locales, necesarias para la correcta creación y funcionamiento de la imagen yocto.

Al final, la sección BBLAYERS debería lucir así:

BBLAYERS ?= " \
  ${HOME}/rpi/poky/meta \
  ${HOME}/rpi/poky/meta-poky \
  ${HOME}/rpi/poky/meta-yocto-bsp \
  ${HOME}/rpi/poky/meta-openembedded/meta-oe \
  ${HOME}/rpi/poky/meta-openembedded/meta-multimedia \
  ${HOME}/rpi/poky/meta-openembedded/meta-networking \
  ${HOME}/rpi/poky/meta-openembedded/meta-perl \
  ${HOME}/rpi/poky/meta-openembedded/meta-python \
  ${HOME}/rpi/poky/meta-qt5 \
  ${HOME}/rpi/poky/meta-security \
  ${HOME}/rpi/poky/meta-raspberrypi \
  ${HOME}/rpi/poky/meta-rpi \
  ${HOME}/rpi/poky/meta-zeroc \
  "

Se guarda (Ctrl + o; Enter) y se cierra (Ctrl + x) el archivo.

local.conf

El repositorio meta-rpi contiene una versión propia del archivo local.conf, que es preferible usar por sobre el original, por su preconfiguración, que requiere modificaciones mínimas.

Entonces, que se copia a la carpeta actual sobre escribiendo el mismo, quitando .sample de la extensión:

~/rpi/poky/build$ cp ../meta-rpi/conf/local.conf.sample conf/local.conf

~/rpi/poky/build$ nano conf/local.conf

Las modificaciones principales son:

  • Revisar que la variable MACHINE apunte, en este caso, a raspberrypi3.
  • Agregar los archivos Ice a la instalación de la imagen, agregando:
IMAGE_INSTALL_append = " zeroc-ice zeroc-ice-python"
TOOLCHAIN_TARGET_TASK_append = " zeroc-ice-dev zeroc-ice-staticdev"
TOOLCHAIN_HOST_TASK_append  = " nativesdk-zeroc-ice-dev"
  • Modificar la contraseña del usuario root:
# for no root passwd uncomment the following and comment the two extra user lines
#EXTRA_IMAGE_FEATURES = "debug-tweaks"

# for a root passwd, change jumpnowtek below to your password
INHERIT += "extrausers"
EXTRA_USERS_PARAMS = "usermod -P jumpnowtek root; "

Para utilizar una contraseña propia, se reemplaza en el lugar de jumpnowtek. En para este caso de prueba, se prefiere dejar la cuenta sin contraseña (No recomendable), Para lo cual, se comentan las 2 últimas líneas, y se des-comenta la 1ª:

# for no root passwd uncomment the following and comment the two extra user lines
EXTRA_IMAGE_FEATURES = "debug-tweaks"

# for a root passwd, change jumpnowtek below to your password
#INHERIT += "extrausers"
#EXTRA_USERS_PARAMS = "usermod -P jumpnowtek root; "
  • Agregar las siguientes líneas:
BB_NUMBER_THREADS ?= "${@oe.utils.cpu_count()}"
PARALLEL_MAKE ?= "-j ${@oe.utils.cpu_count()}"

Esto indica, según el número de núcleos procesadores presentes en el ordenador, el número máximo de tareas que el sistema puede realizar en paralelo durante el procesado de imágenes. Esto puede significar un gran ahorro de tiempo.

Creación de la imagen

Ahora el sistema está listo para generar una imagen yocto, usando bitbake, el motor de compilación cruzada utilizada en OpenEmbedded para yocto.

Se reinicializa el entorno de construcción:

~/rpi/poky/build$ cd ..

~/rpi/poky$ source oe-init-build-env

Y se genera la imagen console-image, provista por la librería meta-rpi:

~/rpi/poky/build$ bitbake console-image

Este proceso puede llegar a tardar horas, por lo que es necesario ser paciente. Inclusive, se recomienda dejar este proceso corriendo por la noche.

Copiar a tarjeta microSD

Una vez creada, la imagen puede ser formateada al medio físico requerido para una Raspberry Pi 3, una tarjeta microSD de al menos 8 GB (16 GB en este caso).

Aquí es donde la librería meta-rpi asiste una vez más: Con un conjunto de scripts para la copia de la imagen a la tarjeta:

~/rpi/poky/build$ cd ..

~/rpi/poky$ cd meta-rpi/scripts

Antes que nada, se utiliza el comando lsblk para identificar la tarjeta SD correcta en el sistema:

Ahora se le aplican los siguientes scripts, en el mismo orden:

  1. mk2parts.sh formatea la tarjeta con un mínimo de 2 particiones para alojar la imagen

~/rpi/poky/meta-rpi/scripts$ sudo ./mk2parts.sh sdb

  1. copy-boot.sh copia los archivos de la imagen a la tarjeta. Pero antes de esto, se requiere un par de pasos preliminares:
  • Si no existe ya, se necesita crear el siguiente punto de montaje desde el directorio raíz (lo que justifica el uso de sudo) para la copia de archivos:

~/rpi/poky/meta-rpi/scripts$ sudo mkdir /media/card

  • Exportar las siguientes variables a la sesión del terminal (esto cada vez que se ejecuten los scripts):

~/rpi/poky/meta-rpi/scripts$ export OETMP=~/rpi/poky/build/tmp

~/rpi/poky/meta-rpi/scripts$ export MACHINE=raspberrypi3

~/rpi/poky/meta-rpi/scripts$ ./copy-boot.sh sdb

  1. copy-rootfs efectivamente escribe el sistema de archivos en la tarjeta:

~/rpi/poky/meta-rpi/scripts$ ./copy_rootfs.sh sdb console

  • Nota: meta-rpi tambié dispone de la imagen qt5-image, con un entorno gráfico. En tal caso, debería indicarse qt5 en ves de console en el comando anterior.