NOV
11

fsprotectによるテスト実行環境初期化

Published:2012-11-11 02:45:57 UTC

システム全体に対して変更を加えるようなプログラム、例えばChefのRecipeみたいなもののリグレッションテスト、副作用の範囲が大きいだけに、テスト実施毎に環境を巻き戻すのが大変です。一番手っ取り早い解としては、テスト環境全体をVM化し、テスト前のスナップショットに仮想ディスクをロールバックする、というのがあり、この前のSoftwareDesignのChef特集でもVagrantを使用して実現した例が載っていました。ただ、ChefのRecipeのようなプログラムはハードウェア構成の差分の影響を受けやすく、VMなど本番とハードウェア構成の異なるテスト環境では信頼性の高いテストの実施が難しい場合もあります。

要はテスト実施毎に変更を捨てられれば良いので、ファイルシステムレベルで巻き戻すことを考えます。Windows Embeddedで言うところのEWF(Enhanced Write Filter)の機能をLinuxで実現できればよいのですが、Linuxだとaufsで実現できました。

aufsとは、複数のファイルシステムを重ね合わせて、仮想的なファイルシステムを提供するファイルシステムです。普段使っているディスクをroで使い、tmpfsでメモリ上に変更を貯めておけば、プログラム側に対してrw可能に見せておきながら再起動すると変更を全て捨てるテスト環境を作ることが出来ます。いわゆるLive CD的な挙動ですね。これを実現するシェルスクリプトが、Debian系ディストリではその名もずばりfsprotectというパッケージで提供されており、簡単に導入することが可能です。

Ubuntu 12.04での導入方法は以下の通り。

# aufsとfsprotect、apparmor-utilsの導入
sudo apt-get install aufs-tools fsprotect apparmor-utils
# DHCP Clientがapparmorに引っかかってうまく動かないので調整
sudo aa-complain dhclient3


DHCP ClientがAppArmorに引っかかってしまうので、調整が必要です。

また、fsprotectはカーネルオプションにfsprotectという文字列を渡したかどうかによって、fsptotectの有効・無効を切り替えることが出来るので、GRUBの設定変更が必要です。

vim /etc/dafault/grub

#(変更行抜粋)
#GRUB_HIDDEN_TIMEOUT=0 #コメントアウト
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash fsprotect" #ブートオプションにfsprotect追加

GRUBへの変更の反映

update-grub

テスト中に加わった変更を迅速に巻き戻せる環境の構築という点では、fsprotectを基本有効にしておき、リブートするたびにクリーンな環境を利用できるようにし、メンテナンスのためにテスト環境に変更を加えたい場合はGRUB画面からエントリ編集を行い、一時的にfsprotectを外して起動させる、という運用がお勧めです。

なお、注意点として、fsprotectはデフォルトでは"/"パーティションにのみ保護を提供し、他のマウントされているパーティションについては何もしません。他のパーティションについても保護したい場合は、/etc/default/fsprotectを編集し、以下のように保護対象に加えてやる必要があります。

PROTECT="<directory path>=<tmpfsで確保するメモリ量>"