Archive for the ‘reflink’ tag
Unbreakable Enterprise Kernelを使おう – OCFS2 1.6 reflink編
Unbreakable Enterprise KernelではOCFS2の最新バージョン、1.6がサポートされます。この日をどれだけ待ちわびたかことか。
OCFS2 1.6の何が良いのか? それは何と言っても「reflink」です。reflinkについては過去にも幾度が言及されていますが、今回初めてすぐに使える&サポートされる形でモジュールが提供されてきました。
reflinkとは感覚的に言えばハードリンクとスナップショットが一緒になったようなものです。スナップショットは非常に便利な機能で、最小限の容量で差分バックアップを一瞬で作成し、複数世代保持できます。通常スナップショットはLUN単位またはファイルシステム単位で取得することになります。reflinkはこのスナップショットをファイル単位で取得できるというものです。これは一部の商用製品を除いてこれまで実現できなかった機能です。アプリケーションデータのスナップショットからVMイメージのスナップショットまでいろんな活用例が容易に想像でき、夢が広がります。
では早速reflinkしてみましょう。
こちらのポストでUnbreakable Enterprise Kernelをインストールすれば、すぐにOCFS2 1.6及びreflinkが使える状態になっています。
まずOCFS2でフォーマットするためのブロックデバイスを用意します。VM環境であれば「Create New Virtual Disk」で新しい仮想ディスクを追加してあげます(ちなみにオンラインで追加できます)。
追加が完了するとこうなります。
ゲストOSからは/dev/xvdbとして新しいブロックデバイスが見えています。このブロックデバイスをOCFS2でフォーマットします。今回はクラスターは組みませんので-M localでローカルファイルシステム専用にしています。–fs-features=refcontを指定することでこのファイルシステムでreflinkが有効になります。
[root@~]# mkfs.ocfs2 -M local --fs-features=refcount /dev/xvdb mkfs.ocfs2 1.6.3 Label: Features: sparse backup-super unwritten inline-data strict-journal-super refcount Block size: 4096 (12 bits) Cluster size: 4096 (12 bits) Volume size: 1073741824 (262144 clusters) (262144 blocks) Cluster groups: 9 (tail covers 4096 clusters, rest cover 32256 clusters) Extent allocator size: 4194304 (1 groups) Journal size: 67108864 Node slots: 1 Creating bitmaps: done Initializing superblock: done Writing system files: done Writing superblock: done Writing backup superblock: 0 block(s) Formatting Journals: done Growing extent allocator: done Formatting slot map: done Formatting quota files: done Writing lost+found: done mkfs.ocfs2 successful
フォーマット完了です。マウントします。
[root@~]# mount /dev/xvdb /mnt
さぁ、reflinkのテストを行いましょう。abcと書かれたテキストファイル、a.txtを作成します。そしてそのa.txtをreflinkしてaa.txtを作成します。そしてaa.txtをcatしてみると、abcと書かれています。つまり、a.txtとaa.txtがリンクしているのがわかります。
[root@~]# vi a.txt abc [root@~]# reflink a.txt aa.txt [root@~]# cat aa.txt abc
つぎにaa.txtの中身を編集してみます。その後、a.txtとaa.txtを見てみると別々の文字列が保存されていることが確認できます。これが単なるハードリンクではなく、「ハードリンク+スナップショット」と書いた由縁です。
[root@~]# vi aa.txt abc def [root@~]# cat a.txt abc [root@~]# cat aa.txt abc def
次の実験。reflinkで作成したファイルはCoWなので作成時には容量を消費しません。まずは現在のOCFS2ファイルシステムの空き容量を確認します。そしてddで100Mbyteのファイルtest.imgを作成し、空き容量が100Mbyte消費されることを確認します。次にtest.imgをreflinkしてtest.img.bakを作成し、双方のファイル容量とファイルシステム空き容量をもう一度確認します。ファイルは双方とも100Mbyte消費しているものの、ファイルシステムの空き容量は減っていないことが確認できます。
[root@~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/xvdb 1.0G 81M 944M 8% /mnt [root@~]# dd if=/dev/zero of=test.img bs=1M count=100 100+0 records in 100+0 records out 104857600 bytes (105 MB) copied, 0.311367 seconds, 337 MB/s [root@~]# df -h /mnt Filesystem Size Used Avail Use% Mounted on /dev/xvdb 1.0G 187M 838M 19% /mnt [root@~]# reflink test.img test.img.bak [root@~]# ll -h total 200M -rw-r--r-- 1 root root 8 Sep 21 01:48 aa.txt -rw-r--r-- 1 root root 4 Sep 21 01:36 a.txt drwxr-xr-x 2 root root 3.9K Sep 21 01:35 lost+found -rw-r--r-- 1 root root 100M Sep 21 01:52 test.img -rw-r--r-- 1 root root 100M Sep 21 01:54 test.img.bak [root@~]# df -h /mnt Filesystem Size Used Avail Use% Mounted on /dev/xvdb 1.0G 187M 838M 19% /mnt
さらに、reflinkが面白いのはスナップショットにあるマスター/スレーブのような主従関係がないことです。つまり、reflink元のファイル、a.txtを消去してもaa.txtは影響を受けません。容量は効率的に消費するものの、ファイルとしては完全に独立しているのです。
[root@~]# rm a.txt [root@~]# cat aa.txt abc def
楽し過ぎます。これがOCFS2 1.6の目玉機能、reflinkです。