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