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 ameta-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
MACHINEapunte, en este caso, araspberrypi3. - 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:
- 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
- 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
- copy-rootfs efectivamente escribe el sistema de archivos en la tarjeta:
~/rpi/poky/meta-rpi/scripts$ ./copy_rootfs.sh sdb console
- Nota:
meta-rpitambié dispone de la imagenqt5-image, con un entorno gráfico. En tal caso, debería indicarseqt5en ves deconsoleen el comando anterior.