Elsaの技術日記(徒然なるままに)

主に自分で作ったアプリとかの報告・日記を記載

MENU

Jetsonでのotgデバイスモードでファイル共有を行う

とうとう我が家もJetsonをお迎えしました!!
Jetson nanoです!!

NVIDIA Jetson Nano 開発者キット B01

新品価格
¥16,990から
(2021/1/30 17:50時点)

先ほどまでセットアップを実施していたのですが、どうやらotgデバイスモードを用いることが出来る模様。
試しに使ってみましたが、躓いたこところがあったのでまとめておこうと思います!!



■Jetsonとは??

Wikipediaにはこちらのように記載されております。
NVIDIA社の組み込みシングルボードコンピュータのシリーズである。
Jetsonは、機械学習アプリケーションを目的として設計され、画像認識、機械学習や自動運転などを高速に実行するための、GPUを備えた並列処理用の組込み用コンピューティングボードである。
※参考:https://ja.wikipedia.org/wiki/NVIDIA_Jetson

機械学習ディープラーニングを利用した組み込みアプリケーションをいじってみるのにちょうどいいマシンだと認識しています。

■Jetson Nanoセットアップ手順

セットアップですが、こちらに記載されております。
qiita.com

まぁ、
 ・NVIDIAのホームぺージでイメージファイルをダウンロードしてきて、μSDにイメージファイルを書き込む
 ・μSDをJetson nanoに挿入し電源ONすればセットアップ画面が表示されるので設定する
で終了。
ベースがUbuntuだったので、後はUbuntuを設定するようにWifi設定などを実施すればOKです。
イメージファイルはこちらに格納されております(ダウンロードするためにはNVIDIAへのアカウント登録が必要になります)。
https://developer.nvidia.com/embedded/downloads

■otgデバイスモードでのファイル共有を動かしてみる

では本題に移っていきます。
otgデバイスモードでのファイル共有ですが、
Jetson側のMicroUSBポートとPCのUSBポートを接続
すれば、エクスプローラが表示され、ファイルの共有が行えるようになります。
初期状態は、”version”フォルダのみ存在しております。

何だ、簡単じゃん。
と思ったのですが、困ったことがありました😅。

PCからフォルダ追加やファイル修正等wireが出来ず、readのみ対応しているのはまぁよいのです。
ただ、Jetson側からもフォルダ内の書き込み・修正、すなわちwire動作が行えなかったのです。。。

■なぜJetson側からのwrite動作が行えないのか?

どうやら、

/opt/nvidia/l4t-usb-device-mode/filesystem.img

がループバックデバイスと登録されており、こちらのイメージファイルがマウントされて使用されている模様。
さらに

lsblk -f

でループバックデバイスを確認したところ、

/dev/loop0

がヒット。
ということで試しに、

sudo mount /dev/loop0 /mnt

を実行。
すると、

can't read superblock on /dev/loop0

とエラーになりマウントできず。。。
では、filesystem.imgをループバックマウントしたれ!!と思い実行。

sudo mount -t vfat -o loop /opt/nvidia/l4t-usb-device-mode/filesystem.img /mnt

すると、マウントは出来たのですが今度はこちらのようにReadOnlyである旨のエラーが出力。。。

mount: /mnt: WARNING: device write-protected, mounted read-only.

ということでJetson側からのファイル書き込みが行えない状態でしたとさ。

■対処!!

流石にこのままだと使い物にならないのでどうにかしてJetson側はWrite可能にしたいと思います!!

コマンドはこちらです。

sudo /opt/nvidia/l4t-usb-device-mode/nv-l4t-usb-device-mode-stop.sh
sudo losetup -D
sudo mount -t vfat -o loop /opt/nvidia/l4t-usb-device-mode/filesystem.img /mnt
sudo losetup --show --find /opt/nvidia/l4t-usb-device-mode/filesystem.img
sudo /opt/nvidia/l4t-usb-device-mode/nv-l4t-usb-device-mode-start.sh

実施していることですが、

sudo /opt/nvidia/l4t-usb-device-mode/nv-l4t-usb-device-mode-stop.sh
sudo losetup -D

にてotgデバイスモードを一旦停止かつデバイスのデタッチを実行。

そして、

sudo mount -t vfat -o loop /opt/nvidia/l4t-usb-device-mode/filesystem.img /mnt
sudo losetup --show --find /opt/nvidia/l4t-usb-device-mode/filesystem.img
sudo /opt/nvidia/l4t-usb-device-mode/nv-l4t-usb-device-mode-start.sh

にて
"ループバックマウントを行った後にループバックデバイスとして登録、otgデバイスモード起動"
を実行しております。

起動時は、
ループバックデバイス登録⇒otgデバイスモード登録⇒ループバックマウント
の順になっていたためにReadOnlyになってしまっていたのですね。
なので、
ループバックマウント⇒ループバックデバイス登録⇒otgデバイスモード登録
とすることで解決させることが出来ます。

■せっかくなので

せっかくなのでループバックデバイスの新規作成手順についてもまとめておきます。

まず、ループバックデバイス

 /opt/nvidia/l4t-usb-device-mode/filesystem.img

となっているのは、
/opt/nvidia/l4t-usb-device-mode/nv-l4t-usb-device-mode-config.sh
ファイル末尾の

# The disk image to export as a USB Mass Storage device
fs_img="${script_dir}/filesystem.img"

にてコンフィグ設定されております。
もしfilesystem.imgではなくて別のファイル名がいい!!ですとか、
ファイルパスを変更したい!!
という場合にはこちらのコードを変更下さい。

さらにイメージファイルを作成する手順ですが、こちらのサイトに記載されている通り、
https://forums.developer.nvidia.com/t/how-to-set-tx2-otg-usb-as-device-mode/50771/48

sudo /opt/nvidia/l4t-usb-device-mode/nv-l4t-usb-device-mode-stop.sh
sudo losetup -D
sudo truncate /opt/nvidia/l4t-usb-device-mode/filesystem.img --size=2147483648
sudo losetup --show --find /opt/nvidia/l4t-usb-device-mode/filesystem.img
sudo gdisk /dev/loop0
 n
 クリック3回
 w
 Y
sudo mkfs.vfat /dev/loop0

になります。

 n
 クリック3回
    0700
 w
 Y

ですが、gdiskを実行するといくつか入力を求められるのでこちらを実行下さい。ということです。
(分かりにくくてすいません😢)

/opt/nvidia/l4t-usb-device-mode/filesystem.imgファイルパスですが各自使用したいファイル名・パスに読み替えてください。

こちらのコマンド群ですがまず、

sudo truncate /opt/nvidia/l4t-usb-device-mode/filesystem.img --size=2147483648

にてイメージファイルを作成。
そして、

sudo gdisk /dev/loop0

にてパーティション作成。

sudo mkfs.vfat /dev/loop0

でvfatでフォーマットを実行。
になります。

■最後に

jetsonはまだ使用したばかりなので詳しく分かっていないですが、
GPUを使用しない分にはubuntuですね。
otgについては、ネットワークが使用出来ればFTPで問題ないですが、ネットワークが使用出来ない環境では役に立ちそうです!!