Konsulko Group has made many upstream contributions to OTA (over-the-air) update solutions for embedded Linux devices. RAUC is a popular open source option as it has been meticulously developed with a keen emphasis on stability, security, and adaptability. Notably, RAUC seamlessly integrates with major build systems such as Yocto Project/OpenEmbedded, Buildroot, and PTXdist.
Functioning across diverse usage scenarios, one of RAUC’s elementary yet impactful functionalities is the A/B update mechanism. In this setup, two identical root filesystems, denoted as A and B, are maintained. The device boots from one of these, while the other serves as the target for updates.
Post-update completion, the bootloader directs the system to boot from the freshly updated partition during the subsequent system startup. RAUC incorporates the ‘verity’ update bundle format. It extends the capabilities of RAUC by introducing built-in support for HTTP(S) network streaming, adaptive delta-like updates, and comprehensive update bundle encryption.
In previous blog posts, Konsulko Group engineers have demonstrated RAUC on Raspberry Pi and NXP devices such as SolidRun Cubox-i and HummingBoard. Recently Leon Anavi, Konsulko Group Senior Engineer and maintainer of meta-rauc-community ported RAUC to BeagleBone Black.
This article provides, as an example, the exact steps how to integrate RAUC with Yocto Project and OpenEmbedded for booting from a microSD card on BeagleBone Black.
Released in 2013, BeagleBone Black is a single-board computer (SBC) developed by the BeagleBoard.org Foundation. It was certified by the Open Source Hardware Association with OSHWA UID US000236. The chipset on BeagleBone Black is Texas Instruments Sitara AM3358 with 1GHz ARM Cortex-A8 CPU and SGX 3D graphics engine. Because of this the demonstrated integration is a suitable reference for other embedded devices equipped Texas Instruments chipsets.
The hardware used for this step by step tutorial is:
- BeagleBone Black
- 32GB microSD card
- UART to USB adapter
- 5V DC power supply
Building a Linux Distribution with RAUC
RAUC, a robust and powerful open-source solution, demands advanced skills for initial integration. In general, to incorporate RAUC in a Yocto Project and OpenEmbedded image for BeagleBone Black the following actions have to be performed:
- Use U-Boot as a bootloader
- Enable SquashFS in the Linux kernel configuration
- Use ext4 root file system
- Design specific storage partitioning for the certain use case and configure RAUC accordingly
- Provide a custom U-Boot script to properly switch between RAUC slots
- Prepare a certificate and keyring to use for signing and verifying RAUC update bundles.
Leon Anavi has already done all these actions for
core-image-minimal in Yocto/OpenEmbedded layer meta-rauc-community/meta-rauc-beaglebone. The layer is available at GitHub. Please follow the steps below to build
core-image-minimal for BeagleBone Black with it:
- Download the long term support (LTS) release Kirkstone reference Yocto distribution, Poky:
git clone -b kirkstone https://git.yoctoproject.org/poky poky-rauc-bbb
- Download the meta-rauc layer:
git clone -b kirkstone https://github.com/rauc/meta-rauc.git
- Download meta-rauc-community layers, including meta-rauc-beaglebone:
git clone https://github.com/rauc/meta-rauc-community.git
- Download the meta-openembedded layer as it provides a recipe for
nanowhich will be used for the demonstration:
git clone -b kirkstone git://git.openembedded.org/meta-openembedded
Initialize the build environment:
- Include all layers in
bitbake-layers add-layer ../meta-openembedded/meta-oe
bitbake-layers add-layer ../meta-rauc
bitbake-layers add-layer ../meta-rauc-community/meta-rauc-beaglebone
conf/local.confby appending the following configurations to the end of the file:
MACHINE = "beaglebone-yocto"
# Use systemd as init manager
INIT_MANAGER = "systemd"
# Add RAUC to the image
IMAGE_INSTALL:append = " rauc"
DISTRO_FEATURES:append = " rauc"
- Build a minimal bootable image:
The image creation process from scratch is time-consuming, encompassing various Yocto/OpenEmbedded recipes and configurations. Kindly await completion as bitbake diligently executes each tasks.
tmp/deploy/images/beaglebone-yocto/core-image-minimal-beaglebone-yocto.wic.xzto microSD card.
- Attach the USB-to-UART adapter to BeagleBone Black, plug the ethernet cable and the microSD card.
Press and hold button S2 while plugging in the 5V DC power supply to turn on BeagleBone Black and boot from microSD card.
BeagleBone black board has an onboard button labeled as S2. It is situated near the microSD card slot. Press and hold it while powering the board to boot from microSD card.
- Verify that the system boots successfully, log in as user
rootwithout a password and check RAUC status:
On the screenshot BeagleBone Black has been booted from RAUC slot
rootfs.0 (A) on the microSD card.
NOTE: The meta-rauc-beaglebone layer includes a
core-image-minimal.bbappend file, housing essential configurations for RAUC functionality. Apply these configurations similarly to other images intended for use in your embedded Linux device.
Creating a RAUC Update Bundle
A RAUC update bundle comprises the file system image(s) or archive(s) designated for system installation, accompanied by a manifest detailing the images for installation, encompassing options and meta-information. Additionally, it may include scripts designated for execution before, during or after the installation process. To sign and verify the update bundles RAUC uses SSL keys. Layer meta-rauc-beaglebone contains a keyring containing all keys and a recipe for a simple RAUC update bundle for demonstration purposes only.
Follow the steps below to create RAUC update bundle that extends the system by adding the popular text based editor
- Add to
IMAGE_INSTALL:append = " nano"
- Build the RAUC update bundle:
Following a successful execution, bitbake will produce the
Updating BeagleBone Black with RAUC
Follow the steps below to update
core-image-minimal running from a microSD card on BeagleBone Black:
- Start a Python 3 web server on the build machine or another computer where the RAUC update bundle (aka
update-bundle-beaglebone-yocto.raucb) is available and within the same network as BeagleBone Black, for example:
pip3 install --user rangehttpserver
python3 -m RangeHTTPServer
- On BeagleBone Black replace
<IP>with the actual IP address of the computer on which the HTTP server is running and execute the following command to install the update:
rauc install http://<IP>:8000/update-bundle-beaglebone-yocto.raucb
The screenshot show successful installation of the RAUC updated bundle on BeagleBone Black.
- Reboot BeagleBone Black to load the updated version:
NOTE: As alternative, instead of using an HTTP server, you can transfer the update bundle to BeagleBone Black and install it from local storage.
- Verify that
nanowas added to the system:
- Check RAUC status to confirm the system have booted from the second partition:
On the screenshot, after sucessful installation of the RAUC update bundle, BeagleBone Black has been booted from RAUC slot
rootfs.1 (B) on the microSD card. This slot contains
In real-world product development, the Yocto Project and OpenEmbedded workflow can be enhanced with a few commands for easy implementation of continuous integration (CI).
From the dawn of OpenEmbedded and the Yocto Project, Konsulko engineers have been community contributors and guides for crafting commercial products. Our expertise spans RAUC, Mender, and various open-source solutions for top-notch software updates. Please get in touch with us to discuss how Konsulko engineers can help your own embedded product development.