Btrfs/ja

Btrfs は、ファイルシステムです. ]]Btrfs は Oracle、Red Hat、富士通、Intel、SUSE、STRATO などによって共同で開発されており、GPL の条件下でライセンスされて広く貢献を受け入れています.

特徴
Ext4 が安全確実で、広い領域をもつ巨大なファイルシステムも扱えるのにもかかわらず、なぜ Btrfs に切り替えるのでしょうか. たしかに Btrfs は未だ試験的なものと思われており、安定性の向上途上です. しかし、Linux システムのデフォルトのファイルシステムとなる時が近づきつつあります. Linux のディストリビューションのなかには、最新のリリースにおいて既に Btrfs に切り替え始めたものもあります. Btrfs は、ZFS にも備わっている一般的な先進機能に対応しています. こうした機能は、 BSD 系ディストリビューションや NAS 機器において ZFS の人気が高くなっている理由でもあります.


 * コピーオンライト (CoW) とスナップショット - "ホット" なファイルシステムや仮想マシン (VM) からでさえも、増分バックアップを容易にします.
 * ファイルレベルチェックサム - ファイル毎のメタデータがチェックサムを含み、エラーの検出と修復に使用されます.
 * 圧縮 - ファイルは動的に圧縮・展開され、読み込み性能を向上させます.
 * 自動デフラグメンテーション - ファイルシステムは使用中に、バックグラウンドスレッドによって調整されます.
 * サブボリューム - 複数のファイルシステムは、それぞれのパーティションの中に入れて使う代わりに、単一の容量プールを共有できます.
 * RAID - Btrfs は固有の RAID 実装を持っており、RAID を行うのに LVM あるいは は必要ではありません. 現時点では RAID 0、1、10 がサポートされています; RAID 5 と 6 は不安定と見られています.
 * パーティションは任意です - Btrfs はパーティションに入れて使うことができる一方で、生デバイス を直接使用する能力も持っています.
 * データ重複排除 - 限定的なデータ重複排除サポートを持っています; しかしながら、重複排除は将来的に Btrfs の標準的機能となる予定です. これにより、Btrfs はバイナリ差分によってファイル比較を行うことで、容量を節約できます.

将来的には、新しいクラスタ化ファイルシステムが、コピーオンライトやその他オブジェクトストアのための先進的機能を持つ Btrfs をすぐさま活用するでしょう. Ceph は、とても将来性があり Btrfs を活用できるクラスタ化ファイルシステムの一例です.

カーネル
Btrfs に対応するには、つぎのカーネルオプションを有効にしてください:

Emerge
パッケージには、 Btrfs を扱うために必要なユーティリティが入っています.

使い方
Btrfs の長いコマンドをタイプすることはすぐに手間になるでしょう. それぞれのコマンド（最初の コマンド以外）はとても短い命令に短縮できます. この方法は、コマンドラインから作業するときにタイプする文字数を減らすのに役立ちます.

例えば、 にあるファイルシステムをデフラグするには、長いコマンドは次のようになります:

Shorten each of the longer commands after the command by reducing them to their unique, shortest prefix. In this context, unique means that no other commands will match the command at the command's shortest length. The shortened version of the above command is:

で始まる コマンドは他にありません;   が唯一です. コマンドの下で、 サブコマンドも同様です.

作成
パーティションを Btrfs で作成するには:

上の例の、 をフォーマットしたいパーティション番号で、  をフォーマットしたいディスクレターで置き換えてください. 例えば、システムの 1 番目のディスクの 3 番目のパーティションを Btrfs でフォーマッしたい場合には、次を実行してください:

マウント
ファイルシステムを作成したら、さまざまな方法でマウント可能です:


 * - 手動マウント.
 * - にマウントポイントを定義することで、システム起動時に自動でマウントされます.
 * Removable media - 必要に応じた自動マウント（USB ドライブに便利です）.
 * AutoFS - ファイルシステムアクセス時に自動マウント.

ext* ベースファイルシステムから変換する
ユーティリティを使用して、ext2、ext3、ext4 ファイルシステムを Btrfs に変換することができます.

次の手順はアンマウントされたファイルシステムの変換のみサポートしています. ルートパーティションを変換するためには、システムレスキューディスク（SystemRescueCD は上手く働きます）で起動してから、ルートパーティションに対して変換コマンドを実行してください.

まず、マウントポイントを確実にアンマウントしてください:

適切な ツールを使用してファイルシステムの整合性を確認してください. 次の例ではファイルシステムは ext4 としています:

を使用して、ext* フォーマットされたデバイスを Btrfs フォーマットされたデバイスに変換してください:

デバイスがフォーマットされたら、忘れずに を編集して、ファイルシステムのカラムを ext4 から Btrfs に変更してください:

デフラグ
Btrfs の機能のひとつに、オンラインでのデフラグメンテーションがあります. ルート Btrfs ファイルシステムをデフラグするには、次を実行してください:

マウントオプションはデフォルトの挙動をオンラインデフラグに設定します.

圧縮
Btrfs は zlib、lzo、zstd (v5.1.0) 圧縮アルゴリズムを使用した透過的圧縮をサポートしています.

ファイルの属性を設定することで特定のファイルのみ圧縮することも可能です:

マウントオプションは、新しく作成されたファイルをすべて圧縮するように、デフォルトの振る舞いを設定します. lzo 圧縮を利用してファイルシステム全体を再圧縮するには、次のコマンドを実行してください:

CPU とディスク性能によっては、lzo 圧縮を使うと全体のスループットが向上するかもしれません.

lzo の代わりに zlib または zstd 圧縮アルゴリズムを使用することもできます. zlib は遅いですが高い圧縮率を持ち、zstd は両者の間でいい比率となっています.

ファイルシステム全体で zlib 圧縮を強制するには:

zstd 圧縮を有効化するには、上の例の zlib の部分を zstd に置き換えてください.

圧縮レベル
カーネルバージョン 4.15.0 以降 、zlib 圧縮はレベルを 1-9 の間で設定することができます. カーネルバージョン 5.1.0 以降、zstd はレベル 1-15 の間で設定することができます. 例えば、マウント時に zlib を最高圧縮に設定するには:

または最低圧縮に設定するには:

また、再マウントすることで圧縮率を調節するには:

圧縮率は を開いて、または次のコマンドを使用して最新の  の出力を確認することで、見ることができるはずです.

fstab を圧縮に対応させる
ドライブを再マウント、またはデータを圧縮するように調整したら、 ファイルに適切な変更を加えるのを忘れないでください. この例では、マウント時に zstd 圧縮がレベル 9 に設定されます:

圧縮率とディスク使用量
や など、使用中および空き容量を確認するための一般的なユーザ空間ツールは、Btrfs パーティションに対しては不正確な結果を返す場合があります. これは、例えば ext2/3/4 などと比較して、ファイルの書き込みがどのように行われるかに Btrfs 固有の設計の違いがあるためです.

それゆえ、btrfs のユーザ空間ツール  が提供する du/df 代替を利用することを推奨します. 加えて sys-fs/compsize パッケージに含まれる ツールは、圧縮率と圧縮されたファイルのディスク使用量を考慮した追加情報を提供するので、役に立つでしょう. 次の例は、 の下にマウントされた btrfs パーティションに対して、これらのツールを使用する例です.

複数のデバイス (RAID)
Btrfs は RAID を形成するために、複数のブロックデバイスとともに使用することができます. Btrfs を使用して複数のデバイスにまたがるファイルシステムを作成するのは、 を使用して作成するのと比較して、作成時に初期化にかかる時間が不要なため、とても簡単です.

Btrfs はデータとメタデータを分離して扱います. マルチデバイスファイルシステムを使うときには、これに留意しておくことが重要です. データとメタデータのブロックグループに個別のプロファイルを使用することができます. 例えば、メタデータは複数のデバイスをまたいだ RAID1 として構成する一方で、データは RAID5 として構成する、ということが可能です. RAID5 は最低でも 3 個のブロックデバイスを必要とするため、このプロファイルは 3 個以上のブロックデバイスを使用するときに可能なものです.

この種のプロファイルは、すべてのデバイスにメタデータを持たせることによる冗長性と、データをデバイスをまたいでストライピングすることで読み込み速度を向上させるメリットを提供します. このプロファイルのデメリットは、メタデータのための必要以上の容量と、RAID5 がパリティビットを使用することによるデータブロックへの書き込み速度の低下です.

作成
最も簡単な方法は、複数のデバイスにまたがるファイルシステムを作成するために、パーティションで分けられていない複数のブロックデバイス全体を使用する方法です. 例えば、2 個のデバイスをまたいで RAID1 モードのファイルシステムを作成するには:

変換
RAID プロファイル間の変換は balance サブコマンドによって行えます. 例えば、現在 3 個のブロックデバイスが RAID1 で構成されて、 にマウントされているとします. 次のコマンドで、このプロファイルに含まれるデータを RAID1 から RAID5 に変換することができます:

ファイルシステムがオンラインで使用中でも、変換を行うことができます. Btrfs で利用可能な RAID モードは RAID0、RAID1、RAID5、RAID6、そして RAID10 を含みます. さらなる情報については 上流の BTRFS wiki をご覧ください.

追加
既存のマルチデバイスファイルシステムに、追加のデバイスを足すことができます. 以下の削除のセクションに従ってください.

安全にデバイスを取り除くための、より危険な、しかしより速いもうひとつの方法は、システムをシャットダウンして (または、システムがホットスワップ可能なドライブをサポートしている場合は、ファイルシステムをアンマウントするだけで済みます)、交換されるデバイスを物理的に切断して取り除き、新しいデバイスに交換し、(必要であれば) システムを起動することです.

メモ: 電源を切って再投入されたシステムは、デバイスがプールから物理的に取り除かれていることにより、マルチデバイスファイルシステムのマウントに失敗するでしょう.

システムが起動したら、 でマルチデバイスファイルシステムをマウントして、新しいデバイスを追加するための次のステップを実行してください.

デバイスが再度追加されたら、新しく追加されたデバイスにもまたがってデータが分散されるように、ファイルシステムを再平衡化する必要があります:

デバイスパスによる指定
サブコマンドを使用して、ブロックデバイス（ディスク）をマルチデバイスファイルシステムから取り除くことができます:

デバイス ID による指定
usage サブコマンドを使用してデバイス ID を特定してください:

次に、デバイスを取り除くためにデバイス ID を使用してください. 次の例では が取り除かれます:

リサイズ
btrfs パーティションは、組み込みの resize サブコマンドを使用して、オンラインにリサイズすることができます. 例えば、rootfs に 50 ギガバイトの領域を追加するには:

このコマンドは、利用可能なすべての領域を埋めることもできます:

サブボリューム
上の特徴リストで書いた通り、Btrfs はサブボリュームを作成することができます. サブボリュームはデータをより良く整理し管理するために使用することができます. サブボリュームはスナップショットと組み合わせると特に強力になります. Btrfs サブボリュームと、Logical Volume Management (LVM) によって作成されたサブボリュームの間には重要な違いがあります. Btrfs サブボリュームはブロックレベルデバイスではなく、POSIX ファイル名前空間です. サブボリュームはファイルシステム上の好きな場所に作成することができ、ひとつの落とし穴を除いて、システム上の他のディレクトリと同様に振る舞います. 落とし穴とは、サブボリュームはマウント・アンマウントできるという点です. サブボリュームはネストすることができて（サブボリュームの中にサブボリュームを作成できて）、簡単に作成・削除できます.

作成
サブボリュームを作成するには、Btrfs ファイルシステムの名前空間の中で次のコマンドを実行してください:

をお好みの作成先とサブボリューム名で置き換えてください. 例えば、Btrfs ファイルシステムが に存在する場合、次のコマンドを使ってその中にサブボリュームを作成することができます:

一覧
作成されたサブボリュームを確認するには、 コマンドに Btrfs ファイルシステムの場所を続けて使用してください. カレントディレクトリが Btrfs ファイルシステム内のどこかである場合、次のコマンドはそのファイルシステムに存在するサブボリュームを表示します:

上のコマンド例で作成されたマウントポイントに、サブボリュームを持つ Btrfs ファイルシステムが存在する場合、list コマンドからの出力は次のようになるでしょう:

削除
All available subvolume paths in a Btrfs filesystem can be seen using the list command above.

サブボリュームは、 コマンドにサブボリュームへのパスを続けて使用することで、適切に削除することができます. Btrfs ファイルシステム内で利用可能なサブボリュームパスの一覧は、上の list コマンドを使用して確認することができます.

上と同様に、 を実際に削除するサブボリュームへのパスで置き換えてください. 上の例で使用されているサブボリュームを削除するには、次のコマンドを実行します:

スナップショット
スナップショットは、データおよびメタデータを他のサブボリュームと共有するサブボリュームです. これは Btrfs のコピーオンライト (CoW) の能力により実現されています. スナップショットは複数の目的に使用することができ、そのうちのひとつは、特定の時点でのファイルシステム構造のバックアップを作成することです.

ルートのファイルシステムが Btrfs であるときには、  コマンドを用いてスナップショットの作成が可能です:

Btrfs でフォーマットされたルートファイルシステムの、タイムスタンプ付きスナップショットバックアップを作成するために、以下の短いシェルスクリプトを定時 cron ジョブに追加することができます. タイムスタンプの形式はユーザの好みに応じて調節できます.

マウント
サブボリュームは、それが作成された場所とは別の場所にマウントすることができ、またユーザはサブボリュームをマウントしないことを選ぶこともできます. 例えば、ユーザが Btrfs ファイルシステムを に作成し、 と  サブボリュームを作成したとします. このとき、元のトップレベルサブボリュームをマウントしないまま、2 個のサブボリュームをそれぞれ と  にマウントすることさえできます. その結果、各サブボリュームのトップレベルサブボリュームからの相対パスが、実際のパスとは異なる場所にある構成となります.

サブボリュームをマウントするには、次のコマンドを実行してください. ここで  は、  コマンドによって得られる、サブボリュームのトップレベルサブボリュームからの相対パスです:

同様のパラメータでファイルシステムテーブルを更新して、Btrfs サブボリュームをマウントさせることができます:

ファイルシステムチェック
故障したディスクや破損したデータがある場合、ファイルシステムチェックを実行する必要があるかもしれません. 典型的にはファイルシステムチェックのコマンドは で始まるコマンドで処理されますが、btrfs ファイルシステムに関しては、チェックは  サブコマンドによって処理されます:

マルチデバイスファイルシステムのマウントに失敗する
マルチデバイスファイルシステムから、行儀の悪い方法でデバイスを除去してしまった場合、その後ファイルシステムをマウントしようとすると失敗するでしょう:

この種のマウント失敗は、マルチデバイスファイルシステムから 1 つまたは複数のデバイスが欠けていることによって発生することがあります. 欠けたデバイスは、 サブコマンドを使用することで検出できます. 以下の例では、 はまだマルチデバイスファイルシステムに接続されているデバイスのひとつです:

欠けているデバイスは、以下のコマンドを使ってファイルシステムから行儀悪く抜けてしまったのかもしれません:

VM のディスクイメージで使用する
仮想マシンのディスクイメージで Btrfs を使用する場合は、IO 性能を向上させるために、ディスクイメージのコピーオンライトを無効化するのが良いでしょう. この効果は、新しく作成されるファイルに対してのみ発揮されます. 特定のディレクトリの中で作成されるすべてのファイルに対して CoW を無効化することもできます. 例えば、 コマンドを使用して:

空き領域キャッシュをクリアする
マウントオプションを指定してファイルシステムをマウントすることで、Btrfs 内の空きのキャッシュ領域を開放することが可能です. 例えば:

Btrfs がメモリを食い潰している (ディスクキャッシュ)
When utilizing some of Btrfs' special abilities (like making many  copies or creating high amounts of snapshots), a lot of memory can be consumed and not freed fast enough by the kernel's inode cache. This issue can go undiscovered since memory dedicated to the disk cache might not be clearly visible in traditional system monitoring utilities. The utility (available as part of the  package) was specifically created to determine how much memory kernel objects are consuming:

inode キャッシュが過剰なメモリを消費している場合、 ファイルに整数値を echo することで、カーネルにキャッシュを破棄するように手動で指示することができます.

安全のために、そしてカーネルが解放できるメモリの最大量を決定するのを助けるために、下の コマンドを実行する前に  を確実に実行してください.

おそらくほとんどの場合、Btrfs ユーザはスラブオブジェクト (dentries と btrfs_inodes) だけを再利用するために、 したいでしょう.

ディスクキャッシュ全体 (スラブオブジェクトとページキャッシュ) をクリアするには、代わりに を使用してください:

カーネルスラブについてのさらなる情報は、この dedoimedo ブログエントリで見つかります.

Btrfs のマウントが mount: unknown filesystem type 'btrfs' を返して失敗する
以下の解決策は、Stack Exchange での Tim によるオリジナルの解決策からヒントを得たものです: genkernel を使用する代わりに、手動でカーネルをビルドしてください:

Btrfs ルートが起動しない
下のコマンドで作成された Genkernel の initramfs は btrfs をロードしません:

モジュールとしてではなく、カーネルに組み込んで btrfs サポートをコンパイルするか、initramfs を生成するのに Dracut を使用してください.

関連項目

 * Btrfs snapshots - ファイルが変更されたときにスナップショットを作成するスクリプト
 * Btrfs/System Root Guide - システムルートのサブボリュームを含むサブボリュームの集合として、Btrfs ファイルシステムを使用する.
 * Btrfs native system root guide - システムのルートとして Btrfs ファイルシステムのサブボリュームを使うための、代替のガイド.
 * Samba shadow copies - Samba を使用して、シャドーコピーを Windows クライアントに '以前のバージョン' として公開する.
 * Samba shadow copies - Samba を使用して、シャドーコピーを Windows クライアントに '以前のバージョン' として公開する.
 * Samba shadow copies - Samba を使用して、シャドーコピーを Windows クライアントに '以前のバージョン' として公開する.

外部の情報

 * https://wiki.debian.org/Btrfs - Debian wiki 内の記事
 * https://wiki.archlinux.org/index.php/Btrfs - ArchWiki 内の記事
 * http://www.funtoo.org/BTRFS_Fun - Funtoo wiki 内の BTRFS Fun 記事
 * http://marc.merlins.org/perso/btrfs/post_2014-05-04_Fixing-Btrfs-Filesystem-Full-Problems.html - いくつかの状況における、Btrfs ファイルシステムのニッチな問題を修復するためのヒントと小技.