Requirements
If you don’t have Remote Terminal Access to the device and you want to install the Update Module in runtime, you must have the single-file
update module already as part of your rootfs, just check if the /usr/share/mender/modules/v3/single-file
file exist. If not, then you must include it as part of a regular image OTA update, either for a Yocto-based system or a Debian-based one.
Context
What counts as an “application update” can vary greatly – a single file, a whole directory, even a container image. This makes it hard to have a single, rigid update method. Mender’s Update Module framework provides a flexible solution, allowing you to tailor application updates to your specific needs.
Update Modules are executable files residing in the /usr/share/mender/modules/v3
directory (note: v3 represents the current protocol version). The Mender Client uses a defined parameter set to execute these modules, facilitating the update process.
The “Single File Update Module” installs a file of your choice into a specified directory on the device, and we are going to take advantage of it in this tutorial. You can read more about this Update Module in here.
Update Module creation
The structure of the Update Module require the definition of one or more states from the Mender State Machine.
For this example, we will take the simplest one described in Mender’s docs:
cat << "EOF" > dummy-mender-module
#!/bin/bash
set -e
STATE="$1"
FILES="$2"
case "$STATE" in
ArtifactInstall)
cp "$FILES"/files/* /opt/
;;
esac
exit 0
EOF
This one will create a Mender Update Module named dummy-mender-module
.
Installation
On run time
With Remote Terminal Access
If you already have Remote Terminal access, either by using the Mender’s Troubleshooting add-on, SSH or any other protocol, you can just add the recently created file inside /usr/share/mender/modules/v3
, just don’t forget to make it executable with chmod +x my-module
.
And that’s it, any folder used in the Update Module like /opt
must be created upfront.
Without Remote Terminal Access
For this one, we will create an single-file
update module, following pretty similar steps as the ones in this tutorial with some tweaks:
Download single-file-artifact-gen, by running the following command:
wget https://raw.githubusercontent.com/mendersoftware/mender/master/support/modules-artifact-gen/single-file-artifact-gen
Make it executable:
chmod +x single-file-artifact-gen
And let’s create a file that will be used to set the executable permissions:
echo "+x" > permissions
Notice the FILE
is the one we created above (dummy-mender-module
) and the DEST_DIR
the Update Modules path. Feel free to choose any ARTIFACT_NAME
, OUTPUT_PATH
and select a DEVICE_TYPE
that matches with the device_type
reported to the client as part of the device’s inventory. Notice the last -f
to make sure it will be executable in the device side.
ARTIFACT_NAME="my-update-1.0"
DEVICE_TYPE="my-device-type"
OUTPUT_PATH="my-update-1.0.mender"
DEST_DIR="/usr/share/mender/modules/v3/"
FILE="dummy-mender-module"
./single-file-artifact-gen -n ${ARTIFACT_NAME} -t ${DEVICE_TYPE} -d ${DEST_DIR} -o ${OUTPUT_PATH} ${FILE} -- -f permissions
Now you can deploy this artifact by using Mender and your device will have installed the new Update Module.
On build time
Just add the created Update Module by following: