読み込み専用ファイルシステム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_xxx
のxxx
の部分はお手元のデバイスに対応するNerves Targetに読み替えてください。Nerves公式サポートのNerves Target以外にもコミュニティによって制作されたカスタムシステムも多数あります。
例として挙げると、Raspberry Pi 4に対応するNerves Targetはrpi4
になります。
mix burn
を実行すると SDカード全体を事実上初期の状態にリセットことになるので、/data
のファイルが消去されます。一方、ネットワークを介した通常のファームウェアの更新は/data
には影響しません。
/data
の中身を読み書きするシナリオはいくつか考えられます。
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 :nerves, :firmware, rootfs_overlay: "rootfs_overlay"
一例としてNerves Livebookのrootfs_overlay
ディレクトリにはこんなファイルが含まれています。
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 してます。