第19回:EBSボリュームとUnionFS


 今回はEucalyptusのEBSボリュームとUnionFSを組み合わせて利用する方法について紹介します。

 今回このような組み合わせのテーマを持ち出した理由として、「第15回:インスタンス上のユーザデータの運用」で紹介したユーザデータの運用に対して「これ以外の方法はないものか?」と考えたときにUnionFSでオーバーレイマウントする方式という案があり、いずれ本連載にて紹介したいと考えていました。しかし、第15回では/var/opt/配下と/etc/opt/kanon/配下だけEBSボリュームに退避するだけで済むために、今回紹介する方式を用いるまでもありませんでした。

 今回紹介する方式は、「ユーザデータが各階層に散らばっている」場合や「既存のデータ(参照データ)と書き込まれるデータはディレクトリ単位では分割されない」場合などに有効となる方式です。とはいえ、筆者も本方式を100%有効に活用できているわけではないので、読者の皆さんが本連載を参考により良い活用方法を見出して頂けると幸いです。

UnionFS

 まずは、UnionFS自体の概要を簡単に説明します。UnionFSは全く別個のファイルシステム同士を透過的に重ねることができるファイルシステムです。言葉で説明するよりも下記の図を見て頂くほうが理解し易いでしょう。

UnionFSの概要図

 このようにUnionFSはn個のファイルシステムを重ね合わせてマウントすることで、1つのファイルシステムとして利用することが可能です。例えばインスタンスの/ディレクトリの上にEBSボリューム内に作成したディレクトリを重ねてマウントし、変更点は全てEBSボリュームに書き出す方法が考えられます。

EBSボリュームとUnionFS

 なお、上記の図では/に直接EBSボリュームをマウントせずに、/配下のディレクトリに個別にEBSボリューム内のディレクトリをマウントしていますが、これはEBSボリュームのマウントポイントが/の下になるため重ね合わせが入れ子になってしまい、今回の例で使用したaufs(バージョン1)ではネストするマウントポイントに対してのマウントができませんでした(ただし、これが今回使用したaufsのバージョンによるものなのか、それともUnionFSの仕様なのかについては調査中です)。

 

CentOSインスタンスでの利用

 今回はCentOS 5.6のインスタンスで利用できるUnionFSとしてaufsを使用します。なお、CentOS 5.6でのaufsのビルドは仙石浩明氏の日記dayflower氏のブログを参考にさせて頂きました。

 なお、下記のビルドで使用したインスタンスは、マシンイメージ工房のCentOS 5.6 x86_64 Baseイメージを使用しています。

 まずはaufsをビルドするために必要なパッケージをインストールします。今回はインスタンスで利用できるaufsのカーネルモジュールを作成するために必要なカーネルのソースコードとしてkernel-xen-develをインストールします。

# ビルドに必要なパッケージ類のインストール
yum -y install cvs make gcc kernel-xen-devel

 次にaufs(バージョン1)のソースコードを以下のように実行して取得します。

# ソースコードの取得
mkdir /usr/local/src/aufs.wcvs
cd /usr/local/src/aufs.wcvs
cvs -d:pserver:anonymous@aufs.cvs.sourceforge.net:/cvsroot/aufs login
cvs -z3 -d:pserver:anonymous@aufs.cvs.sourceforge.net:/cvsroot/aufs co aufs

 なお、CentOS 5系のカーネルはバージョンが2.6.18のため、このままではビルドできずにエラーとなります。それを回避するためには、以下のようなパッチをあてる必要があります。

# CentOS 5系でビルドするためのパッチ
diff -wdurp aufs.orig/fs/aufs/cpup.h aufs/fs/aufs/cpup.h
--- aufs.orig/fs/aufs/cpup.h    2009-01-26 15:23:51.000000000 +0900
+++ aufs/fs/aufs/cpup.h 2011-06-23 01:29:19.000000000 +0900
@@ -34,7 +34,8 @@
 static inline
 void au_cpup_attr_blksize(struct inode *inode, struct inode *h_inode)
 {
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 19)
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 18) && \
+    LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 19)
        inode->i_blksize = h_inode->i_blksize;
 #endif
 }
diff -wdurp aufs.orig/fs/aufs/vfsub.h aufs/fs/aufs/vfsub.h
--- aufs.orig/fs/aufs/vfsub.h   2009-01-26 15:24:45.000000000 +0900
+++ aufs/fs/aufs/vfsub.h        2011-06-23 01:23:16.000000000 +0900
@@ -575,7 +575,8 @@ int vfsub_statfs(void *arg, struct kstat

 /* ---------------------------------------------------------------------- */

-#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 20)
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 18) && \
+    LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 20)
 /* introduced in linux-2.6.20 */
 struct path {
        struct vfsmount *mnt;
diff -wdurp aufs.orig/local.mk aufs/local.mk
--- aufs.orig/local.mk 2009-01-26 15:24:45.000000000 +0900
+++ aufs/local.mk 2011-06-23 01:27:15.000000000 +0900
@@ -40,7 +40,7 @@ export CONFIG_AUFS_BRANCH_MAX_511 =
 export CONFIG_AUFS_BRANCH_MAX_1023 =
 #export CONFIG_AUFS_BRANCH_MAX_32767 =
 export CONFIG_AUFS_EXPORT =
-export CONFIG_AUFS_HINOTIFY =
+export CONFIG_AUFS_HINOTIFY = Y
 export CONFIG_AUFS_ROBR =
 export CONFIG_AUFS_SHWH =
 export CONFIG_AUFS_DLGT =

 上記のパッチを例えば/usr/local/src/aufs.wcvs/centos.patchとして保存し、以下のように実行してパッチをあて、ビルドとインストールを行ないます。

# パッチの適用
patch -l -p0 < centos.patch

# パッチをあてたら、以下のように実行してビルドします。
cd aufs/
make -f local.mk

# ビルド後、以下のように実行してカーネルモジュールをインストールします。
cp aufs.ko /lib/modules/`uname -r`/extra/
depmod -a

 次にEBSボリュームを作成してインスタンスにアタッチし、以下のようにインスタンスにてaufsを利用するための下準備を行ないます。

# アタッチしたEBSボリュームのパーティショニング
echo ',' | sfdisk /dev/sdb

# パーティションのフォーマット
mkfs.ext3 -F /dev/sdb1

# マウントポイントの作成
mkdir -p /ebs
mount /dev/sdb1 /ebs
mkdir -p /ebs/{bin,home,lib64,opt,root,usr,etc,lib,sbin,srv,tmp,var}

# 以下のように実行して、aufoに関するマウント情報をfstabに追記。
cat <> /etc/fstab
none         /bin       aufs    defaults,br:/ebs/bin:/bin/=ro     0 0
nonenone     /home      aufs    defaults,br:/ebs/home:/home/=ro   0 0
nonenone     /lib64     aufs    defaults,br:/ebs/lib64:/lib64/=ro 0 0
nonenone     /opt       aufs    defaults,br:/ebs/opt:/opt/=ro     0 0
nonenone     /root      aufs    defaults,br:/ebs/root:/root/=ro   0 0
nonenone     /usr       aufs    defaults,br:/ebs/usr:/usr/=ro     0 0
nonenone     /etc       aufs    defaults,br:/ebs/etc:/etc/=ro     0 0
nonenone     /lib       aufs    defaults,br:/ebs/lib:/lib/=ro     0 0
nonenone     /sbin      aufs    defaults,br:/ebs/sbin:/sbin/=ro   0 0
nonenone     /srv       aufs    defaults,br:/ebs/srv:/srv/=ro     0 0
nonenone     /tmp       aufs    defaults,br:/ebs/tmp:/tmp/=ro     0 0
nonenone     /var       aufs    defaults,br:/ebs/var:/var/=ro     0 0
EOF

 これでインスタンスにてaufsを利用してEBSボリュームをオーバーレイマウントする準備が整いました。

 実際に利用するためにはmount -aと実行するか、もしくはeuca-reboot-instancesコマンドでインスタンスを再起動します。

 

Kanon + AsakusaSatelliteでの利用例

 第15回で実施したのと同様のことを今回のaufsによるオーバーレイマウントで行なうためには、インスタンスにEBSボリュームをアタッチしてから以下のように実施します (以下は上記の例に比べて、必要最小限のマウントで済むような構成にしています)。

# アタッチしたEBSボリュームのパーティショニング
echo ',' | sfdisk /dev/sdb

# パーティションのフォーマット
mkfs.ext3 -F /dev/sdb1

# マウントポイントの作成
mkdir -p /ebs
mount /dev/sdb1 /ebs
mkdir -p /ebs/{etc,var}

# 以下のように実行して、aufoに関するマウント情報をfstabに追記。
cat <> /etc/fstab
none /etc aufs defaults,br:/ebs/etc:/etc/=ro 0 0
none /var aufs defaults,br:/ebs/var:/var/=ro 0 0
EOF

# 最後にインスタンス内で以下を実行し、インスタンスを再起動する
reboot

 

次回はGUI環境を持つインスタンスの作成および利用について

 本連載ではいままでGUI環境を持たないインスタンスのみを事例として紹介してきました。一方で最近ではDaaSという言葉を耳にすることも当たり前になってきております。GUI環境を載せたインスタンスの作成方法と利用方法を紹介するだけで「これがDaaSだ」とはさすがの筆者も言えませんが、せめてGUI環境を持ったインスタンスのことについてはそろそろ触れておいたほうが良いと考えますので、次回はそれらのインスタンスの作成方法と利用方法について紹介致します。

 


羽深 修
Eucalyptus歴はまだ1年ですが、周囲からはEucalyptus中毒と勘違いされているようです。Japan Eucalyptus User Groupの活動に参加し、オープンソースカンファレンスでネタなどを披露しています。度々Eucalyptusへのパッチも書いてます。ちなみに仕事ではCentOS + Xenという環境でEucalyptusを利用していますが、自宅のEucalyptus環境はGentoo Linux + KVMで動かしています。

志田 隆弘
主にEucalyptusやクラウドとはあまり関係のない分野でちょこちょこと活動していました。Eucalyptusはバージョン 1.3の頃からいじり始め、かれこれ2年近くEucalyptusに浸かった生活をしています。Eucalyptus 1.4が出たタイミングで、Tanacasinoという名前のGUIクライアントを作ったりしていました。最新のEucalyptusで動作するので、ぜひ使ってみてください。

田中 智文
志田さんとともに初期の頃からEucalyptusの調査・検証・使用してきました。志田さんの作成したTanacasinoのメンテナンスと機能拡張を行っています。新婚ほやほやなので家でのハック活動時間が少ないですが、Walrus Clientを作ってみたりbotoを使ってEucalyptusを操作して遊んでいます。

 

関連情報
(羽深 修/志田 隆弘/田中 智文)
2011/6/24 06:00