Jetson NanoでHeadlessセットアップを行う

## 【目的】
Jetson NanoでHeadlessセットアップを行います。

## 【内容】
エッジ系デバイスはモノが小さい分、マウスやキーボード、更にはディスプレイなどの付属品をつけるとケーブル類が邪魔で困ります。
ラズパイを触っているときには公式イメージでHeadlessセットアップが行えましたが果たしてJetson Nanoでは可能なのでしょうか?

調べてみたところNVIDIAが公開している「JetCard」を使えば、簡単にHeadlessセットアップが行えることがわかりました。
今回はこれを使ってチャレンジします。

##【前提条件】
本手順では以下のHWが必要になります。

- SDカード (32GB以上)
- DC電源 (5V 4A)
- PC (SDイメージを書いたり、ssh接続するため)
- Wifiアダプタ (オプション)
- VNC設定

DC電源はHeadlessセットアップには必須ではありませんが、本手順においては必須です。
無いと結構面倒だと思います。


## 【作業手順】
基本的には以下のリポジトリの内容を踏襲します。
[【JetCard - GitHub】](https://github.com/NVIDIA-AI-IOT/jetcard)

本記事では以下の手順を行います。

1. OSイメージとSDカードの準備
2. Jetson Nanoの起動
3. USB Device Modeの利用
4. sshで接続
5. Wifi設定
6. システムアップデート
7. その他  
  - Jupyter Lab
  - VNC設定

## 【OSイメージとSDカードの準備】
まずはOSイメージであるJetCardをダウンロードします。
[JetCardのリポジトリ](https://github.com/NVIDIA-AI-IOT/jetcard)から最新バージョンをダウンロードしてください。
本記事を書いて時点では以下のURLからダウンロードしました。

[【ダウンロード JetCard image（GoogleDrive)】](https://drive.google.com/open?id=1wXD1CwtxiH5Mz4uSmIZ76fd78zDQltW_)

ダウンロードしたイメージファイルをSDカードに書き込んでください。
ここではSDカードへの書き込み手順は書きませんが、公式手順では [Etcher](https://www.balena.io/etcher/) などを使ってFlushしろと書かれています。


## 【Jetson Nanoの起動】
SDカードの準備が出来たらPCからSDカードをアンマウントして、Jetson Nanoに挿入してください。
そして電源を入れてJetson Nanoを起動してください。

この時一点注意があります。
Jetson Nanoには電源供給ポートが2つあります。
1つはMicroUSBポートによるUSBからの給電。 (下記画像の③)
もう一つはACアダプタを利用したDCジャックからの給電です。 (下記画像の⑧)
本手順では⑧のDCジャックからの給電を想定した手順になっています。
なお、DCジャックから給電するためにはDCジャック後方にある「J48」と書かれているジャンパーをシャントする必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454012/4523943d-76c5-2275-743d-a5b1598eb23e.png)



## 【USB Device Modeの利用】
DCジャックから給電してJetson Nanoを起動した場合、「USB Device Mode」というものを利用できるようになります。
具体的には給電に使っていないMicroUSBポートにデータ通信可能なUSBケーブルを接続したJetson Nanoを、パソコンのUSBに接続することで利用可能になります。

Jetson Nanoをパソコンに接続すると、ネットワークアダプタとReadMeが含まれたディスクがパソコンにマウントされます。

【追加されたネットワークアダプタ】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454012/4f089cc5-e2f5-1fbe-410a-af352eaa2a66.png)

【マウントされたパティション】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454012/6d7b8fdd-aa26-7d3c-ac16-084347832083.png)

なお、USB Device ModeはGithubのissuesなどを見る限りJetCardを利用時のみ有効なようで、公式OSイメージでは機能しないようです。


## 【sshで接続】
JetCardではデフォルトでsshサービスが起動しています。
USB Device Modeを利用している場合は、 `192.168.55.1` に対してsshで接続可能です。
ログイン時のユーザおよびパスワードは `jetson` になります。

```shell:ssh接続
ssh jetson@192.168.55.1
```
Windows7など、標準でsshクライアントが利用できない場合はTeraTermなどを利用してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454012/9f2c7ced-bcb1-dc20-4b4a-24086e1650dd.png)

なお、USB Device Modeを利用していない場合は、有線LANに接続した上で何らかの方法でJetson NanoのIPを知る必要がありますが、ここでは割愛します。

## 【Wifi設定】
sshで接続できたらWifiの設定を行います。
有線LANで運用する場合は、この項目は読み飛ばして構いません。

まずは、WifiドングルをUSBポートに挿してください。
`lsusb` コマンドや `iwconfig` でWifiドングルを認識していることが確認できたら、下記コマンドでSSIDを探しましょう。

```bash:Wifi確認
sudo nmcli device wifi rescan
sudo nmcli device wifi list
```
```bash:出力結果
IN-USE  SSID               MODE   CHAN  RATE        SIGNAL  BARS  SECURITY
        SSID1              Infra  1     130 Mbit/s  92      ????  WPA2
        SSID2              Infra  1     130 Mbit/s  92      ????  WPA2
        SSID3              Infra  11    130 Mbit/s  92      ????  WPA2
        SSID4              Infra  11    130 Mbit/s  89      ????  WPA2
        --                 Infra  13    130 Mbit/s  75      ???_  WPA2
        SSID5              Infra  13    130 Mbit/s  75      ???_  WPA2 802.1X
        ......
        <後略> 

```

接続したいSSIDが見つかったら、下記コマンドでWifiに接続します。
`<ssid>` や `<password>` 実際に接続する環境に合わせて変更してください。

```bash:Wifi接続
sudo nmcli device wifi connect <ssid> password <password>
```
```bash:Wifi接続結果
Device 'wlan0' successfully activated with 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx'.
```

上記のような出力が表示されたらWifiへの接続完了しています。

`ip a` コマンドで割り当てられたIPアドレスが確認できればJetson NanoをUSBポートから外してしまっても良いかと思います。

## 【システムアップデート】
ここまで出来たらネットワークの接続が完了しています。
下記コマンドを実行してシステムアップデートを行います。

```bash:システムアップデート
sudo apt update
sudo apt upgrade
sudo apt dist-upgrade
sudo apt autoremove

# 再起動
sudo reboot
```

概ね設定が完了したのでディスクの空き容量を確認してみましょう。

```
df -h
/dev/root        30G   18G   11G  64% /
devtmpfs        1.8G     0  1.8G   0% /dev
tmpfs           2.0G  4.0K  2.0G   1% /dev/shm
tmpfs           2.0G   19M  2.0G   1% /run
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
tmpfs           397M  116K  397M   1% /run/user/1000
```
すでに32GBのSDカードを60%以上使ってるとか…


## 【その他】
### Jupyter Lab
JetCardは起動した時点でJupyter Labが動くようになっています。
USB Device Modeの場合は `http://192.168.55.1:8888` にアクセスするとJupyter Labが起動します。
なお、接続時のパスワードは `jetson` です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454012/868f08dc-7a70-e447-6c90-95f3cd3e0a39.png)



### VNC設定
どうしてもGUI環境が必要な方はVNCを設定しましょう。
USB Device Mode時にPCにマウントされる「L4T-README」内に「README-vnc.txt」というファイルがあるので、その手順を踏襲してみます。

まずはvinoをインストールします。

```bash:vinoインストール
sudo apt update
sudo apt install vino
```
コマンドを実行しましたが、vino自体はインストール済みでしたのでこの操作自体は不要でした。

次にvinoを有効化します。

```bash:vinoの有効化_(失敗)
gsettings set org.gnome.Vino enabled true
```
```bash:vinoの有効化_結果
No such key “enabled”
```
何やらエラーが出てしまいました。
vinoを有効化する方法が変わったようです。
調べたところ、いくつか方法がありましたが最終的には以下のフォーラムの情報を参考にしました。


[NVIDIA Developer Forums - Setting up VNC server](https://devtalk.nvidia.com/default/topic/1042018/jetson-agx-xavier/setting-up-vnc-server-solved-/)

```bash:vino起動設定
mkdir ~/.config/autostart/
vi ~/.config/autostart/vino-server.desktop
```

```~/.config/autostart/vino-server.desktop
[Desktop Entry]
Type=Application
Name=Vino VNC server
Exec=/usr/lib/vino/vino-server
NoDisplay=true
```

最後にREADME-vnc.txtの情報をもとに、vinoの設定を変更しました。

```bash:vino設定変更
gsettings set org.gnome.Vino prompt-enabled false
gsettings set org.gnome.Vino require-encryption false

# 再起動
sudo reboot
```

再起動後にVNCの接続が可能になりますので、PCからVNCクライアントで接続します。
USB Device Modeの場合は `192.168.55.1:5900` で接続できます。

上記設定でvinoの暗号化を無効化しているため、接続時には以下の警告が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454012/1d822566-e77b-70fb-3da2-6979f1dd32d2.png)

警告画面を無視して「Connect」を実行すると、VNCの接続が完了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454012/562516a2-e1b6-52a6-fc15-74c469f2b49b.png)

なお、解像度を変えたかったのですが、ディスプレイ非接続状態ではGUIの設定ツールは異常終了して落ちてしまうので設定できませんでした。
CLIや設定ファイルでの設定方法がわからなかったので、御存知の方がいましたら教えて下さい。


## 【最後に】
JetCard + USB Device Mode を使うことで、ほとんど何もせずにsshとJupyter Labが使えるようになって非常に便利です。
あとは好きにカスタマイズしていけば良いです。
ちなみにJetCardはデフォルトではUS環境で動いていますので、必要に応じてタイムゾーンを替えたりUIの言語を替えたりしてください。