NVIDIA Jetson NanoのROM化手順 ① (Jetson NanoをROM化してみた)

NVIDIA Jetson NanoのROM化手順 ① (Jetson NanoをROM化してみた)

背景

飲食店向けの自動会計システムにNVIDIA Jetson Nanoを組み込んだエッジAI端末を使用しています。

運用中、急に電源を切られてしまうことがあり、それによるOSイメージの破損が度々発生していました。

目的

電源が突然切られたりしたときに、Jetson Nanoが起動不可になることを防ぐことが目的です。
Read Only Memory化(以下ROM化)をすることで、起動失敗や電源OFFによるファイル破損の可能性を少なくできます。

ROM化とは、デバイスを読み込み専用でマウントすることでファイルの変更を生じないようにすることです。

Jetson Nanoのルートディレクトリ全体をROM化する手順を本記事でご紹介します。

開発環境

試した環境は以下の通りです。

項目 内容
OS Ubuntu18.04
BSP JetPack 4.4.1
HW NVIDIA Jetson Nano

ROM化

今回は下記ライブラリを使用してROM化を試みます。

https://github.com/lehni/root-ro

ただし、ライブラリに書いてある手順だとOSの起動ができなくなってしまったため、手順を加えています。

手順

1. Githubからライブラリをcloneしてきて、配下のディレクトリに移動します。

$ sudo apt-get -y install git
$ mkdir ~/git # git cloneのため、任意のディレクトリを作成
$ cd ~/git # 作成したディレクトリに移動
$ git clone https://github.com/lehni/root-ro.git
$ cd root-ro

2. 下記スクリプトを実行します。

$ sudo ./install-nano.sh

3. /boot/extlinux/extlinux.conf を書き換えます。

当該ファイルの内容に、下記行が含まれているかと思います。

APPEND ${cbootargs} quiet root=/dev/mmcblk0p1 rw rootwait rootfstype=ext4

ここで、以下のように「rw」の箇所を「ro」に書き換えましょう。

APPEND ${cbootargs} quiet root=/dev/mmcblk0p1 ro rootwait rootfstype=ext4

書き換え後のファイル全体の内容は以下の通りです。

LABEL primary
    MENU LABEL primary kernel
    LINUX /boot/Image
    INITRD /boot/initrd.img
    APPEND ${cbootargs} quiet root=/dev/mmcblk0p1 ro rootwait rootfstype=ext4

# When testing a custom kernel, it is recommended that you create a backup of
# the original kernel and add a new entry to this file so that the device can

4. OSを再起動します。

上記の手順でルートディレクトリをRead Onlyにすることができました。

ライブラリの手順では 3 が存在せず、この手順を省略すると、Read Onlyにされませんでした。

ROM化ができているかの確認

実際にROM化できているか mount コマンドを実行して確認しましょう。
以下の表示が含まれていたらROM化成功です。
$ /dev/mmcblk0p1 on /mnt/root-ro type ext4 (ro,relatime,data=ordered)

※上記結果は、対象デバイスが /mnt/root-ro にRead Onlyでマウントされていることを表しています。

ROM化後の挙動の確認

Read Onlyでマウントすると、OSをシャットダウンする度にファイルの変更がなかったことになります。
実際に見てみましょう。
まず、以下のようにディレクトリとファイルを新規作成します。

$ mkdir test_ro && cd test_ro # テスト用のdirを作成 & 作成したdirにcd
$ ~/test_ro$ touch test.txt # ファイルを新規作成
$ ~/test_ro$ ls # ファイルが新規作成されたことを確認
test.txt

この状態でOSを再起動してファイルを確認すると、

$ ls test_ro
ls: 'test_ro' にアクセスできません: そのようなファイルやディレクトリはありません
$ ls test_ro/test.txt
ls: 'test_ro/test.txt' にアクセスできません: そのようなファイルやディレクトリはありません

と表示されます。
意図通り、OSシャットダウンによってファイルの変更や追加が元に戻ることが確認できました。

ROM化の解除方法

当然、ROM化を解除する方法もあります。
今回使用したライブラリでは、下記のコマンド実行によりROM化の有効/無効を切り替えられます。

Read Onlyを恒久的に解除したいとき

$ sudo /root/reboot-rw
$ sudo reboot now

Read Onlyを恒久的に適用したいとき

$ sudo /root/reboot-ro
$ sudo reboot now

Read Onlyを一時的に解除したいとき

$ sudo /root/mount-rw

Read Onlyを一時的に解除した後、再びRead Onlyにするとき

$ exit
$ sudo /root/mount-ro

次回

今回の記事では、NVIDIA Jetson NanoのROM化手順を試してみました。
紹介した方法には「OverlayFS」という仕組みが使われています。
次回の記事で「OverlayFS」の詳細な解説をします。