組み込み向けLinuxディストリビューションであるOpenWrtを触っていると、普段のLinuxではあまり見慣れない技術が使われていることに気づきます。本稿ではOpenWrtのファイルシステムで利用されているOverlayFS、SquashFS、JFFS2とその背景知識についてまとめます。
「OpenWrt Project: Filesystems」も合わせて参照してください。
OverlayFS
OverlayFSは2層のファイルシステムの内容を重ね合わせるようなファイルシステムで、下層は読み込み専用、上層は読み書き可能なファイルシステムを使うのが一般的です。OverlayFS全体としては上層と下層を合成したようなファイルシステムとして振る舞います。
OpenWrtの場合、/
以下がOverlayFSにより2つのファイルシステムの重ね合わせで実現されています。
SquashFS
OpenWrtのOverlayFSで重ね合わせているうち下側のファイルシステムにはSquashFSが採用されています。SquashFS上にはOSとして動作する上での必要最低限のファイル群が格納されています。
SquashFSは読み込み専用の圧縮ファイルシステムで、OpenWrtではLZMA圧縮が採用されています。読み込み専用であるため多くのファイルを隙間なく詰め込むことができる点がメリットで、JFFS2に対して20-30%ディスク容量を節約できるようです。
JFFS2
OpenWrtのOverlayFSで重ね合わせているうちの上側のファイルシステムにはJFFS2が採用されています。たとえば、OSインストール後にopkg
コマンドで各自がインストールするパッケージはJFFS2上に書き込まれます。
JFFS2は読み書き可能な圧縮ファイルシステムで、LZMA圧縮が採用されています。また、ジャーナリングおよびウェアレベリングに対応しています。
SquashFS側に存在するファイルを上書きするようだとディスクの無駄遣いということになってしまいますが、そうでなければ限られたストレージ容量を有効活用できるような、組み込み向けの技術だと言えるでしょう。
ウェアレベリング対応ファイルシステムの必要性
ウェアレベリングとは、書きかえ可能回数に制限のあるデバイスで書き換え回数を平均化してデバイスの寿命を延ばすような技術です。ざっくり言えば書き込む記憶素子をバラけさせるような技術ということです。
フラッシュメモリは書き換え回数に制限のあるデバイスであり、ウェアレベリングは必須の技術だといえます。しかし、JFFS2という名前を初めて聞いたような人も多いのではないでしょうか。メインストレージをSDカードに使う前提のRaspberry Pi OS1でさえext4などが採用されています。JFFS2を採用しなくても大丈夫なのでしょうか。
この背景には組み込み機器の特殊性があります。通常のフラッシュメモリ製品(SSDやSDカード・USBメモリなど)では、SoCとフラッシュチップの間にコントローラチップが存在し、ハードウェアでウェアレベリングを行うのが一般的です。一方、組み込み機器では多くの場合SoCとフラッシュチップが直結されているため、ソフトウェアでウェアレベリングを行う必要があるのです。
つまり、JFFS2は組み込み機器に特化したファイルシステムだと言えるでしょう。
使われている様子を確認
OpenWrt 15.05.1上でのmount
の結果を紹介します。
# mount
rootfs on / type rootfs (rw)
/dev/root on /rom type squashfs (ro,relatime)
(略)
/dev/mtdblock8 on /overlay type jffs2 (rw,noatime)
overlayfs:/overlay on / type overlay (rw,noatime,lowerdir=/,upperdir=/overlay/upper,workdir=/overlay/work)
(略)
#
SquashFSとJFFS2が使われているのがわかります。
まとめ
OpenWrtでは読み込み専用の高圧縮ファイルシステムの上に読み書き可能な中圧縮の組み込み向けファイルシステムを重ね合わせることで、限られたストレージ容量を有効活用する仕組みになっています。組み込み機器に特化したOpenWrtならではの工夫で、興味深いですね。
-
旧名Raspbian。Raspberry Pi用のLinuxディストリビューション。Debianベース。 ↩