第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 < 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 < 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を操作して遊んでいます。 |