「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。
ソフテックだより(発行日順)のページへ
ソフテックだより 技術レポート(技術分野別)のページへ
ソフテックだより 現場の声(シーン別)のページへ
私はソフテックへ入社して2年の社員で、主にWindowsアプリケーションの開発に携わっています。ある案件でWindows Embedded Standard 7で動作するアプリケーションを開発する機会がありました。
今回のソフテックだよりでは、Windows Embeddedの機能の1つであるEnhanced Write Filterについてご紹介させていただきます。
Windows Embeddedは組み込み機器を対象にしたOSで、私が携わった案件ではPLCとPCの通信を中継するアプリケーションを起動する環境として使用しました。突然の停電やオペレーションミスによるHDDやSSDなどのストレージへのファイル書き込み中の電源断によって、ファイルが破損したり、OSが起動しなくなると困るため、突発的な電源断への対策が必要になります。この問題への対策として、Windows EmbeddedにはEnhanced Write Filter(EWF)という機能が提供されています。
EWFは、保護するように指定したドライブに対して書き込みが発生した場合に、RAMや別のドライブに書き込み先を変更するリダイレクトをすることにより、指定したドライブへの物理的な書き込みを抑止する機能です。物理的な書き込みが発生しないため、強制的な電源断にも対応することができます。保護ドライブに対して、物理的に書き込む必要がある場合は、コミット処理というメモリや別ドライブに書き込んだデータを反映する処理を実行する必要があります。
また、その他にも以下の様なメリットがあります。
図1. EWFの構造
EWFはEWFオーバーレイとEWFボリュームの2つの要素で構成されています。
EWFオーバーレイとは、EWFで指定したドライブに書き込みが発生した場合に、書き込み情報がリダイレクトされる領域です。EWFオーバーレイには、EWFで指定されていないドライブやRAMなどが使用されます。
EWFボリュームとは、EWFで保護されているボリュームの数、サイズ、EWFオーバーレイ情報などのEWFに関する構成情報を保存する領域です。EWFボリュームは1つのみ作成されます。EWFによって保護するボリュームが複数ある場合でもEWFボリュームは1つのみとなります。
EWFには、上記のEWFオーバーレイとEWFボリュームの2つの要素の配置について、3つの異なるモードが有ります。
Diskモードでは、保護ドライブとは別のドライブをEWFオーバーレイとし、このドライブの初めにEWFボリュームが保存されます。保護ドライブに対する書き込みは、別のドライブに対して書き込まれるため、再起動後も書き込み情報は保持されています。ストレージに余裕があり、書き込み情報を保存したい場合に使用されます。
図2. Diskモードの構成
RAMモードでは、RAMをEWFオーバーレイとし、保護ドライブと同じディスク上に別ドライブとしてEWFボリュームを保存します。保護ドライブに対する書き込みは、RAMに書き込まれるため、再起動時に書き込み情報は破棄されてしまいます。ストレージの容量が制限されている場合や読み書きの回数に制限がある場合、書き込み情報を保存したくない場合などに使用されます。
図3. RAMモードの構成
RAM Regモードでは、RAMをEWFボリュームとし、システムのレジストリにEWFボリュームを保存します。保護ドライブに対する書き込みは、RAMに書き込まれるため、再起動時に書き込み情報は破棄されてしまいます。機能的にはRAMモードとほぼ同じですが、対象ストレージがパーティション分割できないCompactFlashなどの場合にも使用することができます。
図4. RAM Regモードの構成
私が携わった案件では、使用するPCのストレージがSSDで容量も少なかったため、EWFはRAMモードで使用していました。このため、保護ドライブに対する書き込みはRAMにリダイレクトされており、長期稼動時にWindowsのイベントログの書き込みなどにより、メモリの使用量が増加してしまいました。
上記問題に対して、PCのメモリ使用量削減のため、Microsoft Developer Network(MSDN)(※1)で紹介されていた情報などを元に、下記の対策を行いました。
Windowsのイベントログやシステムのページファイル、一時ファイルなどの出力先が保護ドライブになっている場合は、出力先を保護ドライブ以外に設定すること、もしくは出力しないようにすることで、RAMへリダイレクトを抑止し、メモリの使用量を削減することができました。
ディスクの最適化サービスが有効になっている場合、ディスク上のデータが再編成され、連続したデータのセクションが作成されます。これによってデバイスの起動時間は短縮されますが、不要な情報がEWFオーバーレイに追加されてしまいます。RAMへのリダイレクトを抑止するため、ディスク最適化を無効化することにしました。
ファイルシステムにNTFSを使用している場合は、4GB以上のファイルを扱うことができる、ファイルの暗号化や圧縮ができるなどのメリットが有ります。ただし、NTFSではファイルにアクセスするたびに、アクセス日時を更新する機能が有効になっている場合があり、更新のたびにRAMにリダイレクトされてしまうため、前回アクセス時のタイムスタンプを無効化することにしました。
プリフェッチが有効になっている場合、利用したプログラムなどのデータを蓄積し、事前にメモリにデータを読み込んでおくことで、アプリケーションの起動などを高速化することができます。ただし、起動ドライブを保護ドライブとしている場合、再起動した際に、プリフェッチで蓄積したデータを保持しておくことができませんし、RAMにリダイレクトされてしまうため、メモリの使用量も増えてしまいます。このため、プリフェッチを無効化しました。
システムの復元が有効になっている場合、復元ポイントがRAMにリダイレクトされてしまうため、システムの復元の機能を無効化しました。
今回はEWFの機能の概要と使用する上での注意点について紹介させていただきました。
Windows Embeddedは「組込み機器を扱う特定の業種のみで使用するOS」のようなイメージが有るかもしれませんが、情報漏えい対策を目的に、シンクライアント端末として利用するケースが増えてきています。シンクライアント端末とは、実際の処理はサーバーに実行させ、自身は最低限の機能のみ持っているクライアント端末のことで、セキュリティ上の理由からローカルのストレージにデータを残さないようにすることが要求されます。通常のWindows OSでこの条件を満たすことは難しいですが、Windows EmbeddedのEWF機能ならば容易にこの条件を満たすことができます。
今回紹介した内容がWindows Embeddedを使用する際の参考になれば幸いです。
(Y.O.)
関連ページへのリンク
関連するソフテックだより