システムストレージのリードオンリー化

このガイドでは、ICE Core実行サーバのシステムストレージをリードオンリー化する方法について説明します。

リードオンリー化の目的

ICE Coreを実行するエッジサーバでは、小型化や省電力の目的で、内部ストレージとしてSSDやeMMCなどが多く利用されます。 SSDやeMMCはHDDと違い、突然の電源断に弱く、特に書き込み中に突然電源が失われると高確率でデータ破損が発生します。 エッジサーバはデータセンターではない電源が不安定な環境で利用されることが多いことと、 障害発生時に電源リセットで復旧を試みる場合があることを考えると、 突然の電源断の対策について考慮をする必要があります。

そこで、運用中はOSおよびICE Coreのシステムファイルが記録されているストレージ(以下、システムストレージと呼びます)をリードオンリーでマウントする構成を行います。 運用中の書き込みを行わないことで、突然の電源断が発生した場合でも、データやドライブの破損が発生する確率を下げることができます。

また、ログファイルやPIDファイルなど、一部ディレクトリのファイルは運用中に読み書き可能である必要があります。 そのためtmpfsを読み書き可能な一時ファイル用ディレクトリにマウントする方法についても説明します。

リードオンリー化の方法

リードオンリー化を行うには以下3つの手順を順番に行います。作業前に、/etc/fstabファイルをバックアップしておくことをお勧めします。「リードオンリー化の流れ」を参照して理解したうえで行ってください。

マウントオプションの変更

/etc/fstabファイルから、"/"ディレクトリにマウントしているファイルシステムの行を探し、マウントオプションに"ro"を追加します。

例えば以下のような/etc/fstabがあるとします。

proc /proc proc defaults 0 0
UUID=4c52c4d8-9def-4247-9467-f9e334bb9ede /               ext4    errors=remount-ro 0       1

マウントするディレクトリは2列目に記述されています。この例では、"UUID=4c52c4d8-9def-4247-9467-f9e334bb9ede"が対象のファイルシステムになります(UUIDの値は環境で変わります)。4列目にマウントオプション"ro"をカンマ区切りで追加し、以下のようになります。

proc /proc proc defaults 0 0
UUID=4c52c4d8-9def-4247-9467-f9e334bb9ede /               ext4    ro,errors=remount-ro 0       1

tmpfsのマウント

同様に/etc/fstabファイルにtmpfsをマウントする読み書き可能ディレクトリの行を追加します。

ICE Coreに最低限必要な読み書き可能ディレクトリは以下2つです。 - /var/log - /tmp

以下のように/etc/fstabファイルにtmpfsをマウントする行を追記して下さい(上から順番にマウントするため、/ディレクトリの行よりも下に書く必要があります。)

proc /proc proc defaults 0 0
UUID=4c52c4d8-9def-4247-9467-f9e334bb9ede /               ext4    ro,errors=remount-ro 0       1
tmpfs /var/log tmpfs size=128M 0 0
tmpfs /tmp tmpfs size=16M 0 0

4列目にマウントオプションとしてサイズを指定します。/var/logはICE Coreのものを含めたログファイルが書かれるためなるべく大きめにする必要があります。/tmpはICE Core単体ではそれほど容量を必要としませんが、ICE Core以外のソフトウェアが使用する場合もあります。 また、tmpfsはサーバのメインメモリから確保されますので、あまり大きい値を指定するとアプリケーションが 使用するメモリが不足することにも注意してください。 上記例では/var/logに128MB、/tmpに16MBを指定しています。

/etc/fstab変更の有効化

/etc/fstabの変更はOSを再起動することで有効化されます。

一時的なリードオンリー解除

リードオンリー環境で何らかの原因で一時的にシステムストレージに永続的な変更をしたい場合、以下のコマンドで一時的に読み書き可能にしてマウントしなおします。

mount -o rw,remount /

/etc/fstabファイルを変更していなければ、再度OSを再起動することでリードオンリー環境に戻すことができます。

永続的なリードオンリー解除

永続的に元の読み書き可能な環境に戻したい場合、一時的なリードオンリー解除で読み書き可能でシステムストレージをマウントし直し、/etc/fstabに対して行った変更を元に戻し、OSを再起動してください。

リードオンリー化の流れ

ICE Coreの構築やICE Core上で動作するアプリケーションのデプロイなどの永続的なファイル更新を行う必要があるため、 ICE Coreインストール直後から完全にリードオンリー化することはできません。 システム開発の各フェーズで段階を経て徐々にリードオンリー化していくことになります。

構築フェーズ

ICE Coreのインストール後、通常通り初期設定作業等を行いますが、以下3点を考慮する必要があります。

modifiable_home_dir

ICE Coreのcore_config.json設定ファイルに、ICE Coreが一時ファイルを作成するのに使うディレクトリの設定項目modifiable_home_dirがあります。 リードオンリー化する場合、modifiable_home_dirにtmpfsをマウントするディレクトリに設定する必要があります。 通常は"/tmp"を指定してください。

ログ設定

ICE Coreのログファイルはtmpfsに書くようになります。 物理ストレージよりも容量が小さいため、ディスクフルを防ぐために、 ログのガイドを参照してサイズ制限とローテーション設定を確実に行ってください。

ICE Core以外のソフトウェアやsyslogなどOSログについてもサイズ制限とローテーション設定を行ってください。

また、tmpfsに書いたログファイルはサーバ再起動で削除されることに注意してください。 障害解析などの理由でログファイルが必要なら、何らかの方法で転送する必要があります。

スワップの無効化

もしスワップが有効になっているなら、無効化を行ってください。 スワップはメインメモリが不足した際に一部データをスワップファイルに書き出す機能ですが、 読み書き可能なファイルシステムはtmpfsで確保したメインメモリ上なので無意味になるからです。

開発フェーズ

リードオンリーでも動作するように考慮してアプリケーションを作成する必要があります。

アプリケーション設計・開発指針

システムストレージはリードオンリー化されます。 もしアプリケーション内でファイル更新を行うなら、tmpfsをマウントするディレクトリ(/tmpなど)のファイルにする必要があります。 コンテキストにlocalfilesystemを使用する際も同様です。

また、tmpfsにをマウントしたディレクトリに書いたファイルはサーバ再起動で削除されます、 もしサーバ再起動を越えて永続的にデータをファイルに保存する必要があるなら、 システムストレージではない別のストレージをどこかのディレクトリにマウントし、そこに保存するなどが必要です。

評価フェーズ

通常はこのタイミングでリードオンリー化を行います。「リードオンリー化の方法」を参照してください。

評価中に問題が発生した場合、必要なら「一時的なリードオンリー解除」や「永続的なリードオンリー解除」 を参照してリードオンリーを解除してください。

ICE Core以外のソフトウェアもリードオンリー化の対処が必要な場合があります。 ICE Coreのログだけではなくsyslogやソフトウェア固有のログなども見てエラーメッセージが出力されていないかチェックしてください。

ログファイルはOS再起動で消えてしまいます。必要に応じて別のサーバに転送するなどをしてください。

運用フェーズ

このフェーズではICE Core実行サーバはリードオンリー状態です。 障害対処など何らかの理由でリードオンリー化の解除が必要な場合、「一時的なリードオンリー解除」や「永続的なリードオンリー解除」 を参照してリードオンリーを解除してください。

注意事項

  • ICE Core実行サーバで稼働する別のソフトウェアでリードオンリー化のための特別な手順が必要な場合があります。
  • リードオンリー化により、突然の電源断でディスクが破損する確率は下がりますが、まったく起きなくなるわけではありません。要件に応じて電源側の対策(電源安定化装置の設置など)も行ってください。