LoginSignup
5
1

Nerves デバイスの /data ディレクトリ

Last updated at Posted at 2023-12-13

読み込み専用ファイルシステムSquashFS

Nervesは読み込み専用ファイルシステムであるSquashFSを採用し、不測の電源障害が起きてもファイルシステムが壊れない堅牢な組み込み IoT システムを実現しています。

現実は永続化したいデータや設定がいくつかあると思いますので、全く書き込めないとそれは不便です。そのためNervesは書き込める場所を用意してくれています。

それが、特別に書き込める場所/dataです。

書き込める場所/data

Nervesシステムのルートファイルシステム(Rootfs)は読み取り専用としてマウントされているため、それとは別に Application という読み書き可能な領域が設けられ、それがルートユーザーのホームディレクトリとして/dataにマウントされています。

実際には、書き込み可能なパーティションは常に /root であり、/data/root へのシンボリックリンクです。

 +----------------------------+
 | MBR                        |
 +----------------------------+
 | Firmware configuration data|
 | (formatted as uboot env)   |
 +----------------------------+
 | p0*: Boot A        (FAT32) |
 | zImage, bootcode.bin,      |
 | config.txt, etc.           |
 +----------------------------+
 | p0*: Boot B        (FAT32) |
 +----------------------------+
 | p1*: Rootfs A   (squashfs) |
 +----------------------------+
 | p1*: Rootfs B   (squashfs) |
 +----------------------------+
 | p2: Application     (EXT4) |
 +----------------------------+

/dataの中身

/dataの中身はnerves_system_xxxパッケージのrootfs_overlay/etc/erlinit.config設定ファイルにより決定されるようです。詳しくは知りません。

nerves_system_xxxxxxの部分はお手元のデバイスに対応するNerves Targetに読み替えてください。Nerves公式サポートのNerves Target以外にもコミュニティによって制作されたカスタムシステムも多数あります。

例として挙げると、Raspberry Pi 4に対応するNerves Targetrpi4になります。

mix burnを実行すると SDカード全体を事実上初期の状態にリセットことになるので、/dataのファイルが消去されます。一方、ネットワークを介した通常のファームウェアの更新は/data には影響しません。

/dataの中身を読み書きするシナリオはいくつか考えられます。

  • ファームウエアをビルドして、SDカードに焼くときに初期化される
  • エンジニアがSFTPで読み書き
  • Elixir アプリ(ライブラリ)が永続化するデータを読み書き
  • 工場出荷状態に初期化

rootfs_overlay

Nerves システムに用意されている初期設定をちょこっとだけ変更したい場合には、rootfs_overlayという仕組みがあります。これにより直接nerves_system_xxxをいじらずにプチカスタマイズすることが可能となります。

オーバーレイとは「重ね合わせる」という意味で、ルートファイルシステムに追加したいディレクトリ構造を提示し、それがファームウエアをビルドするときにルートファイルシステムに重ね合わされて実際にルートファイルシステムの一部となるというイメージです。

Nerves により生成されたElixirプロジェクトには、rootfs_overlay ディレクトリが含まれており、config/config.exsにそれ用の設定項目があります。

基本的に、rootfs_overlay ディレクトリに置いたものはすべてディスク上にオーバーレイされます。 例えば、あるファイルをデバイス上の /etc/some_data_file.txt に存在させたい場合は、そのファイルを rootfs_overlay/etc/some_data_file.txt のリポジトリに置くことになります。

config/config.exs
config :nerves, :firmware, rootfs_overlay: "rootfs_overlay"

一例としてNerves Livebookrootfs_overlayディレクトリにはこんなファイルが含まれています。

rootfs_overlay/etc/iex.exs
NervesMOTD.print()

# Add Toolshed helpers to the IEx session
use Toolshed

このファイルがファームウエアのファイルシステムの/etc/iex.exsファイルとなり、IEx 起動時の挙動を変更しています。

同様に/dataの中身を変更したい場合は、ご自身の Nerves プロジェクトにrootfs_overlay/etc/erlinit.config ファイルを用意することにより、ご使用の Nerves システム(例、Raspberry Pi 4用はnerves_system_rp4)にある同じものを上書きすることができます。

ここで注意すべき点は、オーバーレイを適用すると、内容が結合されるのではなく、ファイル全体が置き換えられることです。 したがって、最初に元のファイルを取得してそれを必要に応じて変更するというやり方が安全です。

rootfs_overlay で禁止されていること

v1.9.2から以下のディレクトリ(/rootを含む!)のオーバーレイが禁止になりましたので、注意してください。

  • /root
  • /tmp
  • /dev
  • /sys
  • /proc

ですので直接、初期設定の/rootを上書きすることはできません。システムの初期設定は(手作業でなく)設定ファイルを介して行います。

Nerves JP

Nerves にご興味のある方は、ぜひ Nerves JP にお越しください。わいわいガヤガヤ楽しく Nerves してます。

toukon-qiita-macbook_20230912_091808.jpg

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1