2021/02/08

Jetson Nano devkit(B01)+USBドライブブート

 久しぶりの投稿です。数年GPU/AI関連の組み込み系の仕事をしていましたが、昨年からWeb系になり、なんとなくブログも再開ですかね。

で、久しぶりのネタは、NVIDIA Jetson Nanoです。前回の仕事でTegraTX2とかいじってましたが、そういう仕事から離れてしまったので個人的に購入してみました。

セットアップする際にSDcardからブートするのはいいとして、自分がやりたいのはUSBでつないだSSDドライブからのブートです。

色々記事を読むと rootOnUSB を使うのが良さそう?と、やってみましたが、うまく起動しませんでした。無理やり起動させることは出来ましたが、安定しませんでした。rootOnUSBのリリースノートには、L4T 32.2.3 と書かれてますね。なるほど。今現在のJetPackSDK(4.5)のL4Tは32.5です。だからだめなんですかね。

つうことで、JetPackSDK(4.5)のリリースノートを読むと、なんとブータブルUSB drive対応と書かれています。やってみました。ちゃんと出来ました。ブート時、SDcardも不要です。SDcardがなければ自動的にUSBドライブからブートするシーケンスになっています。

以下自分がやったこと

昔何かで使って余っていたIntel SSD 600pシリーズ 512GB M.2 PCIEx4をUSB-SSDケースに入れ、Nanoに接続

JetsonNanoのJ50の9と10をショートさせて、リカバリーモードで起動する

JetsonNanoのflush port(microUSB port)からLinuxホストマシンへ、USBシリアルデバイス ftdi232 経由で接続。ホストでlsusbすると

Bus 001 Device 029: ID 0955:7f21 NVIDIA Corp. APX

って出てくる。7f21ってのがリカバリーモードで接続されているってことになるらしい。

LinuxホストにSDKManagerをインストール。手動でもできるようだが、勝手がわからないので無難に。と思ったがSDKManagerはUbuntu 16.04か18.04じゃないと動かないと!自分の環境は20.04。実際に動かしてみるとバージョンが合わないというメッセージが出て先に進めない。。。dockerで18.04動かしてX動かしてとも考えたが、超めんどい。

/etc/os-releaseのVERSION_IDを"18.04"に書き換えると動くという情報があり、やってみたら無事に動いた!よかった。。。

SDKManagerでの作業を進める。SSDドライブへのフラッシュも問題なく行えた。
こちらからフラッシュするドライブを選択とかしないのかな?と思ったけど特に指定することなく自動認識されたようだ。
フラッシュが完了したあたりで、JetsonNanoがリブートするので、リカバリージャンパーは外しておく。あとはSDcardでやることと同じ。

シリアルコンソールで確認
Jetsonのシリアルコンソールにドライブのinodeが破損している的なメッセージが出たが、何度かe2fsckを行って修復した。
あと、tegra-xusb 70090000.xusb: ERROR Transfer event for disabled endpoint or incorrect stream ring とかなんとかエラーが出てる。これは Quick Summary on Using USB external disk for Jetson Nano で解決した。
シリアル接続は こちら を参考にした。手元にesp32cam用に使っていたftdi232を使って接続した。
シリアル端末はminiconやcuを使う話が多いが、自分はscreenを使った。cuだとキー入力が送られなかった。sudo screen /dev/ttyUSB0 115200 って感じ。

ここまで動いたら、JetPack SDKはSDKManager使わなくても
sudo apt update
sudo apt install nvidia-jetpack

 で入る。この方がアップデートもしやすい。

次やりたいのが、headless起動でもx11vnc使って1920x1080リアルフレームバッファのリモートデスクトップ環境が作れないかと。edid読むようにカーネルビルドしただけではだめっぽい。やってる人いたら教えてほしいです。

$ xrandr --fb 1920x1080

で普通にできた!ポイントは、x11vnc経由でちゃんとログインすること。その後ならxrandrが使える。ディスプレイ出力しないので、fb解像度だけ設定すれば良い。~/.xsessionrcの最後に書いておけばログインしたときに自動的に拡張される。