JetPack4 でJetsonクローンイメージの作成

# はじめに
JetPack4でJetsonのイメージをコピー＆フラッシュすることができれば，イメージを使用して既に構築してあるJetsonの環境を再構築することができます．

なので，

* 複数台Jetsonがある環境で一個ずつセットアップする**必要（地獄）がなくなる**．
* 複数台無くてもJetsonを**バックアップ**しておくことができる．

などなど，いい事ずくめなのでおすすめです．

# 前提条件
クローンイメージを作成するには以下の条件が必要です．

* JetPackが準備できているか（次の章で詳しく）
* JetPackがインストールしているホストPCは最低でも70GBのストレージ容量が必要（**イメージを作成するごとに**）

# JetPackの準備
まず，クローンイメージをコピー＆フラッシュするにはJetPackの準備が必要です．
このときに準備するJetPackのバージョンは，コピー対象のJetsonやイメージデータを作成したときと
**同じバージョンを用意してください．**
（おそらくバージョンをあわせずできると思いますが，自己責任で）

JetPackの準備はNVIDIAの公式のドキュメントを参照してください．

* [Download and Run SDK Manager](https://docs.nvidia.com/sdk-manager/download-run-sdkm/index.html)
* [Install Jetson Software with SDK Manager](https://docs.nvidia.com/sdk-manager/install-with-sdkm-jetson/index.html)

公式ドキュメントを参照して，以下の写真のところまですすめる． 
※ Jetsonをリカバリーモードにする必要はありません（リカバリーモードにしていた場合は，写真の状態より進みます）
![74586619-9feb4300-502c-11ea-91d1-8125db43ac60.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212330/78a35a83-cd96-1150-0678-d6fe64611def.png)

# クローンイメージのコピー
## 1. flash.shへ移動
クローンイメージをコピーするには`flash.sh`を使用します．
なので，flash.shのある場所に移動してください．

この時に

* JetPack_4.3のところは使用しているJetPackのバージョンによります．
* P3310は，Jetson TX2のモデルネームです．
    * **P3310** (Jetson TX2)
    * **P3448-0020** (Jetson Nano)
    * **P2888** (Jetson AGX Xavier)

に注意しておこなってください．

```bash
$ cd ~/nvidia/nvidia_sdk/JetPack_4.3_Linux_P3310/Linux_for_Tegra
```

## 2. コピーの実行
クローンイメージをコピーするには`flash.sh`の**Gオプション**を使います．
Jetsonをリカバリーモードにした状態でホストPCとUSB接続（microUSB）して，以下のコマンドを実行させる．

この時に

* `my_backup.img`の`my_backup`の部分はイメージデータのファイルの名前になるので勝手に変えて大丈夫です．
* `jetson-tx2`の部分はイメージをコピーする対象のJetsonに変更してください．
    * jetson-tx2
    * jetson-nano-emmc
    * jetson-xavier
* PCのストレージ残容量が70GB以下の場合イメージデータをコピーをすると容量オーバーする場合があるので気をつけてください．

に注意しておこなってください．

```bash
$ sudo ./flash.sh -r -k APP -G my_backup.img jetson-tx2 mmcblk0p1
```

環境によりますが40分ほど待てば，クローンイメージのコピーは完了です．

# クローンイメージのフラッシュ
## 1. コピーしたイメージデータの移動
コピーしたイメージデータ (xxxxxx.img)を`~/nvidia/nvidia_sdk/JetPack_X.X_Linux_PXXXX/Linux_for_Terga/bootloader`にある`system.img`と置き換えてください
`xxxxxx.img.raw`は使用しません．

※ この時にコピーする前のPCのストレージ残容量が70GB以下の場合イメージデータをコピーをすると容量オーバーする場合があるので気をつけてください．

## 2. フラッシュ
次にコピーしたイメージを入れるJetsonをリカバリーモードにした状態でホストPCとUSB接続（microUSB）して以下のコマンドを実行することでフラッシュできます．

※ `jetson-tx2`の部分はイメージをコピー対象のJetsonに変更してください．

* jetson-tx2
* jetson-nano-emmc
* jetson-xavier

```bash
$ sudo ./flash.sh -r jetson-tx2 mmcblk0p1
```

環境によりますが20分ほどまてば，クローンイメージのフラッシュは完了です．
お疲れ様でした．

# JetPack3 の場合
今現在使用している方がいるかわかりませんが，JetPack3以下では`flash.sh`にGオプションが対応していないので以下のサイトにあるflash.shを持ってくる必要があります．
https://devtalk.nvidia.com/default/topic/1000105/jetson-tx2/tx2-cloning/post/5111893/#5111893


上のURLにあるflash.shを持ってくるのは大変なのでGitHub Gistにあげておきました．
以下のコマンドを実行させることでダウンロードできます．

```bash
$ wget https://gist.githubusercontent.com/takayan660/34308575d306333494f93c6d20cb9f75/raw/8b1ddbad912a35a06020557692e51535ae9c4896/flash.sh
```

# 参照
[TX2 Cloning -NVIDIA DEVELOPER](https://devtalk.nvidia.com/default/topic/1000105/jetson-tx2/tx2-cloning/1)

#追記
途中で**ホストPCには最低70GB必要**と記入しましたが，その内訳はコピーした`xxxxxx.img`（最大32GB）と`xxxxxx.img.raw`（約32GB）を合わせた最大容量です．

`xxxxxx.img`はJetsonのクローンイメージデータなので，Jetsonで使用している容量によりこのファイルの容量がきまります．
（例えば，Jetson内部で16GB使用していれば，`xxxxxx.img`も16GBほどになります．）
なので正確には，45GBほどから70GBほどの空き容量が必要です．

また，`xxxxxx.img`は必要ですが，`xxxxxx.img.raw`はイメージのフラッシュには必要ないので，消しても大丈夫です．