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/shared is your ~/shared directory 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 Shell on 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 FROM the IoT-LAB base image of the node type, at the version of the site:

    Node Base image Platform
    IoT-LAB A8-M3, Raspberry Pi 4fitiotlab/iot-lab-open-linux-base:1.0.4linux/arm/v7
    Raspberry Pi 5fitiotlab/iot-lab-open-linux-base:1.0.4linux/arm64
    NVIDIA Jetson Nanofitiotlab/iot-lab-open-linux-jetson-nano:1.0.4linux/arm64
    NVIDIA Jetson Orinfitiotlab/iot-lab-open-linux-jetson-orin:1.0.4linux/arm64

    The 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.version label: 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 with journalctl -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.