JetPack 6.2.1 を搭載した Seeed reComputer Jetson に PREEMPT_RT Linux リアルタイムカーネルをフラッシュする
リアルタイムカーネル(PREEMPT_RT カーネルとも呼ばれます)は、リアルタイムスケジューリング機能を強化した Linux カーネルの一種です。その主な目的は、生の計算性能を向上させることではなく、スケジューリングレイテンシを低減し、タスク実行の決定性を高めることです。
標準的な Linux カーネルと比較して、リアルタイムカーネルは高優先度タスクがより迅速に CPU リソースをプリエンプトできるようにし、割り込みやスレッドスケジューリングによるタイミングジッタを低減します。これにより、制御タスクを一定周期で安定して実行できます。ロボティクス、産業オートメーション、モーションコントロール、自動運転、エッジコンピューティングといったシナリオでは、リアルタイムカーネルにより、モータ制御、センサーデータ取得、CAN や EtherCAT を含む産業用バス通信などのリアルタイムワークロードの安定性と信頼性を大幅に向上させることができます。
本ガイドは、公式の NVIDIA Jetson Linux R36.4.4 BSP をベースにしています。Seeed R36.4.4 BSP をマージし、PREEMPT_RT カーネルをクロスコンパイルし、Seeed Jetson デバイスの NVMe SSD にシステムを書き込みます。
参考資料
ハードウェア要件
- x86 Ubuntu ホスト PC
- フラッシュ対象の Seeed reComputer または reServer デバイス
ワークスペースを作成しシステムファイルをダウンロードする
ホスト PC 上にワークスペースを作成します:
mkdir ~/RT_ws
cd ~/RT_ws
NVIDIA Jetson Linux R36.4.4 にアクセスし、下図でハイライトされている 4 つのファイルをダウンロードして、~/RT_ws ワークスペースに配置します。

Seeed-Studio/Linux_for_Tegra からソースコードの ZIP パッケージをダウンロードするか、リポジトリをクローンします:
git clone https://github.com/Seeed-Studio/Linux_for_Tegra.git
このディレクトリ名は公式 NVIDIA ディレクトリ名と競合する可能性があるため、本ガイドの手順に従って ZIP パッケージをダウンロードし、展開することを推奨します。

~/RT_ws 配下に次のファイルが存在することを確認します:
ls -lh \
Jetson_Linux_R36.4.4_aarch64.tbz2 \
Tegra_Linux_Sample-Root-Filesystem_R36.4.4_aarch64.tbz2 \
public_sources.tbz2 \
aarch64--glibc--stable-2022.08-1.tar.bz2 \
Linux_for_Tegra-r36.4.4.zip

ホスト依存パッケージをインストールする
cd ~/RT_ws
sudo apt-get update
sudo apt-get install -y \
qemu-user-static \
python3-pip \
device-tree-compiler \
flex \
bison \
libncurses-dev \
libssl-dev \
build-essential \
sshpass \
abootimg \
nfs-kernel-server \
libxml2-utils
公式 BSP、Rootfs、ソース、ツールチェーン、Seeed オーバーレイを展開する
cd ~/RT_ws
mkdir -p l4t-gcc
tar xf aarch64--glibc--stable-2022.08-1.tar.bz2 -C l4t-gcc
tar xf Jetson_Linux_R36.4.4_aarch64.tbz2
tar xf public_sources.tbz2 -C .
unzip -q Linux_for_Tegra-r36.4.4.zip -d seeed_overlay
sudo tar xpf Tegra_Linux_Sample-Root-Filesystem_R36.4.4_aarch64.tbz2 -C Linux_for_Tegra/rootfs/
rootfs は必ず sudo tar xpf で展開する必要があります。通常の tar を使用しないでください。そうしないと、ファイルの所有権とパーミッションが正しくなくなります。すでに展開済みの場合は、そのディレクトリをそのまま使用できます。完全にやり直したい場合のみ、古いディレクトリを削除してください。
NVIDIA ソースを展開する
cd ~/RT_ws/Linux_for_Tegra/source
tar xf kernel_src.tbz2
tar xf kernel_oot_modules_src.tbz2
tar xf nvidia_kernel_display_driver_source.tbz2
Seeed BSP オーバーレイをマージする
cd ~/RT_ws
cp -a seeed_overlay/Linux_for_Tegra-r36.4.4/. Linux_for_Tegra/
このステップはビルド前に必ず完了させる必要があります。Seeed オーバーレイは、カーネル、OOT モジュール、hardware/nvidia/t23x/nv-public の DTS および Makefile ファイル、bootloader/generic/BCT を変更します。このステップをスキップすると、フラッシュ時に利用できるのは公式 NVIDIA 開発キット構成のみとなり、Seeed キャリアボード情報は含まれません。
NVIDIA バイナリを Rootfs に適用し、フラッシュ前提条件をインストールする
cd ~/RT_ws/Linux_for_Tegra
sudo ./apply_binaries.sh
sudo ./tools/l4t_flash_prerequisites.sh
PREEMPT_RT カーネル、OOT モジュール、DTB をビルドする
cd ~/RT_ws/Linux_for_Tegra/source
export ARCH=arm64
export CROSS_COMPILE=~/RT_ws/l4t-gcc/aarch64--glibc--stable-2022.08-1/bin/aarch64-buildroot-linux-gnu-
./nvbuild.sh -r
-r オプションは、公式 NVIDIA の PREEMPT_RT 設定を有効にします。ビルド出力ディレクトリは ~/RT_ws/Linux_for_Tegra/source/kernel_out です。ビルドが成功すると、カーネルバージョンのサフィックスに -rt-tegra が含まれているはずです。
Seeed の do_copy.sh で Image、DTB、DTBO をデプロイする
cd ~/RT_ws/Linux_for_Tegra/source
./do_copy.sh
# Additional checks:
ls -lh ../kernel/Image
ls ../kernel/dtb/tegra234-j401-p3768-0000+p3767-0000-recomputer.dtb
ls ../kernel/dtb/tegra234-j201-p3768-0000+p3767-0000-recomputer-indu.dtb
do_copy.sh は Seeed BSP におけるデプロイのエントリポイントです。ビルド済みの reComputer および reServer の DTB、カメラおよび GMSL の DTBO、新しい kernel/Image をコピーします。
do_copy.sh が Seeed DTB を見つけられないと報告する場合、多くは Seeed オーバーレイが完全にマージされていないか、ビルドで Seeed オーバーレイ済みの source/Makefile が使用されていないことを意味します。
カーネルモジュールを Rootfs にインストールする
cd ~/RT_ws/Linux_for_Tegra/source
export ARCH=arm64
export CROSS_COMPILE=~/RT_ws/l4t-gcc/aarch64--glibc--stable-2022.08-1/bin/aarch64-buildroot-linux-gnu-
export INSTALL_MOD_PATH=~/RT_ws/Linux_for_Tegra/rootfs/
sudo -E ./nvbuild.sh -i
共通の Seeed DTBO を rootfs/boot にコピーし、Initrd を更新する
cd ~/RT_ws/Linux_for_Tegra
sudo cp -a kernel/dtb/tegra234-p3767-camera-p3768-imx219-dual-seeed.dtbo rootfs/boot/ 2>/dev/null || true
sudo cp -a kernel/dtb/tegra234-p3767-camera-p3768-imx219-quad-seeed.dtbo rootfs/boot/ 2>/dev/null || true
sudo cp -a kernel/dtb/tegra234-p3767-camera-p3768-imx477-dual-seeed.dtbo rootfs/boot/ 2>/dev/null || true
sudo cp -a kernel/dtb/tegra234-p3767-camera-p3768-imx219-imx477-seeed.dtbo rootfs/boot/ 2>/dev/null || true
sudo cp -a kernel/dtb/tegra234-p3767-camera-p3768-imx477-imx219-seeed.dtbo rootfs/boot/ 2>/dev/null || true
sudo cp -a kernel/dtb/tegra234-seeed-gmsl*.dtbo rootfs/boot/ 2>/dev/null || true
sudo cp -a kernel/dtb/tegra234-seeed-orbbec-335lg-overlay.dtbo rootfs/boot/ 2>/dev/null || true
sudo ./tools/l4t_update_initrd.sh
DTBO ファイルを rootfs/boot にコピーすることで、ブート後も Seeed のカメラおよび GMSL オーバーレイを引き続き使用できるようにします。l4t_update_initrd.sh は新しいモジュール依存関係を initrd に書き込みます。NVMe ブートではこのステップをスキップしないでください。
ビルド出力を確認する
cd ~/RT_ws/Linux_for_Tegra
ls -lh kernel/Image
ls kernel/dtb/tegra234-j*.dtb
find rootfs/lib/modules -maxdepth 1 -type d -name '*-rt-tegra' -print
reComputer J401 をフラッシュする場合、少なくとも次のファイルが存在している必要があります:
kernel/dtb/tegra234-j401-p3768-0000+p3767-0000-recomputer.dtb
kernel/dtb/tegra234-j401-p3768-0000+p3767-0001-recomputer.dtb
kernel/dtb/tegra234-j401-p3768-0000+p3767-0003-recomputer.dtb
kernel/dtb/tegra234-j401-p3768-0000+p3767-0004-recomputer.dtb
強制リカバリモードに入り USB 接続を確認する
デバイス上の REC スイッチを ON に設定し、その隣の Debug/Device ポートと x86 ホスト PC を USB ケーブルで接続します。

ホスト PC で次を実行します:
cd ~/RT_ws/Linux_for_Tegra
lsusb
次のような出力が表示されるはずです:
Bus <bbb> Device <ddd>: ID 0955:<nnnn> NVIDIA Corp.
0955 が表示されない場合は、REC/GND ジャンパまたはリカバリモードへの移行手順を確認し、Type-C ケーブルがデータ通信に対応していることを確認し、仮想マシンを使用している場合は NVIDIA USB デバイスが Ubuntu にパススルーされていることを確認してください。
Seeed ボード構成名を選択する
cd ~/RT_ws/Linux_for_Tegra
export SEEED_BOARD_CONF=recomputer-orin-j401
test -f "${SEEED_BOARD_CONF}.conf"
利用可能な構成名:
recomputer-orin-j401
recomputer-industrial-orin-j201
reserver-industrial-orin-j401
recomputer-orin-j40mini
recomputer-orin-super-j401
recomputer-orin-robotics-j401
recomputer-orin-robotics-j401-gmsl
reserver-agx-orin-j501x
reserver-agx-orin-j501x-gmsl
次の表は、製品モデルと構成名の対応関係を示します:
| 製品モデル | 構成名 |
|---|---|
| reComputer classic J3010/J3011/J4011/J4012 | recomputer-orin-j401 |
| reComputer Industrial J3010/J3011/J4011/J4012 | recomputer-industrial-orin-j201 |
| reServer Industrial J3010/J3011/J4011/J4012 | reserver-industrial-orin-j401 |
| reComputer Mini J40 シリーズ | recomputer-orin-j40mini |
| reComputer Super J401 シリーズ | recomputer-orin-super-j401 |
| reComputer Robotics J401 シリーズ | recomputer-orin-robotics-j401 または recomputer-orin-robotics-j401-gmsl |
| reServer AGX Orin J501x | reserver-agx-orin-j501x または reserver-agx-orin-j501x-gmsl |
モジュール EEPROM とボード情報の変数を入力する
オンラインで直接フラッシュし、USB EEPROM の読み取りが正常に動作している場合、NVIDIA ツールは通常この情報を自動的に読み取ります。
モジュールまたはボード情報が不足しているというエラーが発生した場合は、フラッシュ前に実際のモジュールモデルに応じて、以下の変数を入力してください。
Orin NX / Orin Nano 共通値:
| モジュール | BOARDID | BOARDSKU | FAB | BOARDREV | CHIP_SKU |
|---|---|---|---|---|---|
| Orin Nano 4GB | 3767 | 0004 | 300 | N.2 | 00:00:00:D6 |
| Orin Nano 8GB | 3767 | 0003 | 300 | N.2 | 00:00:00:D6 |
| Orin NX 16GB | 3767 | 0000 | 300 | G.3 | 00:00:00:D3 |
| Orin NX 8GB | 3767 | 0001 | 300 | M.3 | 00:00:00:D4 |
AGX Orin J501x 共通値:
| モジュール | BOARDID | BOARDSKU | FAB | BOARDREV | CHIP_SKU |
|---|---|---|---|---|---|
| AGX Orin 32GB | 3701 | 0004 | 500 | J.0 | 00:00:00:D2 |
| AGX Orin 64GB | 3701 | 0005 | 500 | M.0 | 00:00:00:D0 |
reComputer J4012 / Orin NX 16GB の例:
export BOARDID=3767
export BOARDSKU=0000
export FAB=300
export BOARDREV=G.3
export CHIP_SKU=00:00:00:D3
reComputer J3011 / Orin Nano 8GB の例:
export BOARDID=3767
export BOARDSKU=0003
export FAB=300
export BOARDREV=N.2
export CHIP_SKU=00:00:00:D6
変数を確認します:
echo "CONF=${SEEED_BOARD_CONF} BOARDID=${BOARDID} BOARDSKU=${BOARDSKU} FAB=${FAB} BOARDREV=${BOARDREV} CHIP_SKU=${CHIP_SKU}"
Seeed の設定ファイルは、BOARDSKU にマッピングされる board_sku に応じて DTB_FILE を選択します。BOARDSKU が正しくない場合、書き込み自体は成功しても、デバイスが誤った DTB で起動する可能性があります。その場合、周辺機器、Ethernet、M.2、カメラ、GPIO が正しく動作しないことがあります。
NVMe へのフラッシュ
cd ~/RT_ws/Linux_for_Tegra
sudo -E BOARDID="${BOARDID}" BOARDSKU="${BOARDSKU}" FAB="${FAB}" BOARDREV="${BOARDREV}" CHIP_SKU="${CHIP_SKU}" \
./tools/kernel_flash/l4t_initrd_flash.sh \
--external-device nvme0n1p1 \
-c tools/kernel_flash/flash_l4t_t234_nvme.xml \
-p "-c bootloader/generic/cfg/flash_t234_qspi.xml --no-systemimg" \
--showlogs \
--network usb0 \
"${SEEED_BOARD_CONF}" \
external
このコマンドは NVMe SSD にフラッシュし、Orin NX および Orin Nano 向けに QSPI ブート構成を処理します。最後の external 引数は、システムの rootfs が外部 NVMe から起動することを意味します。デバイスに 2 台の NVMe SSD が搭載されている場合でも、rootfs が PARTUUID を使用するように external を使用することを推奨します。
フラッシュ後
フラッシュが成功したら、デバイスの電源を切り、REC/GND ジャンパを取り外すかリカバリーモードボタンを離し、Jetson デバイスの電源を再投入します。
リアルタイムカーネルと DTB の確認
カーネルバージョンを確認します:
uname -a
出力には -rt サフィックスが含まれている必要があります。
カーネル設定を確認します:
zcat /proc/config.gz | grep PREEMPT
出力には次が含まれている必要があります:
CONFIG_PREEMPT_RT=y
スケジューリングジッタをテストするために cyclictest を使用します:
sudo apt install -y rt-tests
sudo cyclictest -Sp90-i1000-l100000
しばらく待った後、Avg 値が 20 マイクロ秒未満であるかどうかを確認します。出力例:
T: 0 ( 1290) P:99 I:1000 C:100000 Min: 5 Act:10 Avg: 7 Max: 18
T: 1 ( 1291) P:99 I:1000 C:100000 Min: 4 Act: 9 Avg: 7 Max: 20

上記のチェックをすべてパスした場合、PREEMPT_RT リアルタイムカーネルは正常にインストールされています。
技術サポート & 製品ディスカッション
弊社製品をお選びいただきありがとうございます。弊社は、お客様が製品をできるだけスムーズにご利用いただけるよう、さまざまなサポートを提供しています。お好みやニーズに応じてお選びいただけるよう、複数のコミュニケーションチャネルをご用意しています。