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のRPMSRPMをとりあえず公開しておきます。
新しいバージョンだと面倒だったので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で公式にサポートされておらず、不具合がないかは分かりませんので、使用には十分注意してください。

Trackback URL



コメント

Reader Comments

Be the first to leave a comment!