Jetson Nanoの/をUSBドライブにしてSDカードを長生きさせる

本記事では、Jetson Nanoに外付けのUSBドライブを接続し、ルートパーティションとしてマウントする方法を説明します。これにより、SDカードの寿命を長くする効果が期待できます。（起動のためにSDカードは必要です）

# 背景
すぐやり方を知りたい方は読み飛ばしてください。

[Jetson Nano](https://www.nvidia.com/ja-jp/autonomous-machines/embedded-systems/jetson-nano/)を長時間運用したい時に心配なのはSDカードの寿命です。一番安くて普及しているTLC方式のSDカードだと[1000回くらい書き換えたら終わり](https://tokusengai.com/_ct/17259668)だそうです。データ交換目的ならそれでもいいのかもしれませんが、これをメインのストレージとしてOSを走らせ続けたら、ログを書き込んでいくだけですぐ壊れそうです。私がスタータキットとして買ったセットについてきたSDカードも残念ながらTLCでした。これは急いで対策しないといけません。そこで、外付けのUSB Driveをルート/にマウントすることでハードな読み書きはこちらに任せて、SDカードはブート時に読む以外は使わないようにしたいと思います。

なお、私はUSBのHDDを用いたのでUSBメモリなどは試していないのですが、きっと同様に実施できるのではと思います。本記事では両方をまとめて USB Drive と呼びます。

# 方法

このリポジトリを利用します。
https://github.com/JetsonHacksNano/rootOnUSB

やり方はこちらに出ています。
https://www.jetsonhacks.com/2019/09/17/jetson-nano-run-from-usb-drive/

ビデオもあります。英語が得意な方はこれを見るだけで十分でしょう。
[![Jetson Nano USB Drive](http://img.youtube.com/vi/J9EJ52Za7IE/0.jpg)](http://www.youtube.com/watch?v=J9EJ52Za7IE)

本記事は基本的に上に載っている情報の和訳(2020/1/22現在)ですが、パーティションの話題など若干追加しています。

## 1. USB Driveに、必要に応じてパーティションを切り、ext4でフォーマットする。

USB Drive全体にわたってJetson Nanoからのみ使えればよい場合は、パーティションは１つだけでOKです。そこをext4でフォーマットしておいてください。

私の場合はデータ領域をWindowsからも読める状態にしておきたかったので、Jetson Nanoの/をマウントするシステム領域はext4で128GB、残りのデータ領域をntfsと、２つのパーティションに分けることにしました。パーティションに分けるのは普通の手続きなので詳細は説明しませんが、私は[GParted](https://ja.osdn.net/projects/gparted/)を使いました。[公式](https://www.jetsonhacks.com/2019/09/17/jetson-nano-run-from-usb-drive/)では ‘Disks’ というソフトを使っているようです。
![Screenshot from 2020-01-21 22-46-41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125904/1e37122b-1084-6807-4f07-031e3bf3b416.png)

## 2. rootOnUSBリポジトリの利用

できればインストールしたてのJetson Nano（通常のSDカードで起動したもの）に、上のステップで準備したUSB Driveを接続しておきます。

### 2.1. USBサポートのあるブートカーネルのビルド

ターミナル上で、以下を実行します。

```bash
$ git clone https://github.com/JetsonHacksNano/rootOnUSB
$ cd rootOnUSB 
$ ./addUSBToInitramfs.sh
```
Warningがいくつかでますが気にしないでおきます。

### 2.2. USB DriveのデバイスパスとUUIDの確認

次にこれからマウントしようとしているパーティションの情報を調べるため、リポジトリ内のdiskUUID.shスクリプトを実行します。

```
$ ./diskUUID.sh
UUID of Disk: /dev/sda1
XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX

Sample for /boot/extlinux/extlinux.conf entry:
APPEND ${cbootargs} root=UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX rootwait rootfstype=ext4
```
この"UUID of Disk"の後に書かれている /dev/sda1がデバイスパスで、その次の行がUUID(伏字)です。もしそれらが表示されていなかったら、ターゲットのパーティションがext4でフォーマットされていないことが考えられるので確認してください。

このAPPENDから始まる最後の行はあとでコピペして使います...①

### 2.3. 現在のSDカードの/を、USB driveにコピーする

これにもリポジトリに含まれるcopyRootToUSB.shスクリプトを使います。
このとき、-pオプションでマウント先のデバイスパスを指定します。

```
$ ./copyRootToUSB.sh -p /dev/sda1
```

### 2.4. 起動時にUSB Driveをマウントするための設定

/boot/extlinux/extlinux.conf のバックアップをとった上で変更します。

```
$ sudo cp /boot/extlinux/extlinux.conf /boot/extlinux/extlinux.conf.bk
$ sudo vi /boot/extlinux/extlinux.conf
```
このファイルの中に以下のような記述があると思います。

```
LABEL primary
      MENU LABEL primary kernel
      LINUX /boot/Image
      INITRD /boot/initrd
      APPEND ${cbootargs} quiet
```
この下２行を書き換え、以下のようにします。
最後のAPPEND行は、2.2で./diskUUID.shを実行した時に最後に表示された行 ① から貼りつけます。

```
LABEL primary
      MENU LABEL primary kernel
      LINUX /boot/Image
      INITRD /boot/initrd-xusb.img
      APPEND ${cbootargs} root=UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX rootwait rootfstype=ext4

```

これで完了です。rebootしたのちに、dfしてみてください。

```
$ df
Filesystem      1K-blocks     Used  Available Use% Mounted on
           :
/dev/sda1       131063268 10725396  113610604   9% /
/dev/sda2      3772798972   254196 3772544776   1% /media/XXXXXXXXXXXXXXXX
           :
/dev/mmcblk0p1   28656684 10703384   16644588  40% /media/u/YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY
           :
```
私の環境での結果（抜粋）はこんな感じで、/がUSB Driveのデバイスパスになっていることがわかると思います。
また、ntfsのパーティーションも自動的にマウントされています。ここにデータを書き込めば、このUSB DriveをWindowsに接続しても読めるはずです。
SDカードも依然マウントはされているようです。

以上です。
もちろんHDDにも寿命はありますが、とりあえずこれでしばらくは安心ですかね。

関係ないですが、[Banggoodで売っているこのケース](https://www.banggood.com/Jetson-Nano-Metal-Case-Enclosure-with-Power-Reset-Control-Switch-for-Jetson-Nano-Developer-Module-Kit-p-1519035.html?rmmds=search&cur_warehouse=CN)おすすめです！

![82657308_10217655110783534_1845782291607977984_o.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125904/e1abe9ed-ad91-0c53-e8f1-3081a9b35bfa.jpeg)