Armadilloフォーラム

overlayfs有効時のRAM不足時の挙動について

saigusa

2020年10月27日 19時07分

三枝です。
お世話になります。

現在下記のようなパーティション構成で開発しております。

/dev/mmcblk2p1:Linuxカーネルイメージ、Device Tree Blob
/dev/mmcblk2p2:ルートファイルシステム
/dev/mmcblk2p3:予約領域
/dev/mmcblk2p4:拡張
/dev/mmcblk2p5:自社製プロセス格納
/dev/mmcblk2p6:データベース
/dev/mmcblk2p7:予備

/dev/mmcblk2p5、/dev/mmcblk2p6は電源断を検知後にマウント解除する仕組みとしております。

ここで質問なのですが、overlayfsを有効にしており、起動後のルートファイルシステムに対する差分は、
全てRAMディスク(/overlay/ramdisk)に格納されることになりますが、
RAMが不足した場合の挙動はどのようになりますでしょうか。

ご回答のほど、よろしくお願い致します。

コメント

溝渕です。

> ここで質問なのですが、overlayfsを有効にしており、起動後のルートファイルシステムに対する差分は、
> 全てRAMディスク(/overlay/ramdisk)に格納されることになりますが、
> RAMが不足した場合の挙動はどのようになりますでしょうか。

OOM Killerが動作し、メモリリソースを多く使用しているプロセスを強制的に
停止させ、メモリを確保します。

対策等については、次のスレッドを参照してみてください。

https://armadillo.atmark-techno.com/forum/armadillo/3864

三枝です。

溝渕様、ご回答ありがとうございます。

追加で質問させてください。

1. overlayfs 50%の場合、RAM 1GBのうち、ルートファイルシステムで使用できるのが500MB、その他で使用できるのが500MBである。認識合っていますでしょうか。
2. ルートファイルシステム内でRAMが枯渇した場合、ルートファイルシステムに格納されている何らかのプロセスが停止される。認識合っていますでしょうか。
3. 上記2の時に、ルートファイルシステム以外のパーティションに格納している自社製プロセスがメモリ要因で停止されることはないでしょうか。
4. /overlay/ramdisk/upperにて、動作時に変更されるファイルを確認していますが、それらの出力サイズを抑制する方法を御教授いただきたいです。

溝渕です。

> 1. overlayfs 50%の場合、RAM 1GBのうち、ルートファイルシステムで使用できるのが500MB、その他で使用できるのが500MBである。認識合っていますでしょうか。

概ね合っています。それぞれ512MBになります。

> 2. ルートファイルシステム内でRAMが枯渇した場合、ルートファイルシステムに格納されている何らかのプロセスが停止される。認識合っていますでしょうか。

起動しているプロセスのいずれかが停止されます。起動しているプロセスは次のように確認できます。

[armadillo]# ps aux

これらのうち、kernel thread(プロセス名が括弧"[]"で囲まれたもの)はOOM
Killerの対象外であったと記憶しています。

> 3. 上記2の時に、ルートファイルシステム以外のパーティションに格納している自社製プロセスがメモリ要因で停止されることはないでしょうか。

上記、「自社製プロセス」がOOM Killerによって停止されることは無いかとい
うご質問でしょうか?

そうであれば、停止されることはあります。

> 4. /overlay/ramdisk/upperにて、動作時に変更されるファイルを確認していますが、それらの出力サイズを抑制する方法を御教授いただきたいです。

upperのサイズを抑制するということは、次のいずれかまたは両方を意味します。

- ルートファイルシステムを書き込み禁止にする
- ルートファイルシステムに行なわれた過去の修正を消す

もし、メモリが枯渇する状況になった場合は、メモリを大量に使う要因を特定
して、都度対処するのが現実的かと思います。

三枝です。

溝渕様
ご回答ありがとうございます。
すみませんが、もう一つ質問させてください。

初歩的な内容で申し訳ございませんが、
overlayfsを有効にすることで、
ルートファイルシステム(/dev/mmcblk2p2)は、
リードオンリーでマウントされるという認識で合っていますでしょうか。
(rc.localで、リードオンリーでマウントする処理を追記する必要は無いという認識で合っていますでしょうか。)

溝渕です。

> overlayfsを有効にすることで、
> ルートファイルシステム(/dev/mmcblk2p2)は、
> リードオンリーでマウントされるという認識で合っていますでしょうか。
> (rc.localで、リードオンリーでマウントする処理を追記する必要は無いという認識で合っていますでしょうか。)

上記ご認識で合っています。

https://manual.atmark-techno.com/armadillo-x1/armadillo-x1_product_manu…

製品マニュアル内の、「書き込み保護」とは「リードオンリーにすること」を示しています。

溝渕様

三枝さんと同じチームの横山と申します。
質問させてください。

・電源断に備えファイルシステムを保護したい
・rsyslogに吐かれるログは使用しない

上記方針であるなら、overlayfsは無効としてrc.localでルートファイルシステムをリードオンリーにしてしまうのも良いのでしょうか?

前述しました通りパーティションは下記の通りとしております。

/dev/mmcblk2p1:Linuxカーネルイメージ、Device Tree Blob
/dev/mmcblk2p2:ルートファイルシステム
/dev/mmcblk2p3:予約領域
/dev/mmcblk2p4:拡張
/dev/mmcblk2p5:自社製プロセス格納
/dev/mmcblk2p6:データベース
/dev/mmcblk2p7:予備
※p5/p6はRWでマウントするが電源断を検知後にマウント解除する仕組みとしております。

溝渕です。

> ・電源断に備えファイルシステムを保護したい
> ・rsyslogに吐かれるログは使用しない
>
> 上記方針であるなら、overlayfsは無効としてrc.localでルートファイルシステムをリードオンリーにしてしまうのも良いのでしょうか?

overlayfs有効と比較すると、ファイルシステム破損の可能性は高くなります。

rc.localでルートファイルシステムをリードオンリーにしたとしても、それ以
前にルートファイルシステムはmountされており、ログ等の書き込みが発生し
ています。この書き込み中に電源断が発生すると、ファイルシステム破損の可
能性が出てきます。

もちろん、リードオンリーにする前には電源断が発生しないシステム構成であ
れば、上記の限りではありません。

そうでなければ、保護対象のストレージは常時リードオンリーにするのが無難
かと思います。

> ※p5/p6はRWでマウントするが電源断を検知後にマウント解除する仕組みとしております。

UPS等が接続されており、電源断後もしばらく動作できる状態なのでしょうか。

もしhaltやpoweroffをするのに十分な時間があるのだとすると、必ずしもルー
トファイルシステムがリードオンリーである必要は無いかと思います。

haltやpoweroffが完了した(正確にはルートファイルシステムをumountした後
の)状態では、ファイルシステムへの書き込み中に電源が切断される可能性が
無い為です。

溝渕様

rc.localでリードオンリーにするのは遅い、確かにおっしゃる通りです。
(overlayfsは無効で)ルートファイルシステム(mmcblk2p2)を常時リードオンリーとするにはどこで設定すればよいでしょうか。

p5/p6についてはアプリケーションログおよびデータベース領域の為、RWでマウントしています。
そのためにパーティションを分けました。

> UPS等が接続されており、電源断後もしばらく動作できる状態なのでしょうか。
HWにて対策しております。
ただHalt完了するまでの時間は確保できていないので、電源断検知してもHaltせずにp5/p6をアンマウントするのみとしています。

溝渕です。

> (overlayfsは無効で)ルートファイルシステム(mmcblk2p2)を常時リードオンリーとするにはどこで設定すればよいでしょうか。

Linuxカーネル起動時パラメーターで設定可能と思います。

詳しくは次のmanページをご参照ください。

[atde]$ man 7 bootparam

三枝です。

Armadillo-X1を保守モードで起動し、
下記3つのコマンドを実行し、リードオンリーでマウントできるかと思いましたが、
mmcblk2p2をリードでマウントすることができませんでした。

実行したコマンド
「setenv mmcroot /dev/mmcblk2p2 rootwait ro」
「saveenv」
「boot」

マウント結果
root@armadillo:~# mount -t ext4
/dev/mmcblk2p2 on / type ext4 (rw,relatime,data=ordered)

上記のLinuxカーネル起動時パラメーターの設定は、誤っていますでしょうか。
設定方法をご教授いただけますでしょうか。
よろしくお願い致します。

溝渕です。

> 上記のLinuxカーネル起動時パラメーターの設定は、誤っていますでしょうか。

間違っていなさそうですが...。

次のコマンドを実行した結果を教えていただけますか。

[armadillo]# /proc/cmdline

三枝です。

ご連絡ありがとうございます。
実行結果は下記の通りです。
root@armadillo:/proc# /proc/cmdline
-bash: /proc/cmdline: Permission denied

ちなみにですが、
catコマンドでcmdlineファイルを開いてみた結果を下記に示します。
root@armadillo:/proc# cat cmdline
console=ttymxc4,115200 root=/dev/mmcblk2p2 rootwait ro

ご確認をお願い致します。

溝渕です。

すみません。コマンドを間違えました。

確認していただきたかったのは、ご推察の通りcmdline内容です。

> catコマンドでcmdlineファイルを開いてみた結果を下記に示します。
> root@armadillo:/proc# cat cmdline
> console=ttymxc4,115200 root=/dev/mmcblk2p2 rootwait ro

起動パラメータには適切に"ro"が入っていますね。

私の手元のArmadillo-X1で確認したところ、次のようになりました。

=> setenv mmcroot /dev/mmcblk2p2 rootwait ro
=> boot
:(snip)
root@armadillo:~# mount
:(snip)
/dev/mmcblk2p2 on / type ext4 (ro,relatime,data=ordered)

お手元のArmadillo-X1のソフトウェアはカスタマイズされていますか?

三枝です。

溝渕様
ご連絡ありがとうございます。
Armadillo-X1のデバイスツリーは、自社製の拡張基板をしようするために変更しています。

下記のフォーラムの入江様のご回答を参考に、
ルートディレクトリを書き込みモードで開いているプロセスを停止して、
再度試してみたいと思います。
https://armadillo.atmark-techno.com/forum/armadillo/7948

追加で質問させてください。
/dev/mmcblk2p5:自社製プロセス格納
を/optにマウントして使用しています。
(/opt/製品ソフトウェアとなっています。)
その場合、haltコマンドでシャットダウンした時に下記のエラーが発生します。
「[FAILED] Failed unmounting /opt/license.」
そこで2点質問させてください。
1点目
・「[FAILED] Failed unmounting /opt/license.」のエラーが出ている状態で、何か問題はありますでしょうか。
 (例えば、何かの処理待ちをして、シャットダウンやリブートが出来なくなるようなことはありますでしょうか。)
2点目
・上記のエラーを発生させないようにするために、/opt/licenseを別のフォルダ(例えば、/opt1/license)にコピーし、
 そこを参照するように/etc/fstabを変更しても良いものなのでしょうか。
 (その他、何らかの対策がありましたら、ご教授いただけませんでしょうか。)

溝渕です。

> 1点目
> ・「[FAILED] Failed unmounting /opt/license.」のエラーが出ている状態で、何か問題はありますでしょうか。
>  (例えば、何かの処理待ちをして、シャットダウンやリブートが出来なくなるようなことはありますでしょうか。)

無いと思いますが、無駄な処理である為、fstabの該当行を次のようにコメン
トアウトしてみてください。

root@armadillo:~# vi /etc/fstab
# UNCONFIGURED FSTAB FOR BASE SYSTEM
proc /proc proc defaults 0 0
# /dev/license /opt/license squashfs defaults,nofail 0 0

> 2点目
> ・上記のエラーを発生させないようにするために、/opt/licenseを別のフォルダ(例えば、/opt1/license)にコピーし、
>  そこを参照するように/etc/fstabを変更しても良いものなのでしょうか。
>  (その他、何らかの対策がありましたら、ご教授いただけませんでしょうか。)

良いですが、エラーメッセージが変わるだけでエラーは消えないと思います。

三枝です。

ご回答ありがとうございます。
下記のフォーラムの入江様のご回答を参考に、
リードオンリーでマウントしたところ、起動時に下記のエラーが発生します。
https://armadillo.atmark-techno.com/forum/armadillo/7948

対策をお教えいただけますでしょうか。

[FAILED] Failed to start Create Volatile Files and Directories.
See 'systemctl status systemd-tmpfiles-setup.service' for details.
Starting Update UTMP about System Boot/Shutdown...
[FAILED] Failed to start Network Time Synchronization.
See 'systemctl status systemd-timesyncd.service' for details.
[ OK ] Reached target System Time Synchronized.
[ OK ] Stopped Network Time Synchronization.
[FAILED] Failed to start Network Time Synchronization.
See 'systemctl status systemd-timesyncd.service' for details.
[ OK ] Stopped Network Time Synchronization.
[FAILED] Failed to start Network Time Synchronization.
See 'systemctl status systemd-timesyncd.service' for details.
[FAILED] Failed to start Update UTMP about System Boot/Shutdown.
See 'systemctl status systemd-update-utmp.service' for details.
[DEPEND] Dependency failed for Update UTMP about System Runlevel Changes.
[ OK ] Stopped Network Time Synchronization.
[FAILED] Failed to start Network Time Synchronization.
See 'systemctl status systemd-timesyncd.service' for details.
[ OK ] Started udev Coldplug all Devices.
[ OK ] Stopped Network Time Synchronization.
[FAILED] Failed to start Network Time Synchronization.
See 'systemctl status systemd-timesyncd.service' for details.
[ OK ] Reached target System Initialization.
[ OK ] Started Daily apt download activities.
[ OK ] Listening on D-Bus System Message Bus Socket.
[ OK ] Listening on Avahi mDNS/DNS-SD Stack Activation Socket.
[ OK ] Reached target Sockets.
[ OK ] Reached target Basic System.
Starting Restore /etc/resolv.conf i…fore the ppp link was shut down...
Starting LSB: Start/stop sysstat's sadc...
Starting thermal_trip_point-set.service...
Starting rng-tools.service...
Starting Login Service...
[ OK ] Started Daily Cleanup of Temporary Directories.
Starting Avahi mDNS/DNS-SD Stack...
Starting LSB: Load kernel modules needed to enable cpufreq scaling...
[ OK ] Started D-Bus System Message Bus.
random: crng init done
random: 3 urandom warning(s) missed due to ratelimiting
[ OK ] Started Avahi mDNS/DNS-SD Stack.
Starting Network Manager...
[ OK ] Started Regular background program processing daemon.
[ OK ] Started Daily apt upgrade and clean activities.
[ OK ] Reached target Timers.
[ OK ] Started Restore /etc/resolv.conf if…before the ppp link was shut down.
[ OK ] Started thermal_trip_point-set.service.
[ OK ] Started rng-tools.service.
[ OK ] Started LSB: Start/stop sysstat's sadc.
[ OK ] Stopped Network Time Synchronization.
[FAILED] Failed to start Network Time Synchronization.
See 'systemctl status systemd-timesyncd.service' for details.
[ OK ] Started Login Service.
[ OK ] Started LSB: Load kernel modules needed to enable cpufreq scaling.
Starting LSB: set CPUFreq kernel parameters...
[ OK ] Found device /dev/ttymxc4.
[ OK ] Started LSB: set CPUFreq kernel parameters.
[ OK ] Started Network Manager.
[ OK ] Reached target Network.
Starting Connection Recover...
Starting Permit User Sessions...
Starting OpenBSD Secure Shell server...
Starting Network Manager Wait Online...
[ OK ] Started Permit User Sessions.
[ OK ] Found device /dev/license.
[ OK ] Started Connection Recover.
[ OK ] Started OpenBSD Secure Shell server.
[ OK ] Listening on Load/Save RF Kill Switch Status /dev/rfkill Watch.
Mounting /opt/license...
Starting Network Manager Script Dispatcher Service...
[ OK ] Mounted /opt/license.
[ OK ] Started Network Manager Script Dispatcher Service.
[ OK ] Reached target Bluetooth.
Starting Load/Save RF Kill Switch Status...
[ OK ] Started Load/Save RF Kill Switch Status.
[FAILED] Failed to start Hostname Service.
See 'systemctl status systemd-hostnamed.service' for details.
[FAILED] Failed to start Network Manager Wait Online.
See 'systemctl status NetworkManager-wait-online.service' for details.
[ OK ] Reached target Network is Online.
Starting /etc/rc.local Compatibility...
Starting LSB: Advanced IEEE 802.11 management daemon...
EXT4-fs (mmcblk2p5): mounted filesystem with ordered data mode. Opts: (null)
Starting LSB: exim Mail Transport Agent...
EXT4-fs (mmcblk2p6): mounted filesystem with ordered data mode. Opts: (null)
[ OK ] Started /etc/rc.local Compatibility.
[ OK ] Started LSB: Advanced IEEE 802.11 management daemon.
Starting input event poweroff daemon...
[ OK ] Started storemaster launch daemon.
[ OK ] Started reset usb3503.
[ OK ] Started Getty on tty1.
[ OK ] Started Serial Getty on ttymxc4.
[ OK ] Reached target Login Prompts.
Starting change status LED...
[FAILED] Failed to start LSB: exim Mail Transport Agent.
See 'systemctl status exim4.service' for details.
[ OK ] Started input event poweroff daemon.
[ OK ] Started change status LED.
[ OK ] Reached target Multi-User System.
[ OK ] Reached target Graphical Interface.

溝渕です。

エラーの詳細は次のように確認可能です。例えば、次のエラーメッセージより、

[FAILED] Failed to start Create Volatile Files and Directories.
See 'systemctl status systemd-tmpfiles-setup.service' for details.

systemctrlコマンドを実行すると、次のようにstatusが確認できます。

root@armadillo:~# systemctl status systemd-tmpfiles-setup.service
:(snip)
Nov 05 00:19:23 armadillo systemd-tmpfiles[283]: rm_rf(/tmp): Read-only file system

上記の通り、file systemがread-onlyになっているのがエラーの原因です。

単純にエラーメッセージの出力を抑制したい場合は、該当のサービスを停止します。

根本的に解決する場合は書き込み可能にするか、書き込みが必要なディレクト
リに事前にtmpfsやramfsをmountしておくのが良いと思います。