Linux
boards IoT-LAB A8-M3
Description
The open Linux nodes of IoT-LAB (the IoT-LAB A8-M3 boards, and the Raspberry Pi and NVIDIA Jetson nodes) boot a Debian or Ubuntu system over the network. The root filesystem is an OCI image, built with Docker (see iot-lab-open-linux): the same image you can pull, inspect and extend on your computer. You can also boot your own image, built on top of the IoT-LAB one, see Your own image.
The images are Debian 13 (trixie), except on the NVIDIA Jetson nodes, which need the Ubuntu system of NVIDIA (Jetson Nano, Jetson Orin).
The nodes of the sites that are not migrated yet still boot the deprecated Yocto image.
Images of the nodes
| Node | Default image | System | Platform | Docker |
|---|---|---|---|---|
| IoT-LAB A8-M3 | fitiotlab/iot-lab-open-linux-iotlab |
Debian 13 (trixie) | linux/arm/v7 |
no |
| Raspberry Pi 4 | fitiotlab/iot-lab-open-linux-iotlab |
Debian 13 (trixie) | linux/arm/v7 |
yes |
| Raspberry Pi 5 | fitiotlab/iot-lab-open-linux-iotlab |
Debian 13 (trixie) | linux/arm64 |
yes |
| NVIDIA Jetson Nano | fitiotlab/iot-lab-open-linux-jetson-nano |
Ubuntu 18.04 (Jetson Linux R32) | linux/arm64 |
yes |
| NVIDIA Jetson Orin | fitiotlab/iot-lab-open-linux-jetson-orin |
Ubuntu 22.04 (Jetson Linux R36) | linux/arm64 |
yes |
The images are on Docker Hub. Their
version is the org.iot-lab.linux-base.version label; the sites run version
1.0.4.
On the A8-M3 nodes, the image provides the tools of the M3 co-microcontroller:
iotlab_flash, iotlab_reset, iotlab_debug, and its serial port
/dev/iotlab/ttyA8_M3.
Root filesystem of the nodes
- Each node of an experiment gets its own root filesystem, writable, as root. What you install or change on a node is on that node only.
- It is removed at the end of the experiment: the next experiment on the node starts from the image again.
/root/sharedis your~/shareddirectory of the SSH frontend, mounted on every node of your experiments: put there what all the nodes need, or what you want to keep.
With the Yocto image, the nodes of an experiment shared one root filesystem. To have the same software on all the nodes now:
- build it in your own image: every node of the experiment boots it;
- or install it on all the nodes at once from the frontend with the
SSH CLI:
iotlab-ssh run-cmd "apt-get install -y <package>"; - or put your programs and data in
~/shared.
Web shell
Open a root shell on a node without SSH client or key:
- in the web portal, click
Open Shellon the node in the view of your running experiment -
from your computer, with ws-cli-tools:
iotlab-ws-shell a8-1.grenoble
Each key goes to the shell, Ctrl-C included, and interactive programs such as vi or
top work. The shell is closed at the end of the experiment, and after 30 minutes
without activity.
Docker
The Raspberry Pi and Jetson images run a Docker daemon. Each node gets an
empty 16 GB disk for it (/var/lib/docker), created at the start of the
experiment and removed at its end: the images you pull or build on a node
are not kept for the next experiment. The A8-M3 nodes don’t run Docker.
Your own image
You can boot your own image on the open Linux nodes of an experiment: an
OCI image on Docker Hub, built FROM the IoT-LAB base image of the node
type.
The tutorial
goes through a first one.
Build
-
Start
FROMthe IoT-LAB base image of the node type, at the version of the site:Node Base image Platform IoT-LAB A8-M3, Raspberry Pi 4 fitiotlab/iot-lab-open-linux-base:1.0.4linux/arm/v7Raspberry Pi 5 fitiotlab/iot-lab-open-linux-base:1.0.4linux/arm64NVIDIA Jetson Nano fitiotlab/iot-lab-open-linux-jetson-nano:1.0.4linux/arm64NVIDIA Jetson Orin fitiotlab/iot-lab-open-linux-jetson-orin:1.0.4linux/arm64The base image has the system and what a node needs to work in IoT-LAB (SSH,
/root/shared, the tools of the co-microcontroller, Docker where available), not the development tools of the default image: install the packages your experiment needs.FROM fitiotlab/iot-lab-open-linux-base:1.0.4 RUN apt-get update \ && apt-get install -y --no-install-recommends htop tcpdump \ && rm -rf /var/lib/apt/lists/* COPY rootfs/ / - Keep its
org.iot-lab.linux-base.versionlabel: an image without it, or with another version than the site, is not booted. - Don’t change
/boot/iotlab: the nodes boot the kernel of the site, the kernel modules in the image must match it. - Build for the platform of the node type, with Docker buildx, and push the image to Docker Hub, public.
Boot it in an experiment
Add image=<image> to the nodes in the experiment submission (CLI tools
3.4.0 or later), Docker Hub by default:
iotlab-experiment submit -n my-image -d 30 -l grenoble,a8,1-5,image=docker.io/<you>/my-image:1
In the web portal, set it with the image badge of the node group, as a firmware. One image per node type of the experiment.
At the start of the experiment, the site pulls the image and boots it on the nodes. The pull is part of the start: a large image makes it longer.
Limits
- 4 GB to download (compressed layers), 8 GB unpacked.
- Public images of Docker Hub only.
- The nodes boot the default IoT-LAB image when your image is refused:
too large, without the label, for another platform, or a node type that
can’t boot an image. The reason is in
~/.iot-lab/<experiment id>/log/user-image.log. -
An image built on another version of the IoT-LAB image than the site’s is not booted either: check the label (one version per platform of the image) before submitting,
docker buildx imagetools inspect docker.io/<you>/my-image:1 \ --format '{{ range .Image }}{{ index .Config.Labels "org.iot-lab.linux-base.version" }} {{ end }}'
Files of an experiment
In ~/.iot-lab/<experiment id>/ on the SSH frontend, beside the
monitoring data (consumption/, radio/, sniffer/):
journal/<node>/: the system journal of each open Linux node, copied at the end of the experiment, read it withjournalctl -D ~/.iot-lab/<experiment id>/journal/<node>/<machine id>;log/user-image.log: the pull of your image, or why the default image was booted;log/<node>.log: the power and boot events of the Raspberry Pi and Jetson nodes.
