本記事では、Jetson Nanoに外付けのUSBドライブを接続し、ルートパーティションとしてマウントする方法を説明します。これにより、SDカードの寿命を長くする効果が期待できます。(起動のためにSDカードは必要です)
背景
すぐやり方を知りたい方は読み飛ばしてください。
Jetson Nanoを長時間運用したい時に心配なのはSDカードの寿命です。一番安くて普及しているTLC方式のSDカードだと1000回くらい書き換えたら終わりだそうです。データ交換目的ならそれでもいいのかもしれませんが、これをメインのストレージとして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/
ビデオもあります。英語が得意な方はこれを見るだけで十分でしょう。
本記事は基本的に上に載っている情報の和訳(2020/1/22現在)ですが、パーティションの話題など若干追加しています。
1. USB Driveに、必要に応じてパーティションを切り、ext4でフォーマットする。
USB Drive全体にわたってJetson Nanoからのみ使えればよい場合は、パーティションは1つだけでOKです。そこをext4でフォーマットしておいてください。
私の場合はデータ領域をWindowsからも読める状態にしておきたかったので、Jetson Nanoの/をマウントするシステム領域はext4で128GB、残りのデータ領域をntfsと、2つのパーティションに分けることにしました。パーティションに分けるのは普通の手続きなので詳細は説明しませんが、私はGPartedを使いました。公式では ‘Disks’ というソフトを使っているようです。
2. rootOnUSBリポジトリの利用
できればインストールしたてのJetson Nano(通常のSDカードで起動したもの)に、上のステップで準備したUSB Driveを接続しておきます。
2.1. USBサポートのあるブートカーネルのビルド
ターミナル上で、以下を実行します。
$ 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
この下2行を書き換え、以下のようにします。
最後の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で売っているこのケースおすすめです!