Get the highlights in your inbox every week.
Update devices remotely with this open source tool | Opensource.com
Update devices remotely with this open source tool
Handle all your complete device updates, including firmware and bootloaders, over the air with UpdateHub Community Edition.
The ability to access, connect, and manage multiple devices remotely through a single account is important. Going a step further, being able to completely update devices remotely is another way for sysadmins to reduce effort and minimize headaches.
UpdateHub is an open source solution that allows you to do complete device updates, including firmware and bootloaders, remotely. Its goal is to make it easier to do device updates and reduce rework and risk, whether you're updating thousands of devices or managing small deployments. UpdateHub handles all aspects of over-the-air (OTA) updates, including package integrity and authenticity, while you take care of your other work.This step-by-step guide to UpdateHub aims to help you get started with this professional tool. There are two UpdateHub server options: UpdateHub Cloud and UpdateHub Community Edition (UpdateHub CE), a fully open source server (distributed under the MIT License), which is what this tutorial uses.
Check the requirements
First, make sure your Linux distribution has installed all the required packages to build an image using the Yocto Project.
You also need the following hardware:
- Target is the development device. This tutorial uses a Raspberry Pi 3 Model B+, but you could also use a Raspberry Pi 3, Model B, or Model B+.
- Host is the computer where you will build the image using the Yocto Project. This tutorial uses Yocto 3.1 Dunfell.
On Debian and Ubuntu distros, install repo with:
sudo apt install repo
If you're using another Linux distribution, download repo directly and set your distro with:
curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
Finally, you need network connectivity via DHCP, or you must know how to change the internet protocol (IP) address or to create a Yocto Project layer that handles this configuration.
Prepare your environment for the build
UpdateHub provides a repository with a manifest file used by the repo tool, which makes it easier to manage multiple layers.
Download the source code by creating a directory and fetching the necessary Yocto Project layers:
repo init -u https://github.com/UpdateHub/updatehub-yocto-project-reference-platform.git -b dunfell
repo sync command completes, you will see all the layers you need in the
The UpdateHub platform provides support for multiple supported devices. During the Yocto Project environment setup, it will ask if you want to accept the end-user license agreement (EULA) of the
meta-freescale layer; this is not necessary for this project.
Load the Yocto Project environment:
MACHINE="raspberrypi3" source ./setup-environment build
Note that this command is valid only for the terminal session where you loaded the environment. If you use a new terminal, you will need to load the environment again. However, you won't need to configure the machine again because the configuration content is stored in the
Start UpdateHub CE
With Docker installed, download the Docker image and start the server on port 8080:
docker run -d -p 8080:8080 updatehub/updatehub-ce:latest
Access the UpdateHub CE dashboard through the host IP address and port 8080 (
http://IP_ADDRESS:8080). The host IP in the example is 192.168.15.50, so that would be
Use the default of
admin for the login and password, and click Login.
You need to configure the
UPDATEHUB_SERVER_URL to use the UpdateHub CE address because the device needs to know the server's IP address. By default, the
meta-updatehub layer uses the UpdateHub Cloud address in the server URL variable.
You should see UpdateHub CE's main interface:
Configure the environment to generate the image
The next step is to generate the Linux image that will be used by the device. But first, you need to set up some variables in the
UPDATEHUB_SERVER_URL = "http://IP_ADDRESS:8080"
UPDATEHUB_PACKAGE_VERSION_SUFFIX = "-test-image-1"
ENABLE_UART = "1"
UPDATEHUB_POLLING_INTERVAL = "1m"
Going line by line in the above code:
UPDATEHUB_SERVER_URLcontains the IP address where UpdateHub CE is running.
UPDATEHUB_PACKAGE_VERSION_SUFFIXadds a suffix in the image version. This is useful for placing a version number and incrementing it for each new image. This variable will be the
VERSION_ID, which is composed of the
DISTRO_VERSION(described in the docs) plus the
UPDATEHUB_PACKAGE_VERSION_SUFFIX. You can verify this in the
/etc/os-releasefile in the target.
ENABLE_UART: There are several ways to access the target device, such as using the serial console or connecting a keyboard and a monitor. This variable allows access to a serial console on a Raspberry Pi by using the serial ports available on the GPIO header.
UPDATEHUB_POLLING_INTERVAL: By default, communication between UpdateHub's agent and server happens every 24 hours. Use this variable to set up a new consultation time of 1 minute.
Generate the image
Now that the Yocto Project environment is ready, compile the image using the BitBake task-execution engine by running:
Image generation can take a while, depending on the host machine. If this is the first time you are building an image for
raspberrypi3 in Yocto's Dunfell branch, BitBake will download the entire source code, so your download speed will influence the time it takes to generate the image.
Once the image is compiled, navigate to the
build/tmp/deploy/images/raspberrypi3/ host directory and verify the image file,
updatehub-image-minimal-raspberrypi3.wic.gz, is there.
Insert an SD card into your Raspberry Pi and check its name by running
dmesg. Then flash the image to your SD card with the following command, but make sure to change
/dev/sdX to your SD card name:
zcat updatehub-image-base-raspberrypi3.wic.gz | sudo dd of=/dev/sdX
Insert the imaged SD card into the target device to connect to Raspberry Pi. The image has a network configured to obtain an IP address using DHCP. Access the console with user
root and leave the password empty.
Confirm the version of the image running on the target using
Generate the update package
Your device should be running and working correctly, but you need to add the feature to create an update package. This creates an image to update your target. The following example adds support for an SSH server on the target and creates an update package to install this functionality.
Add support for the OpenSSH server by adding the following line to the
IMAGE_FEATURES += "ssh-server-openssh"
To make it clear that the updated image will have another version, put the suffix
-test-image-2 in the
UPDATEHUB_PACKAGE_VERSION_SUFFIX = "-test-image-2"
Save the file and run:
bitbake updatehub-image-base -c uhuarchive
This command generates a file with a
.uhupkg extension, a format used by UpdateHub to update the system. The generated file will be in the same directory as the images are,
tmp/deploy/images/raspberrypi3; in this example, that's
Check your device
To access the UpdateHub CE dashboard, click the Devices tab to see if your device is listed:
Send an update package
UpdateHub CE dashboard's Packages tab shows a list of available packages, but you do not have any yet. To add a package, click the Upload Package button, and select the
updatehub-image-minimal-raspberrypi3.uhupkg file. In this example, it is in
tmp/deploy/images/raspberrypi3/directory. A screen showing the package details will appear. This shows the process of adding an update package to the dashboard:
Create a rollout
With the device recognized and the packet sent to the server, you can create a rollout, which is essentially a deployment plan. Navigate to the Rollouts tab and click Create Rollout. Choose which package version you want to use in the upgrade. This example only has the package from the previous step, with version
20.04-test-image-2. Choose this version, and make sure it includes the list of devices that will be updated.
Previously, you configured the image running on the target to perform an update query on the UpdateHub server every minute, so within one minute of creating the rollout, the update process will start. To track the update status, check the Rollouts tab.
After finishing an upgrade process, the target reboots automatically. The new image boots up and automatically queries the server for updates. The server responds that it does not have any updates and ends the update cycle.
When the status shows
updated, run the command below on the host to access the target over SSH:
No password is required; just press Enter, and you will be in the target console. You can check the version in the
/etc/os-release file to confirm.
Congratulations! You're done!
Now you have access to a professional tool to update your devices remotely. This tutorial used a Raspberry Pi 3 with the Yocto Project version Dunfell 3.1.2, but other devices and versions are supported.
This article is based on UpdateHub: Sending OTA Updates using the Yocto Project on UpdateHub's blog.