概要
最初に触ったLinuxだったのもあってUbuntuベースのJetson Nanoはラズパイより自分にとってとっつきやすく、気軽に使えるLinuxマシンとして遊んでます。
そんなJetson Nanoのバックアップ、dd使っている人が多い様ですが、リスクの高いコマンドなのでいつかやらかしそうで怖い…。
公式のJetCardみたいにEtcherで焼けるイメージを作成すれば安心だし、ホストPC持ってない人に配布したりも出来るよ!ということで手順です。
sdkmanagerが使えるホストPCが必要で、JetPack 4.2.1で検証しています。
必要なファイルを調達する
イメージを作成するのにsdkmanagerの内部スクリプトを利用するので公式サイト等を参考にホストPCからsdkmanagerでビルドします。(JetsonNanoは繋がなくてOK、フラッシュの時点でキャンセルしてください)
ビルドスクリプトを実行
ビルドディレクトリ内にcreate-jetson-nano-sd-card-image.shという物があり、それが同ディレクトリのrootfs内をルートパーティションとしてイメージを作成してくれます。そのルートパーティションを入れ替えてカスタムイメージを作ろうと言う訳です。
そのまま使っても良いんですが、ビルドの邪魔になる/ビルドでファイルを消される恐れがあるので必要な所だけ分離します。その上でrootfs内を削除、お持ちのSDカードのルートパーティション内を丸写しします。通常のJetson Nanoならファイルシステムとして読めるパーティションはルートパーティション1つだけのはずなので、ホストPCにSDカードを差せば自動認識すると思います。
また、初期起動時にルートパーティションを自動拡張してくれる便利なスクリプトがデフォルトでは入っているのですが、このスクリプトは成功時に自己削除を行うため、カスタムイメージ作成時に補充する必要があります。
以下の手順で~/nano_sd_image/MyNano.imgというイメージが作成されます。最終行のオプション-sはdfコマンド実行時に表示される使用済み容量よりも大きい値を指定しておきましょう。
(必要なファイルの分離)
$ mkdir ~/nano_sd_image
$ cd ~/nano_sd_image
$ sudo cp -ra ~/nvidia/nvidia_sdk/JetPack_4.2.1_Linux_GA_P3448/Linux_for_Tegra/. ./
(自動拡張スクリプトの退避)
~/sudo cp rootfs/etc/systemd/nvresizefs.sh ./
~/sudo cp rootfs/etc/systemd/nvresizefs.service ./
(rootfs内の削除)
$ sudo rm -rf ~/nano_sd_image/rootfs/*
(SDカードを差してNanoのデータのコピー)
$ df -BG
Filesystem 1G-blocks Used Available Use% Mounted on
:
/dev/sdb1 59G 16G 41G 28% /media/<ユーザ名>/<デバイス名>
:
$ sudo cp -ra /media/<ユーザ名>/<デバイス名>/. rootfs/
(自動拡張スクリプトの補充)
$ sudo cp nvresizefs.sh rootfs/etc/systemd/
$ sudo cp nvresizefs.service rootfs/etc/systemd/system/
$ sudo ln -s /etc/systemd/system/nvresizefs.service rootfs/etc/systemd/system/multi-user.target.wants/nvresizefs.service
(イメージの作成)
$ cd ~/nano_sd_image
$ sudo ./create-jetson-nano-sd-card-image.sh -o backup.img -s 17G -r 200
これでEtcherで焼けるイメージが現在のディレクトリにbackup.imgとして生成されます。
あとがき
後はこの記事を参考にしてDocker内で完結させれば完璧かも。
このTipsを使ってみなさんの素晴らしいJetson Nano環境を公開してください…