OpenVZでUnionfsを使ってみた
最近仕事でOpenVZを触る機会がめっきり減ってブログで取り上げることもなくなっていたのですが、久々のOpenVZネタです。
OpenVZでゲストを大量に作成していくと、ディスク容量に悩むことが出てくるかもしれません。VirtuozzoならVZFS、Linux-VserverならUnificationと、他のVPSソフトには容量を節約する仕組みがあったりするのですが、現在のところOpenVZにはそのような機能はないようです(まさにVZFSのあるなしがVirtuozzoとOpenVZの違いだったりするのですが)。そこで、複数のファイルシステムを同時にマウントしてひとつのファイルシステムに見せることができるUnionfsで同じような機能が実現できないか試してみました。
Unionfsについては詳細は以下のページを参照してください。
UnionFSなお話 - もっとコンピュータが好きになるblog
Fedora Core 4でUnionFSを使う - 気まぐれソフトハウス
UnionfsはLinuxカーネルには含まれていませんので、ソースからコンパイルしなくてはなりません。さらにOpenVZカーネルもコンパイルし直す必要があります。モジュールとカーネルのコンパイル方法がOpenVZ WikiのLiveCDの作り方のページに載っていたのでこれを参考にして、手順をまとめてみました。まとめたと言ってもほぼそのままですけど。
1.squashfs対応のパッチをあてたカーネルを作成する。
手順はここに案内されています。パッチをあてたx86のRPMとSRPMをとりあえず公開しておきます。
新しいバージョンだと面倒だったので2.6.18-ovz028stab035.1と古いものになっています。
2.1.で作成したカーネルをインストールする。
# rpm -ivh to_booted_livecd/kernels/kernel-smp-2.6.18-ovz028stab035.1.i686.rpm
3.unionfsのソースをダウンロードする。コンパイルする。
手順はここに案内されているものと同じです。
# wget http://download.filesystems.org/unionfs/OLD/unionfs-1.x/unionfs-1.4.tar.gz # tar xzf unionfs-1.4.tar.gz# cd unionfs-1.4 # echo 'LINUXSRC=/lib/modules/2.6.18-ovz028stab035.1-smp/build/ > TOPINC=-I$(LINUXSRC)/include> MODDIR=/lib/modules/2.6.18-ovz028stab035.1-smp/' > fistdev.mk # make # ls unionfs.ko unionfs.ko
4.リブートして、kernel-smp-2.6.18-ovz028stab035.1で立ち上げる。
5.モジュールをインストール
# cd unionfs-1.4 # insmod unionfs.ko # lsmod|grep unionfs unionfs 77384 0
これで準備は整いました。
6.雛形となるゲスト(VE)を用意する。
# vzctl create 100 --ostemplate centos-4-minimal Creating VE private area (centos-4-i386-minimal) Performing postcreate actions VE private area was created
7.データをインストールしないゲストを用意する。設定ファイルにIPアドレスを設定する場合は、雛形とは異なるIPを設定して下さい(ここでは設定していません)。
# mkdir /vz/root/101 # mkdir /vz/private/101 # mkdir -p /vz/data/101 # cp /etc/vz/conf/100.conf /etc/vz/conf/101.conf
8.unionfsでマウントする。
# mount -t unionfs -o dirs=/vz/data/101/=rw:/vz/private/100/=ro unionfs /vz/private/101/
以下のようになっているはずです。
# ls /vz/private/101 bin dev halt initrd media opt root selinux sys usr boot etc home lib mnt proc sbin srv tmp var
9.ゲストを起動する。
# vzctl start 101# vzlist VEID NPROC STATUS IP_ADDR HOSTNAME 101 3 running - -
起動できたらとりあえず成功です。
ゲストの中に入って、ファイルを作成してみます。
dummy-centos-4-fileはOpenVZのゲストの/tmpに初期状態から置かれているファイルです。
# vzctl enter 101 entered into VE 101 # touch /tmp/touch/hogehoge # ls -l /tmptotal 0 -rw-rw-rw- 1 root root 0 Dec 14 2005 dummy-centos-4-file -rw-r--r-- 1 root root 0 Feb 4 03:06 hogehog # exit logout exited from VE 101
データが書き込まれるディレクトリを見てみると、
# ls -l /vz/data/101/tmp/total 0 -rw-r--r-- 1 root root 0 Feb 4 09:06 hogehoge
と、見事にhoghogeファイルが作成されています。
一方roのディレクトリにはファイルは作成されていません。
# ls -l /vz/private/100/tmp/total 0 -rw-rw-rw- 1 root root 0 Dec 14 2005 dummy-centos-4-file
新たに作成されたり更新されたファイルのみが新しいデータとして/vz/data/101に書き込まれまれます。
ファイルを削除するとどうなるでしょうか。
# vzctl enter 101entered into VE 101 # rm /tmp/dummy-centos-4-file rm: remove regular empty file `dummy-centos-4-file'? y # ls -l /tmp/ total 0-rw-r--r-- 1 root root 0 Feb 4 03:06 hogehoge # exit logout exited from VE 101 # ls -l /vz/private/100/tmp/ total 0-rw-rw-rw- 1 root root 0 Dec 14 2005 dummy-centos-4-file # ls -la /vz/data/101/tmp/ total 12 drwxrwxrwt 3 root root 4096 Feb 6 22:00 . drwxr-xr-x 6 root root 4096 Feb 6 22:00 .. -rw-r--r-- 1 root root 0 Feb 4 09:06 hogehoge drwxrwxrwt 2 root root 4096 Feb 6 22:00 .ICE-unix -rwxr-xr-x 1 root root 0 Feb 6 22:00 .wh.dummy-centos-4-file
もちろん/vz/private/100/tmpではファイルが削除されていません。
/vz/data/101/tmp/では「.wh.dummy-centos-4-file」というファイルが新たに作成されています。ファイルが削除されたというフラグのようなものみたいです。
UnionfsはOpenVZで公式にサポートされておらず、不具合がないかは分かりませんので、使用には十分注意してください。



