ブログ

overlayfs有効時に一部のファイルのみ更新可能にする

at_takuma.fukuda
2021年2月28日 14時52分

overlayfsについて

Armadillo-IoTシリーズやArmadillo-600シリーズ、Armadillo-X1の
各製品のルートファイルシステムは、標準で eMMC に配置されます。
Linux が稼動している間は、ログや設定ファイル、各種アプリケーション によるファイルへの書き込みが発生します。
もし、停電等で終了処理を実行できずに電源を遮断した場合は
RAM上に残ったキャッシュがeMMCに書き込まれずに、ファイルシステムの破綻やファイルの内容が古いままになる状況が発生します。

また、eMMC内部の NAND Flash Memory には消去回数に上限があるため、
書き込み 回数を制限することを検討する必要がある場合もあります。

そこで、overlayfs を利用して、eMMCへの書き込み保護を行う機能を提供しています。

overlayfs の機能によって、
起動後のルートファイルシステムに対する差分は、
全てRAMディスク( /overlay/ramdisk にマウント) に記録されるようになります。
そのため、電源を遮断した場合でもeMMCは起動前と変らない状態のまま維持されています。

反面、Armadilloが起動してからルートファイルシステム上で作成・更新が行われたファイルは、
外部ストレージに保存した場合を除いて、保存する事が出来なくなってしまいます。

overlayfs有効状態でのファイル保存について

overlayfs有効状態でファイルを保存する方法には、
下記記事のようにchrootコマンドでルートディレクトリを変更したり、
Armadillo-X1/IoT G3/G3L: overlayfsを有効化した状態でDebianパッケージをインストール、アップデートする方法
ルートファイルシステムが格納されたパーティションをマウントし直す等の方法があります。
これらの方法はいずれも、ファイルの更新を行う前後で専用の処理を行わなければなりません。

この記事では、overlayfsが有効な状態でも予め更新可能な領域を作成しておくことで、
その領域内のファイル・ディレクトリに対しての読み書きの処理を行う際に、
特別な処理を必要としない方法をご案内いたします。

具体的には、eMMC上でルートファイルシステムが格納されているのとは別のパーティションを特定のディレクトリにマウントすることで、
そのディレクトリ下のファイル・ディレクトリをoverlayfsの設定に関係なく書き込み可能とするものです。

eMMCのパーティションについて

Armadilloの各製品において、標準のパーティション構成では以下のパーティションが未使用の状態となっています。

製品名 パーティション 容量
Armadillo-IoTゲートウェイG3(型番がAGX314xとなっているもの) mmcblk2p3(node-eye使用する場合は利用不可) 122.1 MiB
mmcblk2gp2 8 MiB
mmcblk2gp3 8 MiB
Armadillo-IoTゲートウェイG3L mmcblk2p3(node-eye使用する場合は利用不可) 122.1 MiB
Armadillo-X1 mmcblk2p3(node-eye使用する場合は利用不可) 122.1 MiB
Armadillo-640/610 mmcblk0p3(node-eye使用する場合は利用不可) 122.1 MiB
mmcblk0gp2 8 MiB
mmcblk0gp3 8 MiB

これらのパーティションを特定のディレクトリにマウントすることで、
overlayfsを有効にしたまま、ファイルを更新する事が出来ます。

マウント

例えば、rootディレクトリ直下にtestというディレクトリがあるとして、 このディレクトリにmmcblk2p3をマウントする場合、
最も簡単な方法は以下のようにコマンドを実行することです。

[armadillo ~]#  mount /dev/mmcblk2p3 /root/test

しかし、このコマンドを実行する場合も結局は起動毎にコマンド実行しなければなりません。
そこで、マウントするパーティションとマウント先のディレクトリをfstabファイルに記述しておくという方法を取ります。

fstab

Arch Linux Wiki の記事によると、fstabについて以下のように説明されています。
/etc/fstab ファイルはディスクパーティションや様々なブロックデバイス、リモートファイルをどうやってファイルシステムにマウントするかを記述します。

ファイルシステムは一行毎に記述されます。
書かれている定義は、起動時やシステムマネージャの設定がリロードされたときに systemd の mount ユニットに動的に変換されます。
デフォルトの設定はマウントを必要とするサービスが起動する前にファイルシステムの fsck とマウントを自動的に実行します。

つまり、このファイルにパーティションのマウントの定義を記入しておくことで、Aramdillo起動時に自動的にマウントさせることが出来ます。
/root/testにmmcblk2p3をマウントする場合は、/etc/fstabの末尾に以下のように記述します。

/dev/mmcblk2p32 /root/test vfat defaults 0 1

fstabコマンドの各フィールドの定義については以下を参考ください。
fstab-Arch Wiki:2.フィールドの定義
この時気を付けるべきことは、マウントするパーティションのファイルシステムです。
mmcblk*gp*はsquashfsでフォーマットされているので、以下のようにvfatやext4でフォーマットしてからマウントしてください。

[armadillo ~]# mkfs.ext4 /dev/mmcblk0gp2

x1-debian-builderでの設定

x1-debian-builderでルートファイルシステムアーカイブを作成する際に、
fstabにこちらの設定を書き込むようにしておけば、
インストール直後から予めマウントさせておくことが可能となります。
x1-debian-builderの****resources/resources/fixupを編集し、
例えば先ほどの設定を書き込むには、以下のようにコマンドを記載しておくと良いです。

echo "/dev/mmcblk2p32 /root/test vfat defaults 0 1" >> /etc/fstab

元々、fixupファイル内で下記のようにfstabへ設定を追加する箇所があるので、
その前後に挿入するのが良いかと思います。
*「#fix fstab」というコメントがついています。

resources/fixup

#!/bin/sh

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
(中略)
#fix fstab
mkdir /opt/license
if [ $(grep -c proc /etc/fstab) -eq 0 ]; then
    echo "proc                    /proc           proc     defaults                0 0" >> /etc/fstab
    echo "/dev/license            /opt/license    squashfs defaults,nofail         0 0" >> /etc/fstab
fi
(後略)

大容量のファイルを扱いたい場合

標準のパーティション構成で使用可能な容量には限りがあります。
overlayfsを有効化しつつ、より大容量のファイルを更新したい場合は、
パーティション構成を切りなおす必要があります。
パーティション構成の切りなおし方については、以下の記事をご参考ください。
Armadillo-640/610:eMMCのパーティションを切りなおす方法

Armadillo-X1/IoT(G3/G3L):eMMCのパーティションを切りなおす方法