Jetson Orin NanoのNVMe SSDを使ったOSイメージのセットアップ手順

# はじめに

Jetson Orin Nano Developer Kit 8GBのOSイメージをNVMe SSDにインストールする手順をメモとして残します。

# 対象モデル

Jetson Orin Nano Developer Kit (P3766)
1024 core Ampere architecture GPU
6 core ARM Cortes-A78AE v8.2 64-bit CPU
8GB Memory
2 camera connector
M.2 2280 PCIe NVMe Gen 3x4 SSD 256GB

# 準備

詳細な手順は[Jetson Orin Nano Developer Kit User Guide - Software Setup](https://developer.nvidia.com/embedded/learn/jetson-orin-nano-devkit-user-guide/software_setup.html)のOptional Flow with Host Linux PCに紹介がありますが、ステップを要約します。

- NVIDIA Developer Programのアカウントを用意する (SDK Managerのダウンロードとその後の作業に必要となります)
- x86_64のUbuntu Linuxマシンを用意する
- NVIDIA SDK Managerをインストールする
- NVIDIA SDK Managerを起動し、ログインする

## サポートマトリクスを確認

[NVIDIA SDK ManagerのSystem Requirements](https://docs.nvidia.com/sdk-manager/system-requirements/index.html)にLinuxマシンのハードウェア要件やOS要件などが記載されています。

JetPackをインストールするためにはバージョンのサポート条件が記載された表を確認しておく必要があります。NVIDIA SDK Managerは様々なLinuxをサポートしておりますが、JetsonにJetPackをインストールするには、Ubuntuが必須なようです。

具体的に記載すると記事を書いた時点では、JetPack 5.1.2をセットアップするには、Ubuntu 18.04か20.04のx86_64 Linuxマシンが必要となっています。他のOSはサポートされていませんし、Ubuntu 22.04ですとJetPack 6.xの対応となるようです。

## NVIDIA SDK Managerをダウンロード

x86_64のLinuxマシン(Jetsonでありません)にて[Jetson Download Center](https://developer.nvidia.com/embedded/downloads)にアクセスし、Filterに`SDK`と入力すると、NVIDA SDK Managerが表示されますので`Download SDK Manager`のリンクからダウンロードします。この際、NVIDIA Developer Programのログインが必要となります。

## NVIDIA SDK Managerをインストール

ダウンロードしたファイルが保存されているディレクトリに移動し、次のコマンドを実行します。

```sh
sudo apt install ./sdkmanager_*-*_amd64.deb
```

## NVIDIA SDK Managerを起動

コマンドラインにて`sdkmanager`を実行します。作業を行う前にNVIDIA SDK Managerのバージョンが最新になっていることを確認します。最新でない場合は、最新にする必要があるようです。私の場合、ダウンロードしたファイルをインストールするだけでは最新ではなかったのでログインに失敗しました。NVIDIA SDK Manager右上のドット3つのアイコンから`Check for update`を選択し、最新のバージョンであることを確認して下さい。

ここまでが準備作業となります。

# ハードウェアセットアップ

## NVMe SSDをインストール

M.2 Slot (Type 2280)がPCIe 3.0 x4、M.2 Slot (Type 2230)がPCIe 3.0 x2となります。いずれかにNVMe SSDをインストールします。

## 強制リカバリモードの設定

別途手配したジャンパピンを使って、Jetsonモジュールの下にある12ピンのFC RECピンとGNDピンをショートさせ、強制リカバリモードの設定にします。

## ホストマシンとJetson Orin Nanoを接続

ホストLinuxマシンとJetson Orin NanoのUSB-CポートをUSB 3.0ケーブルを使って接続します。USB 3.0ケーブルであれば、両方がUSB-Cである必要はないようです。

::: note info
ホストLinuxマシンとJetson Orin Nanoの接続には、USB 3.0ケーブル(USB-Aの場合コネクタ内部が青くなっているもの)を使う必要があります。
:::

## SDK Managerの設定

[Install Jetson Software with SDK Manager](https://docs.nvidia.com/sdk-manager/install-with-sdkm-jetson/index.html)を参照しながら、各種設定を行います。ダウンロードとインストールは、合計すると30分以上は時間がかかったように思います。気長に対応しましょう。

途中に何度な設定を行う箇所が表示されます。先に案内したドキュメントを参照しながら適宜設定を行なって下さい。ユーザ名、パスワード、インストール先などの設定が途中で表示されます。

::: note info
STEP 01の設定の際に、Target Hardwareが表示されない場合は、ケーブルが適切ではないなどの可能性があります。

SDK VERSIONが適切に表示されない場合は、ホストLinuxのOSとそのバージョン、および対象のJetPackバージョンがサポートされていない可能性があります。

ホストLinuxマシンに容量が足りないとSTEP 03に進むことができません。ストレージの残容量が60GB程度では足りないようでした。
:::

## Jetson Orin Nanoにログイン

インストールが完了すると作業終了となります。Jetson Orin Nanoにログインし、一旦シャットダウンします。その後、ジャンパピンを外して利用します。

## 動作確認

pythonのバージョンを確認してみました。

```sh
python3 --version
Python 3.8.10
```

PyTorchも確認しましたが、インストールされていないことが分かりました。コンテナ環境でセットアップするため、ホストOS側にインストールする必要はない、ということです。

```sh
python3
Python 3.8.10 (default, May 26 2023, 14:05:08) 
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'torch'
>>> exit()
```

ファイルシステムを確認すると下記のようになっています。

```sh
df -h .
Filesystem      Size  Used Avail Use% Mounted on
/dev/nvme0n1p1  233G   15G  206G   7% /
```

# 参考情報

- [JetPack SDK](https://developer.nvidia.com/embedded/jetpack)
- [SDK Manager](https://developer.nvidia.com/sdk-manager)
- [NVIDIA SDK Manager / Install Jetson Software with SDK Manager](https://docs.nvidia.com/sdk-manager/install-with-sdkm-jetson/index.html)
- [NVIDIA SDK Manager / System Requirements ](https://docs.nvidia.com/sdk-manager/system-requirements/index.html)