PDHのSDカードアクセスを減らす方法

1. 目的

R-MSM 評価キットをご評価いただいた古川企画様から「R-MSM システムを工場等で使用する場合には、ノイズなどで電源は瞬断されることが多くあり、基本的に電源ぶつ切りできる仕様でなければ持続的に使うことができません」とのご指摘をいただきました。さらにPDH(Raspberry Pi)では、SDカードへの書込みが行われている際に、電源が切れると再起動後にOSが立ち上がらなくなる可能性があり、仮想メモリをなくす方法やOverlay File Systemを禁止する実験も行っていただきました。
ここでは、古川企画様のご意見をもとに、仮想メモリやOverlay File Systemを行った場合に、R-MSM システムとしてどのような課題があるかを検討します。

2. 実験環境

下記、2台をBluetoothで接続して動作させます。
 ・ PDH(Raspberry Pi 4 メモリ:8GByte) : gw52f5(Node-RED フロー V1.3.3)
 ・ R-MSM P4:R-MSM_17E6( ファーム v1.3.2)

3.メモリの消費量

実メモリが不足すると仮想メモリを使用するようになるため、現行のR-MSMシステムでの実メモリの使用量と仮想メモリ(swapメモリ)の使用量を確認します。メモリの使用量は、以下のコマンドで確認できます。

free –h

上段が実メモリで、下段が仮想メモリ(Swap)になります。1列目が総メモリ容量です。実メモリ容量が7.7GByteで、Swap容量が99MByteです。
2列が使用しているメモリ量です。実メモリが904MByte、Swap容量が0Byteです。
Node-REDを起動してダッシュボードを増やした際のメモリ使用量を参考に示します。

※ 参考
free –h の “-h”は、人が読めるフォーマットで表示というオプションです。
“-h”を付けるとByte単位に変換してくれます。1k=2^10=1024での換算になります。
次に、-hがある場合と無い場合の結果を示します。

4. 仮想メモリの削除

現状の仕様レベルであれば、仮想メモリを削除(0Byteに設定)しても問題はないと考えられますので、仮想メモリを0Byteに設定変更します。
Raspberry PiのOSであるRaspbianでは、Swapメモリの管理を“dphys-swapfile”というプログラムで行っています。仮想メモリの0Byteにするために、このプログラムを止めます。

1)“free -h”で現状のswapを確認します。
2)“sudo swapoff –all”を実行してswapを止めます。
3)“sudo systemctl stop dphys-swapfile” でdphys-wapfileの動作を止めます。
4) “sudo systemctl disable dphys-swapfile”で再起動時にも動作しないように設定します。
5)“free -h”でswapが0Byteになっているか確認します。
6)“systemctl is-enabled dphys-swapfile”で再起動時にdisenableか確認します。
7)“systemctl status dphys-swapfile”で止まっているかを確認します。

参考HP :Raspberry Pi swap の無効化

仮想メモリを有効化するには、反対の処理を行います。

1)“free -h”で現状のswapを確認します。
2)“sudo systemctl start dphys-swapfile” でdphys-wapfileの動作を開始します。
3) “sudo systemctl enable dphys-swapfile”で再起動時に動作するようにします。
4)“free -h”でswapが99MByteになっているか確認します。
5)“systemctl is-enabled dphys-swapfile”で再起動時にdisenableか確認します。
6)“systemctl status dphys-swapfile”で止まっているかを確認します。

※ 参考
swap容量99MByteは、設定ファイル“dphys-swapfile”の中に書かれているCONF_SWAPSIZE=100 で決まっています。
このファイルのCONF_SWAPSIZE=0にしてリブートしてもswapサイズを0Byteにできます。
CONF_SWAPSIZE=200 にすると増やせます。

5. Overlay File System対応と/boot領域書込み禁止

1)端末画面に $ sudo raspi-config と入力して下記のconfig画面を出します。4.Prefomance Optionsを選択します。

2) P3 Overlay File System Enable/disable read-only file systemを選択します。

3) overlay file systemを許可するか聞いてきますので、「はい」(Yes)を選択します。

4) overlay file systemが許可されました。

5) Boot partitionを書込み禁止にするかを聞いてきますので、「はい」(Yes)を選択します。

6) Boot partitionが読み出し専用になりました。「了解」を押します。

7) 初期画面に戻りますので、「Finish」を押します。

8) rebootしますか?と聞いてきますので、「はい」を押してリブートします。

参考HP:
Raspberry Piの長期運用で SD Cardの消耗を防ぐ、SDをリードオンリー化にする方法

※ 参考
/bootの書込み禁止の設定の前後で、overlay領域が出来ています。このoverlay領域にデータ等の書込みが行われます。したがって、logファイルなどがこのサイズを超えないようにしないといけません。また、仮想メモリ(Swap)領域が0Byteになっています。

リブート時に”dphys-swapfileのサービスは、許可されているのですが、起動時にswap領域が作れずに、failしているためだと考えられます。
従って、overlayにして、/boot領域を書込み禁止にすることで、swap領域もなくせるようです。

6. Overlay File Systemの課題と注意事項

Overlay File Systemは、上位層のファイルシステムと下位層のファイルシステムを1つのファイルシステムに重ね合わせたファイルシステムを構成します。両方のファイルシステムにファイルが存在する場合には、上層のファイルシステムのファイルが見え、下層のファイルは隠されます。ディレクトリの場合はマージされます。

Raspberry PiのOverlay File Systemは、上位層のファイルシステムには、RAM領域が使用されます。そして、下位層にSDメモリが使用されます。

上位層は、RAM上に構成されるので、電源を切ると消えます。ですので、設定を変更したり、Logやデータを保存したファイルは、リブートすると消えて無くなっています。
これが、Overlay File Systemの課題であり、注意事項です。Overlay File Systemに変更後に、システムの設定を変更したり、Logファイルやデータを保存した場合に、電源が切れるとそれらはすべて消えて無くなります。データやLogは、USBなどの外部記憶媒体に保存するか、クラウドなどに送付する必要があります。

次の例の上のlsコマンドでは、ディレクトリにOverlay File System前にあったcsvファイルとOverlay File System後に保存したcsvファイルが表示されます。しかし、リブート後には、Overlay File System後のファイルは消えています。

さらに、次の例では、削除して消えた下位層のファイルが、リブート後に復活しています。下位層のファイルは消えません。

また、次の例では、sftp でpngファイルを他のPCからgetしているときのコマンド画面です。他のPCからも上位層のファイルはリブート後に消えて、下位層のファイルは消しても消えていないのが同様に確認できます。

7. R-CPS キットの配布時設定

R-CPS キットの配布時の設定は以下の通りです。必要に応じて上記の記事を元に設定変更してください。

・R-CPS ソフトウェアバージョン v1.3.x

設定項目 設定状態
SWAP 99 MByte
Overlay File System 無効
Boot partition書込み禁止 無効

 

・R-CPS ソフトウェアバージョン v1.4.0 ~

設定項目 設定状態
SWAP 0 MByte ( dphys-swapfileで CONF_SWAPSIZE=0 に設定)
Overlay File System 無効 ( SDカード内にセンサデータを保存するため、有効としています )
Boot partition書込み禁止 有効 ( 書込み禁止 )