This guide shows how to integrate Thistle OTA on the Advantech RSB‑3810 using the default Ubuntu image provided by Advantech. You can start immediately with file updates (no repartitioning), and optionally add A/B rootfs updates later for boot‑time rollback. We first cover the quick file‑update path, then outline the extra A/B steps.
Board overview: RSB‑3810 is a 2.5” Pico‑ITX SBC powered by MediaTek Genio 1200 (MT8395) featuring:
  • CPU: Octa-core (4x Cortex-A78 @ 2.2GHz + 4x Cortex-A55 @ 2.0GHz)
  • GPU: Mali-G57 MC5
  • NPU: Up to 4.8 TOPS
  • RAM: 8GB LPDDR4X onboard
  • Storage: 32GB eMMC 5.1
  • Connectivity: 2x GbE, WiFi 6/BT 5.2 support via M.2
  • I/O: HDMI 2.0, MIPI-DSI/LVDS, USB 3.0, UART, I²C, SPI
  • Expansion: UIO40‑Express connector for additional I/O
See Advantech’s announcement for full specifications.

Board setup (vendor docs)

Use the vendor’s Ubuntu image (or a recent Ubuntu/Debian image provided with the BSP). The default Ubuntu image from Advantech typically uses Ubuntu 22.04 LTS. Ensure you can log in over serial (115200 8N1) or SSH.

Prerequisites

  • RSB‑3810 with power supply
  • microSD card or eMMC‑backed OS (Ubuntu 22.04 LTS or Debian recommended)
  • Serial console cable (optional, but recommended for debugging)
  • Network access
  • A Linux/macOS workstation for initial setup

Quick path: File updates (no A/B)

Use Thistle’s file‑update mode to ship signed files and app bundles without changing partitions. On Advantech’s Ubuntu, EFI is typically mounted at /boot/efi; we will use that as the persistent directory.
  1. Download tools
  • Workstation (TRH):
VER=1.5.0
curl -LO https://downloads.thistle.tech/embedded-client/$VER/trh-$VER-x86_64-unknown-linux-musl.gz
gunzip trh-$VER-x86_64-unknown-linux-musl.gz
chmod +x trh-$VER-x86_64-unknown-linux-musl && ln -sf trh-$VER-x86_64-unknown-linux-musl trh
  • Device (TUC on RSB‑3810, aarch64):
# On the device shell (SSH or serial)
VER=1.5.0
curl -LO https://downloads.thistle.tech/embedded-client/$VER/tuc-$VER-aarch64-unknown-linux-musl.gz
gunzip tuc-$VER-aarch64-unknown-linux-musl.gz
chmod +x tuc-$VER-aarch64-unknown-linux-musl
sudo mv tuc-$VER-aarch64-unknown-linux-musl /usr/local/bin/tuc
tuc --help | head -n 3
  1. Initialize and release a simple file update on the workstation
export THISTLE_TOKEN=$(cat)   # paste token, Enter, then Ctrl-D
./trh init --persist="/boot/efi"

mkdir -p example && echo "hello from thistle" > example/app
# Install to /opt/example on device
./trh prepare --target=./example --file-base-path=/opt/example
./trh release
  1. Copy config to device and run client
# On workstation
scp config.json ubuntu@<board-ip>:~/tuc-config.json

# On device (SSH or serial)
sudo mv ~/tuc-config.json /boot/efi/tuc-config.json
sudo tuc -c /boot/efi/tuc-config.json
That’s it! File updates are fetched, verified, and installed atomically. You can stop here if you don’t need boot‑time rollback.

OS preparation and partitioning (A/B)

  1. Install a supported Linux OS image for RSB‑3810 (e.g., Ubuntu provided by Advantech).
  2. Boot the board and ensure you have SSH access.
  3. Ensure storage has three partitions available: one FAT32/boot partition and two equally‑sized ext4 rootfs partitions (A/B). If your image ships with a single rootfs, add a second partition for B and resize as needed.
Example using lsblk and parted on the board (adapt device as needed). The Advantech Ubuntu image typically uses eMMC with multiple partitions. For A/B setup, you’ll need to identify your rootfs partition (often mmcblk0p9) and create a second partition for B. This is safest from a recovery image (microSD) so the rootfs is not mounted:
lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT
sudo parted /dev/mmcblk0 --script print
# If only p1 (boot) and p2 (rootfs) exist, shrink p2 and create p3 for B
# From a recovery OS (recommended):
#  - shrink the current rootfs (e.g., /dev/mmcblk0p9)
#  - create /dev/mmcblk0pX as ext4 for slot B
# First, check your current partition layout
lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT,LABEL

# The RSB-3810 typically has:
# - mmcblk0p8: 500M vfat mounted at /boot/efi (EFI system partition)
# - mmcblk0p9: ~28.5G ext4 mounted at / (root filesystem)

# Resize the root filesystem (example: shrink to 14G to make room for partition B)
sudo e2fsck -f /dev/mmcblk0p9                          # check filesystem integrity
sudo resize2fs /dev/mmcblk0p9 14G                      # resize filesystem first
sudo parted /dev/mmcblk0 --script resizepart 9 14GB   # then resize partition

# Create partition B for A/B updates
sudo parted /dev/mmcblk0 --script mkpart primary ext4 14GB 100%
sudo mkfs.ext4 /dev/mmcblk0p10 -L rootfsB             # new partition for slot B

Verify persistent EFI (/boot/efi)

On Advantech’s Ubuntu image for RSB-3810, the EFI system partition (typically mmcblk0p8) is mounted at /boot/efi by default. This partition is formatted as FAT32 and is essential for bootloader updates. Verify and, if needed, ensure it’s in /etc/fstab:
mount | grep -E "/boot/efi|vfat" || true
cat /etc/fstab | grep -E "boot/efi|vfat" || true
The A/B layout is required for fail‑safe updates. If your deployment cannot repartition, you can still use Thistle’s file update mode, but this guide focuses on rootfs A/B.

Thistle Tools

If you didn’t complete the “Quick path” above, download the tools as shown there. Use /boot/efi as the persistent directory on this Ubuntu image.

What runs where

  • TRH (Thistle Release Helper): runs on your workstation to prepare and release bundles
  • TUC (Thistle Update Client): runs on the RSB‑3810 device to install bundles

Download TRH on the workstation (example)

# Linux x86_64 workstation
VER=1.5.0
curl -LO https://downloads.thistle.tech/embedded-client/$VER/trh-$VER-x86_64-unknown-linux-musl.gz
gunzip trh-$VER-x86_64-unknown-linux-musl.gz
chmod +x trh-$VER-x86_64-unknown-linux-musl
ln -sf trh-$VER-x86_64-unknown-linux-musl trh
./trh --version || true

Download TUC on the device (example)

# On RSB‑3810 (aarch64)
VER=1.5.0
curl -LO https://downloads.thistle.tech/embedded-client/$VER/tuc-$VER-aarch64-unknown-linux-musl.gz
gunzip tuc-$VER-aarch64-unknown-linux-musl.gz
chmod +x tuc-$VER-aarch64-unknown-linux-musl
sudo mv tuc-$VER-aarch64-unknown-linux-musl /usr/local/bin/tuc
tuc --help | head -n 3
If the device has no outbound internet access, download the TUC binary on the workstation and transfer it via scp, then finish on the device shell:
# On workstation
scp tuc-$VER-aarch64-unknown-linux-musl.gz ubuntu@<board-ip>:/tmp/

# On device (SSH or serial)
cd /tmp
gunzip tuc-$VER-aarch64-unknown-linux-musl.gz
chmod +x tuc-$VER-aarch64-unknown-linux-musl
sudo mv tuc-$VER-aarch64-unknown-linux-musl /usr/local/bin/tuc
tuc --help | head -n 3
Create or reuse a Thistle project and obtain a Project Access Token from the Thistle App.
export THISTLE_TOKEN=$(cat)   # paste token, Enter, then Ctrl-D

Initialize and Prepare a Release

  1. Initialize a release workspace and choose a persistent directory (use /boot/efi on this Ubuntu image so it survives rootfs swaps). This will generate config.json with credentials:
./trh init --persist="/boot/efi"
  1. Build your target rootfs image myrootfs.img (or use an existing base image). Prepare it as the update payload:
./trh prepare --target=myrootfs.img
  1. Release the bundle to Thistle Backend:
./trh release

Device Configuration

Deploy the generated device config to the RSB‑3810 and set A/B parameters.
# On workstation: copy generated config.json to device
scp config.json ubuntu@<board-ip>:/tmp/tuc-config.json

# On device (SSH or serial): place and amend
sudo mv /tmp/tuc-config.json /boot/efi/tuc-config.json
# Check if jq is installed, if not install it
command -v jq >/dev/null 2>&1 || sudo apt-get update && sudo apt-get install -y jq

# Update the configuration
sudo jq '. + {bootloader:"Thistle-U-Boot", part_a:"/dev/mmcblk0p9", part_b:"/dev/mmcblk0p10", persistent_directory:"/boot/efi"}' /boot/efi/tuc-config.json | sudo tee /boot/efi/tuc-config.json

Run an Update Cycle

Execute the Update Client on the board:
sudo tuc -c /boot/efi/tuc-config.json
The device will download the released bundle, install it to the inactive rootfs (A or B), and trigger a reboot. After reboot, the new partition should be active. Run the client again to latch‑in the update.
sudo tuc -c /boot/efi/tuc-config.json

Notes

  • Ensure your boot firmware (U‑Boot) loads the kernel and rootfs from the active A/B partition. The RSB-3810’s U-Boot (provided as UEFI firmware) may need configuration for A/B switching. See the Custom Bootloader Integration and Thistle U‑Boot pages.
  • For RSB-3810 specifically, U-Boot environment variables can be accessed via serial console at boot (interrupt with any key when prompted).
  • If you don’t need boot‑time rollback, the Quick path (file updates) is sufficient.