nkjmkzk.net

powered by Kazuki Nakajima

Btrfsの基本操作

今回は実際にBtrfsを使う際のオペレーションを見ていきます。

*ちなみにBtrfs環境のセットアップはこちらを参照ください。カーネル2.6.34のVM Templateをオススメします。というかUnbreakable Enterprise Kernelでは一部正常に機能しないBtrfsコマンドがあります。

まずはBtrfs用の適切なボリュームを用意します。手元の環境はOracle VM上のVMなので仮想ディスクを割り当てます。詳細な手順はこちらの通り。かくかくしかじかで4つ程作成しておきます。こんな感じ。

vdisk

ではOSに入ります。

フォーマットとsubvolumeの切り出し

まずはフォーマットです。

[root@~]# mkfs.btrfs /dev/xvdb

WARNING! - Btrfs v0.19-16-g075587c-dirty IS EXPERIMENTAL
WARNING! - see http://btrfs.wiki.kernel.org before using

fs created label (null) on /dev/xvdb
	nodesize 4096 leafsize 4096 sectorsize 4096 size 1.00GB
Btrfs v0.19-16-g075587c-dirty

[root@~]#

危険なメッセージとともにフォーマットが完了します。
次にマウントします。

[root@~]# mount -t btrfs /dev/xvdb /mnt

/mntにBtrfsがマウントされました。

Btrfsの一覧を取得するには下記のコマンドを実行します。

[root@~]# btrfs filesystem show
Label: none  uuid: a584f1d0-2123-45d8-b678-50bf2318a2a7
	Total devices 1 FS bytes used 28.00KB
	devid    1 size 10.00GB used 2.04GB path /dev/xvdb

Btrfs v0.19-16-g075587c-dirty
[root@~]#

次にsubvolumeを切り出します。subvolumeはBtrfs独特の概念で、ファイルシステムをさらに小分けにするというものです。何故これが必要かというと、例えば後述のスナップショットがあります。Btrfsでのスナップショットはsubvolume単位で行います。なので独立してバックアップを取りたい範囲にsubvolumeを切り出しておくことが重要です。

今回はactiveとbackupという2つのsubvolumeを作成しておきます。activeが本番データ用で、backupにactiveのスナップショットを作成して世代管理するという作戦です。

[root@~]# btrfs sub create /mnt/active
Create subvolume '/mnt/active'

[root@~]# btrfs sub create /mnt/backup
Create subvolume '/mnt/backup'

[root@~]# ls /mnt/
active  backup

subvolumeの一覧を取得するには下記のコマンドを実行します。

[root@~]# btrfs sub list
ID 256 top level 5 path active
ID 257 top level 5 path backup

[root@~]#

スナップショット

さて、モダンなファイルシステムのマストアイテム、スナップショットを行います。まずテストデータを作成しておきます。

[root@~]# touch /mnt/active/{a,b,c}
[root@~]# ls /mnt/active/
a  b  c

このactiveのスナップショットを2010_09_22として作成します。

[root@~]# btrfs sub snap /mnt/active /mnt/backup/2010_09_22
Create a snapshot of '/mnt/active' in '/mnt/backup/2010_09_22'

バックアップとして機能しているか確認します。

[root@~]# ls /mnt/backup/2010_09_22/
a  b  c

[root@~]# rm /mnt/active/a
[root@~]# ls /mnt/active
b  c

[root@~]# ls /mnt/backup/2010_09_22/
a  b  c

良いようです。

圧縮

次にインライン圧縮を行います。Btrfsではマウント時に-o compressを指定することで圧縮を有効化できます。
比較するために2つのファイルシステムを作成して一方を非圧縮、もう一方を圧縮でマウントします。
まずはファイルシステムの作成。

[root@~]# mkfs.btrfs /dev/xvdc

WARNING! - Btrfs v0.19-16-g075587c-dirty IS EXPERIMENTAL
WARNING! - see http://btrfs.wiki.kernel.org before using

fs created label (null) on /dev/xvdc
	nodesize 4096 leafsize 4096 sectorsize 4096 size 1.00GB
Btrfs v0.19-16-g075587c-dirty

[root@~]# mkfs.btrfs /dev/xvdd

WARNING! - Btrfs v0.19-16-g075587c-dirty IS EXPERIMENTAL
WARNING! - see http://btrfs.wiki.kernel.org before using

fs created label (null) on /dev/xvdd
	nodesize 4096 leafsize 4096 sectorsize 4096 size 1.00GB
Btrfs v0.19-16-g075587c-dirty

ファイルシステムが2つ作成されました。次にマウントポイントを2つ作成し、一方を非圧縮、もう一方を圧縮でマウントします。

[root@~]# mkdir /comp_off
[root@~]# mkdir /comp_on
[root@~]# mount -t btrfs /dev/xvdc /comp_off
[root@~]# mount -t btrfs -o compress /dev/xvdd /comp_on

では圧縮がかかるかどうかみてみましょう。
圧縮強度を測るという意味ではあまり意味ないですがddで100Mbyteの空ファイルを作成して消費容量を比較してみます。

[root@~]# df -h /comp_off /comp_on
Filesystem            Size  Used Avail Use% Mounted on
/dev/xvdc             1.0G   28K  1.0G   1% /comp_off
/dev/xvdd             1.0G   28K  1.0G   1% /comp_on

[root@~]# dd if=/dev/zero of=/comp_off/test.img bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.05536 seconds, 1.9 GB/s

[root@~]# dd if=/dev/zero of=/comp_on/test.img bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.0550743 seconds, 1.9 GB/s

[root@~]# sync

[root@~]# df -h /comp_off /comp_on
Filesystem            Size  Used Avail Use% Mounted on
/dev/xvdc             1.0G  101M  924M  10% /comp_off
/dev/xvdd             1.0G  3.3M 1021M   1% /comp_on

効いているようです。
今回はBtrfsの基本操作について解説しました。いろいろ使っているとまだKnown Issueも少なくないですが、今後の活発な開発に期待大なファイルシステムには違いありません。新しいカーネルが出るたびに進捗が気になるところです。

with 5 comments

Written by 中嶋 一樹

9月 27th, 2010 at 9:14 am

Posted in Uncategorized

Tagged with ,

5 Responses to 'Btrfsの基本操作'

Subscribe to comments with RSS or TrackBack to 'Btrfsの基本操作'.

  1. これだと、単にサブボリューム “active” の snapshot を取っている
    だけなので、backup サブボリュームを作る意味が無いです。
    mkdir /mnt/backup で OK です。

    もしも /mnt/backup にあるバックアップ全体のスナップショットが
    欲しいようなときは便利ですが……。

    sugi

    28 9月 10 at 4:36 PM

  2. あと、この Unbreakable Enterprise Kernel の btrfs に手が入って
    いるかはわからないのですが、もし vanilla 2.6.32 そのままなら、
    snapshot の前に sync しないと、中途半端なものが出来ます。
    http://kerneltrap.org/mailarchive/linux-btrfs/2010/2/25/6805683/thread

    ここで変更されていて、
    http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=0bdb1db297ab36865a63ee722d35ff0a1f0ae522

    vanilla kernel では 2.6.34 から入っています。

    sugi

    28 9月 10 at 4:57 PM

  3. ご返信遅くなりました。
    backup subvolumeをあえて分けているのは、分けておかないと繰り返しスナップショットをとった場合に、次の日のスナップショットの中に前の日のスナップショットのディレクトリが出来る、という具合に再起的にどんどんディレクトリが増えて気持ち悪かったからです。

    nkjm

    3 10月 10 at 12:49 PM

  4. なるほど。vanillaではないのですが、btrfsの部分は恐らく手が入ってないと思います。実際、2.6.32ではsubvolume listが動かなかったり、怪しい箇所がいろいろありました。なので僕もいまはChrisのgitから落としてきた2.6.34のコードで使っています。

    nkjm

    3 10月 10 at 12:52 PM

  5. いや、active が subvolume として切ってあって、そのスナップショットを *active の外に* 作っている限りは再帰的には増えないはずです。
    この時、つくる先が別のサブボリュームかどうかは関係ないです。

    例えば root しかない状況で、中にスナップショットをとるとどんどん増えていきますけど。

    sugi

    4 10月 10 at 5:35 AM

Leave a Reply