Quick Start Guide with Yocto

Flash a prebuilt OE4T demo-image-reference Yocto image (JetPack 7.2.1) to Jetson AGX Thor, AGX Orin, or Orin Nano. No BitBake build required.

Quick Start Guide with Yocto

The standard way to set up a Jetson is the JetPack flow: you flash Jetson Linux (Ubuntu) from an ISO USB stick, following the Quick Start Guide for your developer kit. JetPack delivers NVIDIA’s complete, validated software stack and is an excellent choice for both development and production.

The Yocto Project is an alternative option for teams who prefer to build their own Linux image with the OpenEmbedded build system, choosing exactly which packages are included, integrating the OS build into CI, and reproducing the same image from source on every build. It uses the same Jetson Linux (L4T) and JetPack components under the hood. This guide shows how to get started with the Yocto path on Jetson.

Beginning with JetPack 7.2 (Jetson Linux R39.2), Yocto is an officially supported path on Jetson, developed together with the community OpenEmbedded for Tegra (OE4T) project. The Jetson Yocto recipes live in two OE4T repositories:

You don’t have to build anything to try it. In this guide you’ll download a prebuilt demo-image-reference image and flash it to your Jetson. This Sato/X11 desktop image is the OE4T QA reference image, with comprehensive validation tools, NVIDIA-accelerated container support, and a persistent /data partition that is configured automatically on first boot. It comes from the OE4T tegra-demo-distro wrynose branch.

📘 Where to get the images

Prebuilt Yocto images are published on the JetPack SDK downloads page. Under Yocto Images, use the button for your device: Yocto for Jetson AGX Thor, Yocto for Jetson AGX Orin, or Yocto for Jetson Orin Nano. If you’d rather build the image yourself, jump to Build your own Yocto image.

Supported images

Download the demo-image-reference tegraflash tarball for your target. Use the tarball whose MACHINE name matches your hardware. Do not use a tarball built for a different Jetson module or carrier.

HardwareOE4T MACHINETarball nameRootfs target
Jetson AGX Thor devkitjetson-agx-thor-devkitdemo-image-reference-jetson-agx-thor-devkit.rootfs.tegraflash-tar.zstNVMe (nvme0n1p1)
Jetson AGX Orin devkit (64 GB)p3737-0000-p3701-0005demo-image-reference-p3737-0000-p3701-0005.rootfs.tegraflash-tar.zstinternal eMMC (mmcblk0p1)
Jetson Orin Nano (NVMe)jetson-orin-nano-devkit-nvmedemo-image-reference-jetson-orin-nano-devkit-nvme.rootfs.tegraflash-tar.zstNVMe (nvme0n1p1)

⚠️ Install the NVMe drive first (NVMe targets)

For the two NVMe targets (AGX Thor and Orin Nano), install the NVMe drive in the Jetson before putting the device into recovery mode. The flash script writes the root filesystem to the storage target described by the MACHINE configuration.

Why Yocto?

The Yocto Project is not a Linux distribution by itself. It is a build framework that produces a distribution tailored to your hardware, package set, and update model. Teams reach for Yocto on Jetson when they need tight control over the OS image that ships in a product: a minimized package set, reproducible builds in CI, Secure Boot, OTA updates, package feeds, and long-term maintenance. For this getting-started guide, you simply consume a prebuilt image, so no build framework knowledge is required.

💡 Just want to run AI workloads?

If you’re not specifically interested in Yocto and just want to get models running quickly, the standard JetPack flow in Getting Started with Jetson is the easier path.

The end-to-end flow for this guide is short:

What’s in demo-image-reference?

demo-image-reference is a comprehensive QA validation image containing all publicly available test packages supplied by the OE/Yocto recipes. It includes:

  • A Sato/X11 desktop, with Weston available for manual launch
  • Docker, nvidia-container-toolkit, and NVIDIA registry configuration
  • The NVIDIA runtime preconfigured as Docker’s default OCI runtime
  • CUDA, cuDNN, TensorRT, VPI4, PVA SDK, Vulkan, and Nsight Systems validation tools
  • Open-source test and benchmark utilities such as glmark2, kmscube, lmbench, iperf3, and rt-tests
  • An automatically created and mounted /data partition for persistent data and container storage

The older demo-image-full recipe still exists in tegra-demo-distro, but it is no longer the image used to produce the prebuilt JetPack 7.2.1 tarballs.

Prerequisites

Host machine

Use a native x86-64 Ubuntu 24.04 host. Avoid flashing from a virtual machine, container, WSL environment, or through an external USB hub. The low-level USB recovery protocol is sensitive to host USB behavior.

Install the host packages needed by the OE4T flash scripts:

sudo apt update
sudo apt install \
  bash \
  bmap-tools \
  cpp \
  device-tree-compiler \
  gdisk \
  libxml2-utils \
  python3 \
  tar \
  udisks2 \
  usbutils \
  zstd

If you want to monitor a serial console, also install a serial terminal and add your user to the dialout group (log out and back in afterward):

sudo apt install picocom
sudo usermod -aG dialout "$USER"

Prepare the desktop host

On an Ubuntu 24.04 desktop host, disable automatic mounting of removable media before flashing. The Orin flashing flow exposes storage over USB, and desktop automount can interfere with it:

gsettings set org.gnome.desktop.media-handling automount false
gsettings set org.gnome.desktop.media-handling automount-open false

Verify that both commands print false:

gsettings get org.gnome.desktop.media-handling automount
gsettings get org.gnome.desktop.media-handling automount-open

📘 Notes

If gsettings is unavailable (a non-desktop host), this automount step does not apply. If the host has the tlp power-management package installed, remove it and reboot the host before flashing: sudo apt remove tlp && sudo reboot.

Step 1: Download the image for your device

From the JetPack downloads page (JetPack 7.2.1 / Jetson Linux R39.2.1), under Yocto Images, click the button for your device: Yocto for Jetson AGX Thor, Yocto for Jetson AGX Orin, or Yocto for Jetson Orin Nano. Download the .tegraflash-tar.zst package whose MACHINE matches your hardware (see the Supported images table). Save it to ~/Downloads and leave the filename unchanged.

Step 2: Unpack the flash tarball

Set MACHINE to your target, then unpack the tarball into a fresh directory. Use the value from the table that matches your hardware:

export MACHINE="jetson-agx-thor-devkit"
export MACHINE="p3737-0000-p3701-0005"
export MACHINE="jetson-orin-nano-devkit-nvme"

Then unpack:

mkdir -p ~/jetson-flash
cd ~/jetson-flash
tar xf ~/Downloads/demo-image-reference-${MACHINE}.rootfs.tegraflash-tar.zst

💡 Tip

Use a fresh empty directory if you unpack more than one target so the contents don’t mix.

Step 3: Put the Jetson in Recovery Mode

Connect the host to the Jetson’s recovery USB port before running the flash script. The exact port differs per developer kit. The Diagram links open the official Hardware Layout page with annotated photos of the USB port, RECOVERY/RESET buttons, and recovery header.

Developer kitRecovery USB portDiagram
Jetson AGX Thor devkitUSB-C port with Force-Recovery functionality (5a, next to the HDMI connector); use the other USB-C port (5b) for powerHardware Layout
Jetson AGX Orin devkit (64 GB)USB Type-C port next to the 40-pin headerHardware Layout
Jetson Orin Nano devkitUSB-C port (mark 4)Hardware Layout

Enter Force Recovery Mode using the sequence for your developer kit:

For kits with RECOVERY and RESET buttons (Thor AGX devkit, Orin AGX devkit):

  1. Power the Jetson carrier board.
  2. Hold the RECOVERY (Force Recovery) button.
  3. Press and release RESET.
  4. Release the RECOVERY button.

For the Jetson Orin Nano developer kit, use the recovery pins on the J14 button header (located below the Jetson module):

  1. Power off the developer kit and disconnect power.
  2. Place a jumper across pin 9 (GND) and pin 10 (FORCE_RECOVERY) of the J14 header.
  3. Reconnect power (or press the power button).
  4. Wait a couple of seconds, then remove the jumper.

See Orin Nano Developer Kit: Force Recovery Mode for the official steps.

Confirm the host can see an NVIDIA recovery-mode USB device:

lsusb -d 0955:

The output should include an APX device, which indicates the Jetson is in recovery mode.

⚠️ APX vs Tegra On-Platform Operator

A Tegra On-Platform Operator device is the USB serial support interface, not the recovery-mode device used for flashing. If APX is missing, check the cable, the recovery USB port, and the recovery-mode button/pin sequence.

Step 4: Flash the image

From the directory where you unpacked the tarball, run:

sudo ./initrd-flash

The script detects the Jetson in recovery mode, prepares the flash content, and writes the image. By default it flashes both the boot firmware and the configured root filesystem target for the selected MACHINE.

📘 If you see could not retrieve board information

If the flash fails early with an error like:

Found Jetson device in recovery mode at USB 3-1
ERR: could not retrieve board information

Power-cycle the developer kit (unplug power, plug it back in), re-enter Force Recovery Mode from power-off, confirm APX appears in lsusb -d 0955:, and run sudo ./initrd-flash again.

⏳ Don’t disconnect during flashing

Flashing can take several minutes, particularly the final step that writes the QSPI flash. Keep the USB cable connected and the board powered until it completes. The script writes a host log named log.initrd-flash.YYYY-MM-DD-HH.MM.SS; for Orin targets, device-side logs may also be collected into a device-logs-YYYY-MM-DD-HH.MM.SS directory.

When flashing completes, bring the device up:

TargetNext step
Thor AGX devkitPower cycle or reset the Jetson.
Orin AGX devkit (64 GB)The script waits for final device status. Reboot or power cycle if it does not boot automatically.
Orin Nano (NVMe)The script waits for final device status. Reboot or power cycle if it does not boot automatically.

On boot you’ll reach a login prompt. Log in as root (the demo image has no password set by default).

⚠️ Change the default login

The tegrademo image is a reference / demo image with passwordless root for convenience. Before using it or any derivative beyond evaluation, set passwords, remove debug tweaks, and review the security configuration.

Step 5: Verify the JetPack stack

Once booted, confirm the JetPack components bundled in demo-image-reference are present. Run these on the device (over serial or SSH):

Check the L4T / JetPack release:

cat /etc/nv_tegra_release

Verify Docker with the NVIDIA runtime:

docker info --format 'Default runtime: {{.DefaultRuntime}}'
docker info | grep -i runtime
docker run --rm hello-world

The default runtime should report nvidia. If these commands respond successfully, your Yocto image is up and the JetPack stack is functional. You now have a Sato desktop running on your Jetson with the NVIDIA container runtime ready to use.

Step 6: Verify automatic persistent storage

The JetPack 7.2.1 demo-image-reference image configures persistent storage automatically on first boot. No manual partitioning, formatting, /etc/fstab changes, or Docker configuration are required.

The image uses systemd-repart to create an ext4 partition labeled data, grow it into the available unallocated space, and mount it at /data. Docker and containerd wait for that mount and use these locations by default:

  • Docker: /data/docker
  • containerd: /data/containerd

The image also uses an overlay filesystem under /data to preserve SSH configuration, NetworkManager connections, and systemd network configuration across OTA updates.

Verify the automatic setup:

findmnt /data
df -hT /data
docker info --format 'Docker root: {{.DockerRootDir}}'
docker info --format 'Default runtime: {{.DefaultRuntime}}'
grep '^root' /etc/containerd/config.toml

The output should show /data mounted as ext4, Docker rooted at /data/docker, containerd rooted at /data/containerd, and nvidia as Docker’s default runtime.

📘 Custom storage layouts

The automatic partition and persistent overlay are configured when building the distro. Products that need a different partition size, storage device, or set of persisted paths should customize the OE4T image configuration at build time rather than repartitioning a running reference image.

Optional: Serial console

A serial console is not required, but it helps if flashing fails or the device does not boot. Connect at 115200 baud. The host device is commonly /dev/ttyACM0 for CDC-ACM, or /dev/ttyUSB0 for USB-to-TTL adapters:

picocom -b 115200 /dev/ttyACM0

Use Ctrl-A then Ctrl-X to exit picocom. Serial access differs per device:

HardwareSerial access
Thor AGX devkitUSB CDC-ACM serial from the USB-C port hidden under the lid above the rear ports
Orin AGX devkit (64 GB)USB CDC-ACM serial from the USB micro-B port
Orin Nano (NVMe)3.3 V TTL UART on the button header; use a USB-to-TTL serial adapter

Troubleshooting

  • lsusb -d 0955: shows no device: the Jetson is not in Force Recovery Mode, or the host is connected to the wrong USB port. Re-enter recovery mode from power-off and confirm the recovery USB port.
  • Flashing fails with a USB communication error: power cycle the Jetson, enter Force Recovery Mode from power-off, and rerun sudo ./initrd-flash. Also try a different high-quality USB cable and a direct host USB port (no hub).
  • The host desktop opens a file browser or mounts storage during flashing: recheck the GNOME automount settings above and close any file-manager windows that opened automatically.
  • Keep the logs: if the script fails, keep the generated log.initrd-flash.* file (and the device-logs-* directory for Orin targets) when reporting the issue.

Build your own Yocto image

The prebuilt demo-image-reference is built from source in the OE4T tegra-demo-distro repository. To rebuild it yourself or customize it with your own layer and packages, follow the setup and build steps in the repository README: github.com/OE4T/tegra-demo-distro.

The reference image requires the overlayfs distro feature. For OTA workflows, demo-image-reference-swupdate is the swupdate payload used to deliver demo-image-reference.

References & Next Steps

Run your first AI workload

With your Jetson booted and persistent container storage in place, you’re ready to run a containerized AI workload. When you pick an image, match it to your Jetson’s GPU family rather than just its CPU architecture or SBSA support: Thor and Orin are built on different GPU architectures, so their optimized containers are not interchangeable. Use the table below to choose the right image for your device.

WorkflowJetson AGX ThorJetson AGX Orin / Orin NX / Orin Nano
Live VLM WebUIghcr.io/nvidia-ai-iot/live-vlm-webui:latest-jetson-thorghcr.io/nvidia-ai-iot/live-vlm-webui:latest-jetson-orin
vLLMghcr.io/nvidia-ai-iot/vllm:latest-jetson-thorghcr.io/nvidia-ai-iot/vllm:latest-jetson-orin
Ollamaghcr.io/nvidia-ai-iot/ollama:r38.2.arm64-sbsa-cu130-24.04dustynv/ollama:r36.2.0

On your Yocto-based Jetson, always pick the container tag that matches your GPU family: latest-jetson-thor for Thor (SM110) and latest-jetson-orin for Orin (SM87). These are rolling tags, so the exact Jetson Linux and CUDA versions behind them change over time. On an Orin running the R39.2.1 / JetPack 7.2.1 Yocto image, keep using the Orin tag.

📘 Live VLM WebUI needs a model backend

Live VLM WebUI provides the browser interface and camera pipeline; it does not serve a model by itself. Connect it to Ollama, vLLM, SGLang, or another OpenAI-compatible local or cloud API. For a small local-storage setup, start with Ollama and a compact model.