技術ブログ
注意! 本エントリでは、サポートされない手順について記載しています! ⇒ KROWN:158258 OracleVM 3 での Oracle VM Server コマンドラインから許可されている操作(※:参照にはサポート契約が必要)
過去のバージョンではどうだったかわかりませんが、 すくなくともOracle VM 3.1.1 では、Oracle VM ManagerからテンプレートをcloneしてVMを作成すると、 reflinkを用いたThin Cloneにてclone処理が実行されるようです。
仮想化環境では、VMテンプレートや既存のVM(以後オリジナルVMと表記)を複製して新規VM(以後クローンVMと表記)を構築する場合が多々あります。 オリジナルVMとクローンVMは別のVMであるため、仮想ディスクに対応するファイル(以下仮想ディスクファイルと表記)は別々のデータとして独立に参照・更新できる必要があります。しかし、仮想ディスクファイルはサイズが大きいため、単純にコピーしてしまうと、ディスク領域を大量に消費しすることになります。また、オリジナルVMとクローンVMは別のVMであるとはいえ、仮想ディスクファイルにおける多くの部分には同じデータが含まれています。このため、仮想ディスクファイルを単純にコピーすると、重複したデータを2重に持つことになり、領域を無駄使いしていることになります。
OCFS2 reflinkを使用することで、このような問題に対処することができます。reflinkを使用すると、ハードリンクと同じようにあるデータに対して複数のファイル名をつけることができますが、 ファイル名ごとに全く独立したデータのように見えます。
あるファイル名を指定してデータにアクセスして更新処理を行うと、OCFS2では、変更された箇所のみを複製(Copy-On-Write)し、変更されていない箇所、すならち同じデータについては、同じディスク領域を複数のファイル名から共有されるようになっています。このため、同じ内容のデータを複数のファイルごとに重複して保持するような、領域の無駄使いが起こりません。
また、reflinkを実行時は、複数のファイル名の間でデータは完全に共有されているため、この時点での負荷は小さいです。実際、数GBもある仮想ディスクファイルでも、clone処理は一瞬で終わります。非常に便利です。
http://oss.oracle.com/~smushran/reflink-tools/ から入手できるreflink-toolsを使用して、reflinkの動作を確認しながら、 テンプレートをcloneしてみましょう。
[root@csov3s01 2]# cd /var/tmp
[root@csov3s01 tmp]# wget https://oss.oracle.com/~smushran/reflink-tools/OL5-x86_64/shared-du-0.1.0-1.x86_64.rpm
wget https://oss.oracle.com/~smushran/reflink-tools/OL5-x86_64/shared-filefrag
--2012-11-28 10:54:30-- https://oss.oracle.com/~smushran/reflink-tools/OL5-x86_64/shared-du-0.1.0-1.x86_64.rpm
Resolving oss.oracle.com... 137.254.17.12
Connecting to oss.oracle.com|137.254.17.12|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 43587 (43K) [application/x-rpm]
Saving to: `shared-du-0.1.0-1.x86_64.rpm'
100%[======================================>] 43,587 146K/s in 0.3s
2012-11-28 10:54:31 (146 KB/s) - `shared-du-0.1.0-1.x86_64.rpm' saved [43587/43587]
[root@csov3s01 tmp]# wget https://oss.oracle.com/~smushran/reflink-tools/OL5-x86_64/shared-filefrag
--2012-11-28 10:54:31-- https://oss.oracle.com/~smushran/reflink-tools/OL5-x86_64/shared-filefrag
Resolving oss.oracle.com... 137.254.17.12
Connecting to oss.oracle.com|137.254.17.12|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 30407 (30K) [text/plain]
Saving to: `shared-filefrag'
100%[======================================>] 30,407 101K/s in 0.3s
2012-11-28 10:54:32 (101 KB/s) - `shared-filefrag' saved [30407/30407]
[root@csov3s01 tmp]# ls
shared-du-0.1.0-1.x86_64.rpm shared-filefrag
[root@csov3s01 tmp]# rpm -ivh shared-du-0.1.0-1.x86_64.rpm
Preparing... ########################################### [100%]
1:shared-du ########################################### [100%]
[root@csov3s01 tmp]# which reflink
/usr/bin/reflink
[root@csov3s01 tmp]# which shared-du
/usr/bin/shared-du
[root@csov3s01 tmp]# chmod +x shared-filefrag
[root@csov3s01 tmp]# cp -p shared-filefrag /usr/bin/
[root@csov3s01 tmp]# hash -r
[root@csov3s01 tmp]# shared-filefrag
Usage: shared-filefrag [-Bbvsx] file ...
[root@csov3s01 2]# find . -type f
./Templates/0004fb00001400005071913653bfdc8e/vm.cfg
./VirtualDisks/fd99a6df-4e03-42d0-9ca4-ae1f674f8258.img
./.ovsrepo
[root@csov3s01 2]# shared-filefrag -v ./Templates/0004fb00001400005071913653bfdc8e/vm.cfg
Filesystem type is: 7461636f
File size of ./Templates/0004fb00001400005071913653bfdc8e/vm.cfg is 732 (1 block, blocksize 4096)
ext logical physical expected length flags
0 0 5919293640 3896 not_aligned,inline,eof
./Templates/0004fb00001400005071913653bfdc8e/vm.cfg: 1 extent found
[root@csov3s01 2]# shared-filefrag -v ./VirtualDisks/fd99a6df-4e03-42d0-9ca4-ae1f674f8258.img
Filesystem type is: 7461636f
File size of ./VirtualDisks/fd99a6df-4e03-42d0-9ca4-ae1f674f8258.img is 12884901888 (3145728 blocks, blocksize 4096)
ext logical physical expected length flags
0 0 74617088 6400 ←★特にflagがついていないため、extentが
1 6912 74623488 3584 ←★共有されていないことがわかります
:
234 2684160 41633280 512
235 2706944 41633792 256
./VirtualDisks/fd99a6df-4e03-42d0-9ca4-ae1f674f8258.img: 26 extents found
ここでテンプレートをcloneしてVMを作成します。
[root@csov3s01 2]# find . -type f
./Templates/0004fb00001400005071913653bfdc8e/vm.cfg
./VirtualDisks/fd99a6df-4e03-42d0-9ca4-ae1f674f8258.img
./VirtualDisks/0004fb000012000094c6d7f6ea89243b.img
./VirtualMachines/0004fb0000060000ec4749785df8f9a9/vm.cfg
./.ovsrepo
[root@csov3s01 2]# shared-filefrag -v ./VirtualDisks/fd99a6df-4e03-42d0-9ca4-ae1f674f8258.img
Filesystem type is: 7461636f
File size of ./VirtualDisks/fd99a6df-4e03-42d0-9ca4-ae1f674f8258.img is 12884901888 (3145728 blocks, blocksize 4096)
ext logical physical expected length flags
0 0 74617088 6400 shared ←★shared flagがついているため、extentが
1 6912 74623488 3584 shared ←★共有されていることがわかります
:
234 2684160 41633280 512 shared
235 2706944 41633792 256 shared
./VirtualDisks/fd99a6df-4e03-42d0-9ca4-ae1f674f8258.img: 26 extents found
[root@csov3s01 2]# shared-filefrag -v ./VirtualDisks/0004fb000012000094c6d7f6ea89243b.img
Filesystem type is: 7461636f
File size of ./VirtualDisks/0004fb000012000094c6d7f6ea89243b.img is 12884901888 (3145728 blocks, blocksize 4096)
ext logical physical expected length flags
0 0 74617088 6400 shared ←★shared flagがついているため、extentが
1 6912 74623488 3584 shared ←★共有されていることがわかります
:
234 2684160 41633280 512 shared
235 2706944 41633792 256 shared
./VirtualDisks/0004fb000012000094c6d7f6ea89243b.img: 26 extents found