Btrfs
- Btrfs (B-tree File System: 読み方は "バター FS", "ベター FS", "B木 FS", "ビーティーアール FS" など) は Linux 向けの実験的なコピーオンライトのファイルシステムで GPL でライセンスされています。Oracle Corporation によって2007年から開発が開始されました。2014年8月にはディスク上のフォーマットが固まっています。
Btrfs Wiki より:
- Btrfs は Linux 用の全く新しいコピーオンライト (COW) のファイルシステムです。先進的な機能を実装することを目指しつつ、障害耐性を持ち簡単に管理できることに焦点が置かれています。Btrfs は Oracle, Red Hat, Fujitsu, Intel, SUSE, STRATO やその他多くの人々によって共同で開発されており GPL でライセンスされていて誰でも貢献できるように開かれています。
インストール
Btrfs はデフォルトのカーネルに含まれており、ツール (btrfs-progs) は公式リポジトリから入手できます。GRUB, mkinitcpio, Syslinux には Btrfs のサポートがあるので追加の設定は必要ありません。
追加のパッケージ
- btrfs-progs には Btrfs ファイルシステムのエラーを修正できるツール btrfsck が含まれています。
- btrfs-progs-gitAUR はナイトリービルドです。
Btrfs の一般的な管理
以下は、新しい Btrfs ファイルシステム を作成する方法を示しています。ext3/4 パーティションを Btrfs に変換するには、Ext3/4 から Btrfs への変換 を見て下さい。パーティションレスなセットアップを使うには、パーティションレス Btrfs ディスク を見て下さい。
詳しくは mkfs.btrfs(8) を見て下さい。
新しいファイルシステムを作成する
Btrfs ファイルシステムは新規作成することも既存のファイルシステムから変換することも可能です。
パーティションをフォーマットするには次を実行してください:
# mkfs.btrfs -L mylabel /dev/partition
大きいブロックサイズをデータ・メタデータに使うには、下の例のように -n
スイッチを使って nodesize
の値を指定して下さい (例: 16KB ブロック):
# mkfs.btrfs -L mylabel -n 16k /dev/partition
複数のデバイスを入力して RAID を作成することもできます。サポートされている RAID レベルは RAID 0, RAID 1, RAID 10 などです。デフォルトではメタデータはミラーされデータはストライピングされます。より多くの情報が必要な場合、Using Btrfs with Multiple Devices を見てください。
# mkfs.btrfs [options] /dev/<part1> /dev/<part2>
使用済み・空き容量を表示する
/usr/bin/df
などの linux の一般的なユーザー空間ツールは Btrfs パーティションの空き容量について間違った報告をします。なぜならメタデータによって使用される予約済みのスペースを考慮しないからです。btrfs パーティションに問い合わせるときは /usr/bin/btrfs
を使うのが推奨されています。以下は df -h
を使った時と、btrfs filesystem df
を使った時の出力の例です:
$ df -h /
Filesystem Size Used Avail Use% Mounted on /dev/sda3 119G 3.0G 116G 3% /
$ btrfs filesystem df /
Data: total=3.01GB, used=2.73GB System: total=4.00MB, used=16.00KB Metadata: total=1.01GB, used=181.83MB
df -h
は 3.0GB 使用されているとしているのに対して btrfs filesystem df
はデータは 2.73GB だと報告しているのに気づいて下さい。これは Btrfs がスペースをプールに割り当てているためです。本当のディスク使用量は3つの 'used' を合計した値であり、df -h
による 3.0GB よりかは下回ります。
他にも大まかに使用容量を読み出すコマンドとして btrfs filesystem show
が使用できます:
# btrfs filesystem show /dev/sda3
空き容量の情報を取得する最新のコマンドは btrfs filesystem usage
です:
# btrfs filesystem usage
ファイルシステムの構成
コピーオンライト (CoW)
デフォルトでは Btrfs は全てのファイルに対して常に copy-on-write を使用します。書き込みはその場のデータを上書きしません; 代わりに、ブロックの修正されたコピーが新しい場所に書き込まれ、メタデータは新しい場所を指すように更新されます。実装の詳細や利点と欠点については Btrfs Sysadmin Guide セクション を見て下さい。
CoW の無効化
デフォルトでは、いついかなる時も、全てのファイルに対して btrfs は CoW を行います: 今までに存在していなかったファイルを書き込もうとした場合、データは空き領域に書き込まれて、ファイルシステムのメタデータブロックが CoW されます。"通常の"ファイルシステムでは、ファイルの一部を上書きした場合、置換先のデータに直接上書きがなされます。CoW ファイルシステムでは、新しいデータはディスクの空き容量に書き込まれて、それから、新しいデータを参照するようにファイルのメタデータが変更されます。元のデータはどこからも参照されなくなって始めて削除されます。
CoW にはアドバンテージがありますが、大きなファイルに小さなランダム書き込みを行うときのパフォーマンスについてはあまり良い影響を与えません。たとえ"コピー"を行わないときでもファイルを断片化させるからです。データベースファイルや仮想マシンイメージについては CoW を無効化することが推奨されます。
CoW を無効にする方法の一つは "nodatacow" オプションを使ってマウントすることです。しかしながら、これではファイルシステム全体で CoW を無効にすることになります。
ファイルやディレクトリ単体で CoW を無効化するには、次のコマンドを使って下さい:
$ chattr +C </dir/file>
以上のコマンドで CoW が無効化されるのはファイルの参照が一つしかない操作の場合に限られます。複数の参照がある場合 (例: cp --reflink=always
を使用したりファイルシステムのスナップショットが存在する場合)、CoW は依然として実行されます。
同じように、ファイルのコピー時に CoW を強制してスペースを節約するには次を使って下さい (デフォルトでは cp
を使った場合、実際にデータがコピーされます):
$ cp --reflink source dest
dest ファイルが変更されると、元から変更されたブロックだけがディスクに書き込まれます。cp を 'cp --reflink=auto' にするエイリアスを作ってもいいかもしれません。
圧縮
Btrfs は透過圧縮をサポートしています、これはパーティション上の全てのファイルが自動的に圧縮されることを意味します。このことはファイルの容量を減らすだけでなく、特に zstd アルゴリズム や lzo アルゴリズム を使う場合、一般的に パフォーマンスが向上 します。
圧縮は compress=arg
マウントオプションを使って有効にします。alg はzlib
、lzo
、zstd
、またはno
(圧縮しない場合)のいずれかです
。マウントオプションが追加された後に作成・変更されたファイルだけに圧縮が適用されます。ただし、btrfs filesystem defragment -calg
コマンドを使うことで既存のファイルに圧縮を適用することも簡単にできます (例えば ext3/4 から変換した後)。alg
は zlib
、lzo
、zstd
のいずれかです。zstd
を使ってファイルシステム全体を再圧縮するには、次のコマンドを実行してください:
# btrfs filesystem defragment -r -v -czstd /
空の Btrfs パーティションに Arch をインストールする時に圧縮を有効にするには、ファイルシステムをマウントする時に compress オプションを使います:
# mount -o compress=zstd /dev/sdxY /mnt/
設定の際、fstab でルートファイルシステムのマウントオプションに compress=zstd
を追加してください。
圧縮の種類と比率を表示する
compsize はファイルのリスト (または btrfs ファイルシステム全体) を受け取り、使用された圧縮タイプと有効な圧縮率を測定します。 非圧縮サイズは du(1) のような他のプログラムによって与えられる数値と一致しないかもしれません。なぜなら、たとえ何度も再リンクされていても、たとえその一部がもうどこにも使われていないけれどゴミ収集されていないとしても、全てのエクステントは一度にカウントされるからです。 これは compsize -x /
のような状況で便利で、btrfs でないサブディレクトリを探そうとして、実行全体が失敗するのを避けます。
サブボリューム
btrfs の機能のひとつにサブボリュームがあります。サブボリュームは基本的にファイルとディレクトリを保持している名前の付いた b 木です。root ツリーのツリーの中に inode を持ち、root 以外の所有者やグループも設定できます。サブボリュームは任意でブロックを割り当てることもできます。ブロックとファイルエクステントの全ては参照カウントでありスナップショットを可能にしています。仮想マシンの動的な容量拡張に似て、必要な時に必要な分だけのデバイス上の容量を使います。また、サブボリュームを異なったマウントオプションを使ってマウントすることでセキュリティの柔軟性を持たせることもできます。
サブボリュームを作成する
サブボリュームを作成するには:
# btrfs subvolume create /path/to/subvolume
サブボリュームを一覧する
現在のサブボリュームのリストを表示するには:
# btrfs subvolume list -p .
サブボリュームをマウントする
サブボリュームは subvol=/path/to/subvolume
や subvolid=objectid
マウントフラグを使うことでファイルシステムのパーティションと同じようにマウントできます。例えば、subvol_root
という名前のサブボリュームが存在したら /
にマウントすることができます。ファイルシステムのトップレベルにサブボリュームを作成して適切なマウントポイントにマウントすることで、伝統的なファイルシステムのパーティションと同じように使うことができ、スナップショットを使用してファイルシステムを前の状態に簡単に戻すことが可能です。
Snapper#推奨ファイルシステムレイアウト, Btrfs SysadminGuide#Managing Snapshots, Btrfs SysadminGuide#Layout などにサブボリュームを使用するファイルシステムレイアウトの例が存在します。
サブボリュームをルートとしてマウントする
サブボリュームをルートマウントポイントとして使用するには、rootflags=subvol=/path/to/subvolume
を使用して カーネルパラメータ 経由でサブボリュームを指定します。/etc/fstab
でルート・マウントポイントを編集し、マウント・オプションに subvol=
を指定します。または、サブボリュームの ID rootflags=subvolid=objectid
をカーネルパラメータとして使い、subvolid=objectid
を /etc/fstab
のマウントオプションとして指定することもできます。
デフォルトのサブボリュームを設定する
subvol=
マウントオプションが指定されていない場合、デフォルトのサブボリュームがマウントされます。
# btrfs subvolume set-default subvolume-id /.
サンプル:
# btrfs subvolume list .
ID 258 gen 9512 top level 5 path root_subvolume ID 259 gen 9512 top level 258 path home ID 260 gen 9512 top level 258 path var ID 261 gen 9512 top level 258 path usr
# btrfs subvolume set-default 258 .
リセット:
# btrfs subvolume set-default 0 .
スナップショット
詳しくは Btrfs Wiki SysadminGuide#Snapshots を見て下さい。
スナップショットを作成するには:
# btrfs subvolume snapshot source [dest/]name
スナップショットは再帰的ではありません、つまりサブボリューム内にある全てのサブボリュームはスナップショットでは空のディレクトリになります。
クォータ
Btrfs におけるクォータのサポートはクォータグループ (qgroup) を利用してサブボリュームレベルで実装されています: 各サブボリュームにはデフォルトで 0/<subvolume id> という形式でクォータグループが割り当てられています。必要であればクォータグループを作成することもできます。
クォータグループを使うにはまずクォータを有効にする必要があります:
# btrfs quota enable <path>
上記のコマンドを実行してから新しいサブボリュームを作成すると、グループによって制御が可能になります。既存のサブボリュームでも制御を行いたい場合、クォータを有効にしてから、<subvolume id> を使ってサブボリュームごとにクォータグループを作成して再スキャンしてください:
# btrfs subvolume list <path> | cut -d' ' -f2 | xargs -I{} -n1 btrfs qgroup create 0/{} <path> # btrfs quota rescan <path>
Btrfs のクォータグループはツリー構造になっていて、サイズ制限はクォータグループごとに設定し、ツリーに属しているサブボリュームに制限が課せられます。
クォータグループで設定できる制限は合計データ使用量・非共有のデータ使用量・圧縮データ使用量、あるいはそれらを組み合わせたものです。元のボリュームファイルを削除してコピーを残す場合、他のクォータグループの非共有制限が変わるため、ファイルのコピーや削除で制限に抵触する可能性があります。例えば、新しいスナップショットが元のサブボリュームの全てのブロックと同じデータを持っている場合、どちらかのサブボリュームだけで共通データを削除するともう片方のサブボリュームの制限に引っかかる可能性があります。
クォータグループに制限を設定するには、btrfs qgroup limit
コマンドを使います。合計使用量の制限や非共有制限 (-e
) または圧縮制限 (-c
) が設定できます。ファイルシステムの特定のパスにおける使用量や制限を表示するには:
# btrfs qgroup show -reF <path>
コミット間隔の設定
ファイルシステムにどのデータを書き込むかは BTRFS とシステム全体の設定によって決められます。BTRFS のデフォルトでは30秒のチェックポイントインターバルでファイルシステムに新しいデータが送られます。この間隔は後述のマウントオプションで調整可能です。
システム全体の設定もインターバルに影響を与えます。それには /proc/sys/vm/* 以下のファイルも含まれており、この wiki では扱っていません。Documentation/sysctl/vm.txt にこれらのファイルに関するカーネルドキュメントがあります。
SSD TRIM
discard
オプションを使ってマウントした場合、Btrfs ファイルシステムは TRIM コマンドをサポートしている SSD ドライブの空きブロックを自動的に開放します。
SATA 3.1 よりも古い場合、TRIM コマンドは同期的で、コマンドが実行されている間は全ての I/O がブロックされます。ファイルシステムの同期などによって、プチフリーズが発生する可能性があります。このような場合、discard
を使用する代わりに定期的な trim を有効にすることができます:
# systemctl enable fstrim.timer
SATA バージョンを確認するには次を実行:
# smartctl --info /dev/sdX
詳しくはソリッドステートドライブ#TRIM を参照。
使い方
スワップファイル
Btrfs の スワップファイル は Linux カーネル5.0 以降でサポートされています。[1] スワップファイルを初期化する適切な方法は、最初にファイルをホストする非圧縮、非スナップショットのサブボリュームを作成し、そのディレクトリに cd してから、長さゼロのファイルを作成し、No_COW
を設定することです。 属性を chattr で指定し、圧縮が無効になっていることを確認します。
# cd /path/to/swapfile # truncate -s 0 ./swapfile # chattr +C ./swapfile # btrfs property set ./swapfile compression none
詳細な設定については、 スワップファイルの作成 を参照してください。スワップファイルへの休止状態の構成については、Hibernation into swap file on Btrfsで説明されています。
デフラグメンテーション
Btrfs はオンラインデフラグをサポートしています。root フォルダのメタデータをデフラグするには、次を実行してください:
# btrfs filesystem defragment /
上のコマンドはファイルシステム全体のデフラグを行いません。詳しくは、btrfs wiki のこのページを見て下さい。
ファイルシステム全体をデフラグするには、次を実行してください:
# btrfs filesystem defragment -r -v /
RAID 機能
マルチデバイスファイルシステムを作成するとき、ファイルシステムに追加したデバイス全体で RAID0, RAID1, RAID10, RAID5, RAID6 を使うように指定することもできます。RAID レベルはデータとメタデータで別個に適用することができます。デフォルトでは、メタデータはシングルボリュームやマルチディスクの RAID1 で複製されます。
btrfs は raid0, raid1, raid10 のブロックペアで動作します:
raid0 - 2つのデバイスに分散されるブロックペア
raid1 - 2つのデバイスに書き込まれるブロックペア
マウント中に btrfs balance
コマンドを使って RAID レベルを変更することができます:
# btrfs balance start -mconvert=RAIDレベル -dconvert=RAIDレベル マウントポイント
ディスクが2つある場合、md-raid (mdadm) で定義する raid レベルと一致します。ディスクが3つ以上の場合は、md-raid とは全く異なるものになります。
例えば:
- md による raid1 の3つの 1TB ディスクを使って、1TB の空き容量で、2つのディスクを失ってもデータが消失しないようにすることが出来ます。
- data=raid1 の Btrfs ボリュームの3つの 1TB ディスクを使って、満杯になるまでほぼ 1.5TB のデータを保存することができます。ディスクが1つなくなってもデータは消失しません。
Btrfs はディスクに分散してブロックペアを配置するのにラウンドロビン方式を使っています。Linux 3.0 から,ブロックペアを分散する際に大きなディスクを優先するように quasi-round-robin 方式が使われています。これによって複数のディスクからディスクセットが出来ているときに raid0 や raid1 でほとんど (もしくは全て) の領域を効率的に利用することが可能になっています。例えば、1台の 1TB のディスクと2台の 500GB のディスクからなるセットで data=raid1 を使用すると 1TB のディスクには全てのブロックのコピーが、500GB のそれぞれのディスクにはブロックが交互に (ラウンドロビンで) 配置されます。完全な利用効率が実現されます。1TB のディスクと 750GB のディスク、500GB のディスクからなるセットでも同じことが行われますが、ファイルシステムは 750GB のディスクの 250GB が利用できないことを報告します。いつでも全ての領域を活用できるようにするには (最後に上げた例でも)、data=single を使って下さい (data=single は raid コントローラによって定義される JBOD と同じです)。詳しくは BTRFS FAQ を参照。
Scrub
Btrfs の scrub はオンラインのファイルシステムチェックツールです。ファイルシステム上の全てのデータとメタデータを読み込んで、チェックサムと RAID ストレージの重複コピーを使用してデータに破損がないか確認して修復を行います。
# btrfs scrub start / # btrfs scrub status /
systemd サービス
btrfs-progs パッケージには特定のマウントポイントをひと月毎にスクラブする btrfs-scrub@.timer
ユニットが付属しています。エンコードしたパスを指定してタイマーを有効化してください。例えば /
なら btrfs-scrub@-.timer
を、/home
なら btrfs-scrub@home.timer
を使います。
btrfs-scrub@.service
を起動することで手動でスクラブを実行することもできます (同じくエンコードしたパスを指定してください)。btrfs scrub
コマンドを手動で実行するのとは違って systemd サービスを使うことで journal にログが記録されます。
Balance
balance はファイルシステム上の全てのデータをアロケータに再度流し込みます。デバイスが追加されたり削除された場合にファイルシステム上のデータを再配置するために実行します。balance はデバイスが故障した場合に、冗長な RAID レベルのコピーを再生成します。
btrfs-progs-3.12 からバランシングはバックグラウンドプロセスになりました - 詳しくは man 8 btrfs-balance
を見て下さい。
# btrfs balance start / # btrfs balance status /
スナップショット
詳しくは Btrfs Wiki SysadminGuide#Snapshots を見て下さい。
スナップショットを作成するには:
# btrfs subvolume snapshot source [dest/]name
スナップショットは再帰的ではありません、つまりサブボリューム内にある全てのサブボリュームはスナップショットでは空のディレクトリになります。
送信/受信
サブボリュームは send
コマンドを使って標準出力やファイルに送信することができます。Btrfs の receive
コマンドにパイプで渡すことで非常に便利に使うことが可能です。例えば、/root_backup
という名前のスナップショットを /backup
に送信するには以下のコマンドを実行します:
# btrfs send /root_backup | btrfs receive /backup
送信するスナップショットは読み取り専用である必要があります。上記のコマンドは外部デバイスにサブボリュームをコピーするのにも使えます (例えば上の /backup
を USB ディスクにマウント)。
また、スナップショットの差分だけを送信することも可能です。例えば、上記のように root_backup
のコピーを送信したことがある場合、root_backup_new
という名前の読み取り専用のスナップショットを新しく作成してから、増加差分だけを /backup
に送信するには:
# btrfs send -p /root_backup /root_backup_new | btrfs receive /backup
これで root_backup_new
という名前の新しいサブボリュームが /backup
に作成されます。
差分バックアップをしたり自動的にバックアップを行うツールは Btrfs Wiki's Incremental Backup を見てください。
重複排除
コピーオンライトを使用した場合、Btrfs は実際にはデータをコピーしないでファイルやサブボリュームをコピーできます。ファイルに変更が加えられたときに新しい本当のコピーが作成されます。重複排除はさらに共通部分が存在するデータブロックを認識して、コピーオンライトと同じようにエクステントにまとめてしまいます。
Btrfs パーティションの重複排除に使用するツールについては 上流の Wiki エントリ を見てください。duperemove, bedupAUR, btrfs-dedup などが存在します。rmlint あるいは jdupesAUR などを使うことでファイルベースでデータの重複排除を行うこともできます。
Btrfs の開発者はインバンド (同期的・インライン) 重複排除に取り組んでおり、新しいデータがファイルシステムに書き込まれたときに重複排除が実行されます。現在のところ実験的な機能としてツリー外で開発されています。新しい機能をテストしてみたい場合は カーネルの wiki ページ を参照してください。
既知の問題
試す前に、いくつかの制限を知っておく必要があります。
暗号化
Btrfs には暗号化のサポートが組み込まれていませんが、この [2] は将来的に提供される可能性があります。 ユーザーは、 mkfs.btrfs
を実行する前にパーティションを暗号化できます。 dm-crypt/スワップを使用したsystem#Btrfsサブボリューム全体の暗号化 を参照してください。
既存の Btrfs ファイルシステムは EncFS や TrueCrypt のようなものを使用できますが、おそらく Btrfs の機能の一部はありません。
TLP
TLP を使用するには、ファイルシステムの破損を回避するために特別な予防措置が必要です。 詳細については、 TLP の Btrfs セクション を参照してください。
btrfs チェックの問題
ツールbtrfs check
には既知の問題があるため、セクション #btrfscheck をよく参照してから実行してください。
ヒントとテクニック
パーティションレス Btrfs ディスク
Btrfs は、 subvolumes を使用してパーティションをシミュレートし、 MBR または GPT パーティションスキームを置き換えて、データストレージデバイス全体を占有できます。 ただし、別の方法で作成された既存の パーティション で create a Btrfsfilesystem を実行するためにパーティションレスセットアップを使用する必要はありません。 パーティションレスのシングルディスクセットアップには、いくつかの制限があります。
- 他の ファイルシステム を同じディスク上の別のパーティションに配置することはできません。
- バージョン5.0より前の Linux カーネルを使用している場合、 スワップ領域 は使用できません。 Btrfs はスワップファイル 5.0 より前をサポートしておらず、 スワップパーティション を作成する場所もありませんでした。
- UEFI を使用して起動することはできません。
既存のパーティションテーブルを Btrfs で上書きするには、次のコマンドを実行します:
# mkfs.btrfs /dev/sdX
たとえば、 /dev/sda1
ではなく /dev/sda
を使用します。後者は、パーティショニングスキーム全体を置き換えるのではなく、既存のパーティションをフォーマットします。ルートパーティションは Btrfs なので、 btrfs
がカーネルに組み込まれていることを確認するか、 btrfs
を mkinitcpio.conf#MODULES と initramfsを再生成する に入れてください。
ブートローダ を、 マスターブートレコード を備えたデータ記憶装置の場合と同様にインストールします。Syslinux#手動インストール または GRUB/Tips and tricks#パーティションまたはパーティションレスディスクへのインストール を参照してください。 /sysrootをマウントできませんでした。
が原因でカーネルがブートしない場合は、 /etc/default/grub
に GRUB_PRELOAD_MODULES="btrfs"
を追加して、 grub 設定 (GRUB#メインの構成ファイルを生成する) を生成してください。
Ext3/4 から Btrfs への変換
インストール CD から起動し、次の手順で変換します:
# btrfs-convert /dev/partition
パーティションをマウントし、ファイルをチェックして変換をテストします。 変更を反映するために、必ず /etc/fstab
を変更してください( type を btrfs
に、 fs_passno [最後のフィールド] を 0
Btrfs は起動時にファイルシステムチェックを行わないため)。 また、パーティションの UUID が変更されることに注意してください。したがって、 UUID を使用する場合は、それに応じて fstab を更新してください。 chroot
をシステムにインストールし、 GRUB メニューリストを再構築します (既存の Linux からインストール および GRUB の記事を参照)。 ルートファイルシステムを変換する場合、 chroot されたまま mkinitcpio -p linux
を実行して initramfs を再生成しないと、システムが正常に起動しません。 'unknown filesystem' で grub でスタックした場合は、 grub-install /dev/partition
で grub を再インストールし、構成も再生成してください grub-mkconfig -o /boot/grub/grub.cfg
問題がないことを確認したら、バックアップ ext2_saved
サブボリュームを削除して変換を完了します。 これがないと ext3/4 に戻れないことに注意してください。
# btrfs subvolume delete /ext2_saved
最後に balance ファイルシステムでスペースを再利用します。
以前にインストールされた一部のアプリケーションは、 Btrfs に適合させる必要があることに注意してください。 特に TLP#Btrfs はファイルシステムの破損を避けるために特別な注意が必要です。
チェックサムのハードウェアアクセラレーション
Btrfs のチェックサムでハードウェアアクセラレーションが使われているかどうか確認するには:
$ dmesg | grep crc32c
Btrfs loaded, crc32c=crc32c-intel
crc32c=crc32c-generic
と表示された場合、ルートパーティションが Btrfs であるため、ハードウェアアクセラレーションを使うにはカーネルに crc32c-intel
を組み込む必要があります。mkinitcpio.conf に crc32c-intel
を追加するだけでは機能しません。
ファイルシステム破損のリカバリ
btrfs-check はマウントされているファイルシステムでは使えません。ライブ USB から起動しないで btrfs-check を使えるようにするには、初期 RAM ディスクに以下のように追加してください:
/etc/mkinitcpio.conf
BINARIES="/usr/bin/btrfs"
設定したら mkinitcpio を使って initramfs を再生成してください。
起動に問題が発生したら、ユーティリティを使って修復することができます。
詳しくは Btrfs Wiki を参照。
スナップショットから起動する
スナップショットをブートするためには、セクション サブボリュームをルートとしてマウントする で説明されているように、サブボリュームをルートパーティションとしてマウントする場合と同じ手順が適用されます。スナップショットはサブボリュームのようにマウントできます。
- GRUB を使用している場合、grub-btrfs または grub-btrfs-gitAUR を使用して構成ファイルを再生成すると、自動的に btrfs スナップショットをブートメニューに取り込むことができます。
- rEFInd を使用している場合は、
refind-btrfs.service
を 有効 にして開始後に、refind-btrfsAUR を使用してブートメニューに btrfs スナップショットを自動的に取り込むことができます。
systemd-nspawn で Btrfs サブボリュームを使う
Systemd-nspawn#Btrfs のサブボリュームをコンテナのルートとして使うや Systemd-nspawn#コンテナの一時的な Btrfs スナップショットを使うを見てください。
アクセス時間のメタデータ更新を削減
Btrfs は書き込み時にコピーの性質を持つため、ファイルにアクセスするだけでメタデータのコピーと書き込みを開始します。アクセス時間の更新頻度を減らすと、この予期しないディスク使用がなくなり、パフォーマンスが向上する可能性があります。使用可能なオプションについては、 atime オプション を参照してください。
外付けドライブへの増分バックアップ
以下のパッケージは btrfs send
と btrfs receive
を使って、外部ドライブに増分バックアップを送信します。実装や機能、要件の違いを見るにはそれぞれのドキュメントを参照してください。
- btrbk — Btrfs サブボリュームのスナップショットとリモートバックアップを作成するためのツール。
- buttersink — Buttersink は Btrfs スナップショット用の rsync のようなものです。
- snap-sync — Snapper スナップショットを使用して、外付けドライブまたはリモートマシンにバックアップします。
- snapsync — Snapper の同期ツール。
以下のパッケージでは、Snapper のスナップショットを Btrfs 以外のファイルシステムへバックアップすることができます。
- snapborg — Snapper スナップショットを borg バックアップと統合する borgmatic のようなツール。
トラブルシューティング
一般的なトラブルシューティングについては Btrfs Problem FAQ を見て下さい。
GRUB
パーティションオフセット
GRUB は Btrfs パーティションを起動することができますが、そのモジュールは ext4 などよりも大きく、grub-install によって作成される core.img
が MBR と最初のパーティションの間に収まらない可能性があります。GPT を使うか、最初のパーティションの前に数 MB の空きスペースを作ることでこの問題を解決できます。
root が見つからない
RAID セットアップから起動した時にエラー error no such device: root
が表示される場合、/usr/share/grub/grub-mkconfig_lib
を編集して echo " search --no-floppy --fs-uuid --set=root ${hints} ${fs_uuid}"
からクォートを削除してください。grub の設定を再生成すればエラーを出さずに起動できるはずです。
マウントがタイムアウト
特に大きな RAID1 アレイでは、ブート中にマウントがタイムアウトして、次のようなジャーナルメッセージが表示されることがあります。
Jan 25 18:05:12 host systemd[1]: storage.mount: Mounting timed out. Terminating. Jan 25 18:05:46 host systemd[1]: storage.mount: Mount process exited, code=killed, status=15/TERM Jan 25 18:05:46 host systemd[1]: storage.mount: Failed with result 'timeout'. Jan 25 18:05:46 host systemd[1]: Failed to mount /storage. Jan 25 18:05:46 host systemd[1]: Startup finished in 32.943s (firmware) + 3.097s (loader) + 7.247s (kernel)> Jan 25 18:05:46 host kernel: BTRFS error (device sda): open_ctree failed
この問題は、fstab のシステム固有のマウントオプション x-systemd.mount-timeout
で長いタイムアウトを指定することで簡単に回避することが可能です。例:
/dev/sda /storage btrfs rw,relatime,x-systemd.mount-timeout=5min 0 0
BTRFS: open_ctree failed
2014年11月現在、mkinitcpio.conf
で btrfs
フックを使用してマルチデバイスの Btrfs を使っている場合に以下のエラーが発生するというバグが systemd か mkinitcpio のどちらかに存在します:
BTRFS: open_ctree failed mount: wrong fs type, bad option, bad superblock on /dev/sdb2, missing codepage or helper program, or other error In some cases useful info is found in syslog - try dmesg|tail or so. You are now being dropped into an emergency shell.
/etc/mkinitcpio.conf
の HOOKS
行から btrfs
を削除して代わりに MODULES
行に btrfs
を追加することで解決します。修正を施したら mkinitcpio -p linux
で initramfs を再生成して (必要ならプリセットを調整します) 再起動してください。
詳細は フォーラムスレッド や FS#42884 を見て下さい。
デバイスが存在しない raid アレイをマウントしようとしたときも同じエラーが表示されます。その場合は /etc/fstab
に degraded
マウントオプションを追加してください。ルートパーティションがアレイ上にある場合、カーネルパラメータに rootflags=degraded
を追加してください。
btrfs check
btrfs check コマンドを使うことでアンマウントされた Btrfs ファイルシステムをチェックしたり修復することが可能です。ただし、この修復ツールはまだ開発中であり、特定のファイルシステムエラーは修復することができません。
詳しくは Btrfsck を参照。
参照
- 公式サイト
- パフォーマンス関連
- その他
- Funtoo Wiki Btrfs Fun
- Avi Miller presenting Btrfs at SCALE 10x, January 2012.
- Summary of Chris Mason's talk from LFCS 2012
- Btrfs: stop providing a bmap operation to avoid swapfile corruptions 2009-01-21
- Doing Fast Incremental Backups With Btrfs Send and Receive