Btrfsを試す

次のLinuxファイルシステムのBtrfsを使ってみた。(今更?)

インストール

Ubuntu14.04では

# apt-get install btrfs-tools
# btrfs version
Btrfs v3.12

でコマンド類がインストールされます。

フォーマット

/dev/sdb1をBtrfsでフォーマットします。

# mkfs.btrfs /dev/sdb1 -f

WARNING! - Btrfs v3.12 IS EXPERIMENTAL
WARNING! - see http://btrfs.wiki.kernel.org before using

Turning ON incompat feature 'extref': increased hardlink limit per file to 65536
fs created label (null) on /dev/sdb1
    nodesize 16384 leafsize 16384 sectorsize 4096 size 500.00GiB
Btrfs v3.12

まだ安定していないということで、"EXPERIMENTAL"と出ます。

マウント

普通にマウントするだけです。

# mount /dev/sdb1 /mnt

マウントオプションでいろいろ設定できるが、それは後述。

ファイルシステムの情報

ディスク使用量を確認する。

# btrfs filesystem df /mnt
Data, single: total=8.00MiB, used=256.00KiB
System, DUP: total=8.00MiB, used=16.00KiB
System, single: total=4.00MiB, used=0.00
Metadata, DUP: total=1.00GiB, used=112.00KiB
Metadata, single: total=8.00MiB, used=0.00
unknown, single: total=16.00MiB, used=0.00

あれ?500GBのディスクのはずだが?見方が良くわからない。

# btrfs filesystem show /mnt
Label: none  uuid: 79ddf05d-a797-414c-ac4c-204535b5477a
    Total devices 1 FS bytes used 384.00KiB
    devid    1 size 500.00GiB used 2.04GiB path /dev/sdb1

Btrfs v3.12

こちらはそれっぽい。

サブボリュームの作成

Btrfsにはサブボリュームという概念がある。ディレクトリのスナップショットはサブボリューム単位で取得される。

# btrfs subvolume create /mnt/sv1
Create subvolume '/mnt/sv1

で作成する。

# btrfs subvolume list /mnt
ID 257 gen 6 top level 5 path sv1

確かにできている。サブボリュームはディレクトリとして見える。

# ls /mnt
sv1

サブボリュームをマウントすることもできる。

# umount /mnt
# mount -o subvol=sv1 /dev/sdb1 /mnt

スナップショットの作成

普通にマウントしなおす。

# umount /mnt
# mount /dev/sdb1 /mnt

適当に大きめのファイルを作った。

# dd if=/dev/zero of=/mnt/sv1/file bs=100MB
^C56+0 records in
56+0 records out
5600000000 bytes (5.6 GB) copied, 45.8575 s, 122 MB/s

スナップショットを作成する。

# btrfs subvolume snapshot /mnt/sv1 /mnt/sv1.snap
Create a snapshot of '/mnt/sv1' in '/mnt/sv1.snap'

同じものが出来ている。

# btrfs subvolume list /mnt
ID 257 gen 14 top level 5 path sv1
ID 264 gen 14 top level 5 path sv1.snap
#  ls /mnt/ -R
/mnt/:
sv1  sv1.snap

/mnt/sv1:
file

/mnt/sv1.snap:
file

スナップショットなので同じものが出来ているが、ディスクは使われていない。また、作成も一瞬でできる。

# df | grep sdb1
/dev/sdb1      524288000  5482032 516691632   2% /mnt

ファイル単位のスナップショットはコピーコマンドで出来る。

# cp --reflink /mnt/sv1/file /mnt/sv1/file.snap
# ls -l /mnt/sv1
# ls /mnt/sv1 -l
total 10937504
-rw-r--r-- 1 root root 5600000000  1月  5 02:42 file
-rw-r--r-- 1 root root 5600000000  1月  5 02:53 file.snap

デバイスの追加と削除

Btrfsはマルチデバイスに対応している。

マウントしたままデバイスが追加できる。

# btrfs device add /dev/sdb2 /mnt

/dev/sdb2が追加された。

# btrfs filesystem show /mnt
Label: none  uuid: 79ddf05d-a797-414c-ac4c-204535b5477a
    Total devices 2 FS bytes used 5.22GiB
    devid    1 size 500.00GiB used 8.04GiB path /dev/sdb1
    devid    2 size 431.51GiB used 0.00 path /dev/sdb2

Btrfs v3.12

デバイスの削除もできる。

# btrfs device delete /dev/sdb1 /mnt
# btrfs filesystem show /mnt
Label: none  uuid: 79ddf05d-a797-414c-ac4c-204535b5477a
    Total devices 1 FS bytes used 5.22GiB
    devid    2 size 431.51GiB used 7.06GiB path /dev/sdb2

Btrfs v3.12

データのコピーが必要なのでちょっと時間がかかる。

再びsdb1を追加して、データのバランシングをしてみる。

# btrfs device add /dev/sdb1 /mnt/
# btrfs balance start /mnt
Done, had to relocate 8 out of 8 chunks

新しく追加したデバイスにデータが一部移動している。

# btrfs filesystem show /mnt
Label: none  uuid: 79ddf05d-a797-414c-ac4c-204535b5477a
    Total devices 2 FS bytes used 5.22GiB
    devid    2 size 431.51GiB used 1.03GiB path /dev/sdb2
    devid    3 size 500.00GiB used 7.03GiB path /dev/sdb1

Btrfs v3.12

まとめ

LVMを駆使して行うような運用がファイルシステムの機能で簡単に実現できることが便利そうだ。 他にも耐障害性も優れているらしいが、今回は試していない。 性能等も気になるところである。