Skip to main content

Bring up Metis M.2 in Jetson Orin

A Linux kernel patch is required to make Metis M.2 compatible with NVIDIA Jetson Orin devices. This guide covers downloading and extracting the Jetson Linux sources, applying axl-jetson.patch, building and installing the patched kernel, configuring the bootloader to use it, and fixing the OpenCV headers before installing the Voyager SDK.

You will need axl-jetson.patch

You will need the axl-jetson.patch file, available in the Downloads section below.

Download and expand the kernel sources

Step 0. In your browser, go to the NVIDIA Jetson Linux archive.

Step 1. Locate and download the Jetson Linux source files for your release. Check your release with:

head -n1 /etc/nv_tegra_release

For example: R36 (release), REVISION: 4.3, GCID: 38968081, BOARD: generic.

Go to the matching L4T URL (here, R36.4.3) and download the Driver Package (BSP) Sources, for example public_sources.tbz2:

wget https://developer.nvidia.com/downloads/embedded/l4t/<your-release>/sources/public_sources.tbz2 .

For example: wget https://developer.nvidia.com/downloads/embedded/l4t/r36_release_v4.3/sources/public_sources.tbz2 .

The driver package creates the Linux_for_Tegra/ subdirectory. Inside it, Linux_for_Tegra/rootfs/ is the sample root filesystem, which makes up most of the flash image.

Step 2. Extract the .tbz2 file:

tar -xjf public_sources.tbz2

Step 3. Extract the kernel source files:

cd ~/Linux_for_Tegra/source
tar -xjf kernel_src.tbz2
tar -xjf kernel_oot_modules_src.tbz2
tar -xjf nvidia_kernel_display_driver_source.tbz2

Build the kernel

Step 0. Install the packages used for building:

sudo apt install -y build-essential bc libssl-dev

Step 1. Apply axl-jetson.patch to kernel/kernel-jammy-src:

cd ~/Linux_for_Tegra/source/kernel/kernel-jammy-src
patch --dry-run -p1 < /path/to/axl-jetson.patch # check the patch first
patch -p1 < /path/to/axl-jetson.patch

Step 2. Set the local version. Replace the version line in the Makefile with a tegra-axl suffix:

cd ~/Linux_for_Tegra/source/kernel/
version = $(shell grep -q "CONFIG_PREEMPT_RT=y" \
${kernel_source_dir}/arch/arm64/configs/${KERNEL_DEF_CONFIG} && echo "-rt-tegra" || echo "-tegra-axl")

Back up the original boot image:

sudo cp /boot/Image /boot/Image.orig

Step 3. Build the kernel with ./nvbuild.sh:

cd ~/Linux_for_Tegra/source
mkdir kernel_out
./nvbuild.sh -o kernel_out

Done — the patched kernel is built.

Install the kernel

Step 1. Install the kernel modules:

cd ~/Linux_for_Tegra/source
./nvbuild.sh -o kernel_out -i

# Check what version was installed
ls -la /lib/modules/

Step 2. Install the kernel image. Copy your new kernel with an .axl extension to distinguish it:

cd ~/Linux_for_Tegra/source/kernel_out/kernel/kernel-jammy-src/
sudo cp arch/arm64/boot/Image /boot/Image.axl

Check which version was installed:

ls -la /boot/Image*

Step 3. Generate the initrd:

sudo update-initramfs -u -k 5.15.148-tegra-axl

Rename the generated initrd to a friendly name:

sudo mv /boot/initrd.img-5.15.148-tegra-axl /boot/initrd.axl

Done — the patched kernel files are installed.

Boot with the Axelera Jetson kernel

Make the Axelera Jetson kernel the default.

Step 1. Open /boot/extlinux/extlinux.conf. As a best practice, back it up first:

sudo cp /boot/extlinux/extlinux.conf /boot/extlinux/extlinux.conf.backup

Step 2. Insert the following inside extlinux.conf:

LABEL Axelera
MENU LABEL Axelera kernel
LINUX /boot/Image.axl
INITRD /boot/initrd.axl
APPEND ${cbootargs} root=PARTUUID=<Primary-PARTUUID> rw rootwait rootfstype=ext4 mminit_loglevel=4 console=ttyTCU0,115200 firmware_class.path=/etc/firmware fbcon=map:0 nospectre_bhb video=efifb:off console=tty0
Set the default boot entry

Inside extlinux.conf, change DEFAULT to the Axelera label (usually line 2). Use the same PARTUUID for both entries — copy the PARTUUID from the primary kernel to the Axelera kernel entry.

Step 3. Reboot the Jetson into the Axelera Jetson kernel:

sync
sudo reboot

Step 4. After rebooting, verify the kernel version and timestamp (you can also run this before rebooting, for reference):

uname -a

Done — the Axelera Jetson kernel is now the default.

Fix the OpenCV header before installing the Voyager SDK

sudo ln -s /usr/include/opencv4/opencv2 /usr/include/opencv2

Install the Voyager SDK

Follow the installation instructions in the Voyager SDK GitHub repository.

Quick start

Follow the first inference walkthrough to test a model pipeline.

When updating nvidia-jetpack

Running sudo apt-get install nvidia-jetpack resets the default kernel back to primary. After updating nvidia-jetpack, update /boot/extlinux/extlinux.conf and set DEFAULT back to Axelera.

Check DMABUF enablement

zgrep CONFIG_DMABUF_HEAPS /proc/config.gz

The output should show the DMABUF configs:

CONFIG_DMABUF_HEAPS=y
CONFIG_DMABUF_HEAPS_SYSTEM=y
CONFIG_DMABUF_HEAPS_CMA=y

Helper commands

CommandPurpose
head -n1 /etc/nv_tegra_releaseL4T release (e.g. R36 release, REVISION: 4.3)
uname -rExact kernel version and L4T tag
apt-cache show nvidia-jetpackInstalled JetPack version (package metapackage)

Downloads