Btrfs ファイルシステム構築

提供:TuntunkunMediaWiki

移動: 案内, 検索

目次

Btrfsとは

btrfsは、ORACLEがオープンソースで開発したファイルシステムでオブジェクトレベルのRAIDアルゴリズム実装や、スナップショット、スナップショットのスナップショット、サブボリュームなどの機能を備えるファイルシステムです。ORACLEが開発したと聞くと意外に感じる人も多いでしょう。ORACLEはデータベースを専業とする企業ですが、データベースにおけるファイルシステムというファクターはとても大きいものなのです。実際、数十テラバイトのデータを扱うようなデータベースを運用している企業にとっての関心ごとの多くはI/O周りの性能に向けられています。たとえば、Googleが社内で使用している GFS : Google File System などは、そのいい例です。GFS は外部に公開されていないため、そのオープンソースクローンである Hadoop のついて見てみると、汎用のファイルシステムとして使うには十分な機能を持っているとは言えませんが、データベースとは相性の良いものになっています。この GFS や、Hadoop は MapReduce のために作られているからです。こういった背景から、ORACLEがファイルシステムを構築することは、ある意味必然とも言えるのです。ただ、ORACLEのアプローチはデータベースのためだけのものではなく、データベースと相性の良い汎用ファイルシステムを作ることだという違いがあるだけです。

特徴

COW : Copy On Write

一般的にコピーオンライトの原則といえば、容量節約の観点から見られることが多いが、実際のところ容量の節約というのは副次的な効果でしかない。ファイルシステムにおいて危険な操作は、オブジェクトの読み込み->部分書き換え->オブジェクトの書き込みといったような操作である。この一連の操作はアトミックでなければならないが、万が一停電のような事態が発生してこれが正常に行われなかったとすると、とても悲惨な結果が待ち受けている。COW であれば、データは上書きされることなく空いている領域うにオブジェクトを生成し書きこむ。その上で、メタデータを更新するのである。そのため、データは破損しない。少なくても復旧しやすいのは明らかである。したがって、不要になったオブジェクトを回収しなければ、むしろディスクの利用効率は悪くなる。だがそこを逆にうまくついて、ガーベッジコレクションされないようにフラグを立てるか、参照カウントを持たせるかをすればスナップショットの出来上がりだ。btrfs では、スナップショットのスナップショットを生成できるためおそらく、参照カウントを使っているのだろうと推測される。

オブジェクトレベルRAID

通常、RAIDアルゴリズムはHDDボリューム上のブロック(セクタ)に対して適用されます。しかし、ファイルシステムが扱うオブジェクト(ノード)レベルでのRAIDアルゴリズムを適用するというアプローチを btrfs はとりました。通常RAIDは、いくつかのセクタをまとめてさらに大きなブロックを構成します。したがって、ある1バイトを書き換える操作を行うとき、このRAIDでのブロックサイズで読み込むことになります、そしてこのブロックの中の、1つのセクタの中のたった1バイトを書き換えて、HDDに書き戻すのです。このような無駄な操作を、Read-Modify-Write と呼びますが、RAIDでランダムアクセスが性能が悪くなるのはこのためです。しかし、ファイルシステムのノードをこのRAIDのブロックと同じ単位にしてしまうととても効率がよくなります。なぜなら、ファイルシステムのノードをブロックにすることでRAIDの1ブロックとファイルシステムの1ノードが等価になり、ファイルシステムのノードに対する操作すべてが1ブロックのアクセスですみます。しかし、RAIDとファイルシステムが分離されている場合、最悪の場合2ブロック読みだす必要があるのです。

ファイルシステムのサイズ変更

btrfs では、ファイルシステムをマウントした状態のままファイルシステムのサイズを縮小、拡大することができます。ファイルシステムの拡大をするにはHDDに空き容量が必要ですし、縮小しなければいけないシーンはあまりないので、有用な機能とはいえないかもしれません。

HDDの動的削除/追加

btrfs では、ファイルシステムをアンマウントすることなくHDD を動的に追加削除することができます。これは、容量が不足したファイルシステムの容量追加を容易にします。しかも、ファイルシステムをアンマウントする必要はありません。また、ホットスワップに対応しているSATAコネクタであれば、OSの再起動すらすることなくHDDを追加/削除ができ、壊れたHDDを簡単に交換できます。

スナップショット

btrfs では、書き込み可能なスナップショットが生成できる。読み込み不可のスナップショットを生成することもできるとされているが、現時点では実装されていないようだ。書き込みフラグを強制的に落とせばいいだけなので実装はそう難しくなさそうなので、実装されるのは時間の問題だろう。しかし、アーカイブとしての目的なら読み込み専用のスナップショットは便利だが、読み込み専用ゆえの不便さもある。スナップショットに対する書き込みについても当然 COW の原則が適用されるので、オリジナルのファイルに影響を及ぼすことはない。そのため、書き込み可能なスナップショットのデメリットはアーカイブ(その当時の状態を示す目的)に向かないぐらでいだ。逆に書き込み可能なスナップショットならではのユースケースを考えてみよう。

設定のバックアップ

OS の設定を変更する際に /etc 以下を git で管理したり tar でまとめる管理者は多いことだろう。しかし、git で管理するにしては設定ファイルは大げさすぎる。git は確かに便利だが変更とは直接関係のないファイルをどう扱うかが大変で、git を理解していない人が間違ったコマンドを打つと修復不能になるおそれがある。その点、ファイルシステムレベルでのスナップショットならとても簡単にこれが行える。ただし、現時点ではルートファイルシステムを btrfs にするには難ありなので、/etc 以下のデータを btrfs のサブボリュームにして自動的にマウントされるようにするなどのテクニックが必要だ。

アップデート対策

大企業のように、自社でリポジトリを管理していてしかもアップデートパッチが使っているハードウェアやソフトウェア上で不具合を起こさないかを確認する専門のスタッフたちがいない限り、事前にアップデートにより発生するであろう問題を予測することは困難である。しかも、もとの状態に戻すのは限りなく困難だ。しかし、スナップショットを使えばこれが容易にできる。最近では、yum のプラグインも開発されておりトランザクションごとにスナップショットを自動で作成してくれる機能があるようだ。自由に、任意の時点へロールバックできるというメリットはとてもうれしい。

仮想マシンの管理

仮想マシンを使用していると、しょっちゅうクラッシュすることがある。特に開発者の場合この問題は顕著だ。なぜなら、Windows を搭載した実機で試すには危険な COM コンポーネントの開発や、比較的 kernel に近くシステムのクラッシュを引き起こしやすい部分の開発を行う場合、仮想マシンは不可欠だ。仮想マシンイメージのバックアップをコピーで行うとすると、結構な時間がかかってしまうからクラッシュは避けたいところだが、スナップショットを用いればこの問題を一発で解決できてしまう。クラッシュしたら1つ前のスナップショットに戻せばいい。なにより、クリーンインストール後のスナップショットがあると便利だ。ウイルスの挙動を確認するハニーポットにもいいだろう。

課題

btrfs はとても便利なファイルシステムであるが、まったく課題がないわけではない。何よりも問題なのが、運用実績が少ないことである。しかも、現時点ではファイルシステムの整合性をチェックし修復するツールである fsck が完成していない。また、RAID5, RAID6 の実装ができていなかったり、まだ未完成部分が多い。また、コマンドはとてもわかりやすいので問題ないが逆に細かいところに手が届かないという問題もある。複雑なオプションを入れればいいという訳ではないが、これだけ自由度の高いファイルシステムであればなおオプションが欲しいところだ。また、一般ユーザー向けにはGUI側の対応も必要だろう。スナップショットを右クリックメニューに入れるなどできえばなおいい。GUIに対応する場合、スナップショットがサブボリューム単位でしか作成できないのが課題になりそうだ。

ファイルシステムの作成

btrfs のファイルシステムを作成するのはとても簡単です。

sudo mkfs -t btrfs /dev/sdb

このように、Linux の他のファイルシステム同様にフォーマットすることができます。しかし、オプションをつけずにフォーマットしても btrfs のメリットを享受することはできません。まずは、メタデータとデータの双方に RAID10 のアルゴリズムをて起用させましょう。

$sudo mkfs -t btrfs -m raid10 -d raid10 /dev/sdb

これで、作成されるファイルシステムのメタデータ、データ双方が RAID10 により冗長化されます。これは、推測ですがオブジェクトレベルでのRAIDアルゴリズムの適用により、1台のHDDでも冗長化されると思われます。ただし、ディスクの一部のセクタではなく全体が壊れてしまえば意味はありません。フォーマットは一瞬で完了します。本当にファイルシステムができているか確認してみましょう。

$sudo btrfs filesystem show
Label: none  uuid: 0eac1179-fc48-4457-85c2-4a9aec686d19
	Total devices 3 FS bytes used 203.53GB
	devid    1 size 931.51GB used 68.01GB path /dev/sdb

このように表示されれば問題なくフォーマットされています。それでは、早速マウントしてみましょう。

$sudo mkdir /mnt/btrfs
$sudo mount -t btrfs /dev/sdb /mnt/btrfs

こうすることで、/mnt/btrfs にマウントされます。ただ、権限が適切に設定されていないので書き込み権限がないと思われます。

$sudo chown ${USER}:{USER} /mnt/btrfs
$sudo chmod 770 /mnt/btrfs

sudo コマンドではなく、su コマンドで権限昇格すると環境変数 USER が "root" になってしまうため注意してください。適切に権限が設定されると、ファイルシステムの使用する準備は整いました。このファイルシステムに追加でディスクを追加していきたいところですが、動的にファイルシステムを成長させることができるという btrfs の機能を堪能するため、あえてこの時点でファイルをいくつか書き込んでみます。何もデータをもっていなければ、以下のようにして /usr/share 以下のファイルをコピーしてみるのもいいかもしれません。

$sudo cp -Rv /usr/share /mnt/btrfs/

このファイルのコピーが完了するのを待つ必要はありません。なぜなら、ディスクを追加をするのにファイルシステムのアンマウントをする必要はなく、しかも追加したいディスクがすでにOSにより認識されているか、ホットスワップにより認識させることができさえすればシステムの再起動もしなくてもよいのです。もちろん、ファイルのコピーという負荷のかかっている最中に HDD の追加を行う必要性というのもないわけですが、HDDの追加が容易であることが分かるはずです。

$sudo btrfs device add /dev/sdc /mnt/btrfs

このコマンドを実行は、あっという間に完了するはずです。おそらく、みなさんが想像する以上に HDD の追加が容易であることがわかるはずです。

$sudo btrfs filesystem show
Label: none  uuid: 0eac1179-fc48-4457-85c2-4a9aec686d19
	Total devices 3 FS bytes used 203.53GB
	devid    1 size 931.51GB used 68.01GB path /dev/sdb
	devid    2 size 931.51GB used  0.00GB path /dev/sdc

これで、ファイルシステムの追加は完了していますがディスク間の容量のバランスが取れていません。これでは、HDDが故障したときのリスクが大きすぎます。

$sudo btrfs filesystem balance /mnt/btrfs

これで、ファイルシステム間のバランスが取れます。このコマンドの完了にはとても時間がかかります。ちなみに、いままでこのページで使用してきたコマンドの実行結果は、でっち上げられているので一部オカシイ部分があるかもしれません。以下に、3枚の1TBディスクを用いた場合のバランスのとれた例をあげます。

$sudo btrfs filesystem show
Label: none  uuid: 0eac1179-fc48-4457-85c2-4a9aec686d19
	Total devices 3 FS bytes used 203.53GB
	devid    1 size 931.51GB used 68.01GB path /dev/sdc
	devid    2 size 931.51GB used 68.77GB path /dev/sdd
	devid    3 size 931.51GB used 68.76GB path /dev/sde

このように、ディスクの容量のバランスが取れていることが見て取れます。

個人用ツール
名前空間
変種
操作
案内
ツールボックス