Btrfs

提供: ArchWiki
2022年3月11日 (金) 19:49時点におけるKgx (トーク | 投稿記録)による版 (→‎サブボリューム: リンクを追加)
ナビゲーションに移動 検索に移動

関連記事

Btrfs Wiki より:

Btrfs は、フォールトトレランス、修復、および簡単な管理に重点を置きながら、高度な機能を実装することを目的とした Linux 用の最新のコピーオンライト(CoW)ファイルシステムです。複数の企業で共同開発された Btrfs は、GPL に基づいてライセンスされており、誰からの寄付も受け付けています。
警告: Btrfs には実験的な機能が存在します。詳しくは Btrfs Wiki の StatusIs Btrfs stable?Getting started などを見てください。#既知の問題も参照。

目次

準備

ユーザースペースのユーティリティについては、基本的な操作に必要な btrfs-progs パッケージを インストール してください。

Btrfs ファイルシステムから起動する必要がある場合 (つまり、カーネルと initramfs が Btrfs パーティションにある場合)、あなたの ブートローダー が Btrfs をサポートしているか確認してください。

ファイルシステムの作成

以下は、新しい Btrfs ファイルシステム を作成する方法を示しています。ext3/4 パーティションを Btrfs に変換するには、Ext3/4 から Btrfs への変換 を見て下さい。パーティションレスなセットアップを使うには、パーティションレス Btrfs ディスク を見て下さい。

詳しくは mkfs.btrfs(8) を見て下さい。

単一デバイス上のファイルシステム

パーティション /dev/partition に Btrfs ファイルシステムを作るには、次のようにします。

# mkfs.btrfs -L mylabel/dev/partition

メタデータの Btrfs のデフォルトのノードサイズは 16KB ですが、データのデフォルトのセクターサイズはページサイズと同じで、自動検出されます。メタデータに大きなノードサイズを使用するには(セクターサイズの倍数である必要があり、最大 64KB が許可されます)、この例に示すように、-n スイッチを介して nodesize の値を指定します 32KB ブロックの使用例:

# mkfs.btrfs -L mylabel -n 32k /dev/partition
ノート: mkfs.btrfs(8) § OPTIONS によると、"[a]ノードサイズが小さいほど断片化は増加しますが、bツリーが高くなり、ロックの競合が少なくなります。ノードサイズが大きいほど、メタデータブロックを更新する際のメモリ操作のコストが高くなりますが、パッキングが向上し、断片化が少なくなります"

マルチデバイス対応ファイルシステム

警告: Btrfs の RAID 5 と RAID 6 モードには致命的な欠陥があり、"捨てデータでのテスト以外" には使用しないでください。既知の問題と部分的な回避策のリスト。状況の更新については the Btrfs page on RAID5 and RAID6 を見て下さい(更新されていないようです)

複数のデバイスを使用して RAID を作成することができます。サポートされている RAID レベルは RAID 0, RAID 1, RAID 10, RAID 5, RAID 6 です。カーネル 5.5 からは RAID1c3 と RAID1c4 で RAID1 レベルの 3-コピーと 4-コピーが可能です。RAIDレベルは、データ用とメタデータ用にそれぞれ -d-m オプションを使って別々に設定することができます。デフォルトでは、データは1つのコピー (single) で、メタデータはミラーリング (raid1) された状態になっています。これは JBOD configuration を作成すると、ディスクは1つのファイルシステムとして認識されますが、ファイルは複製されません。Btrfs RAID ボリュームを作成する方法についての詳しい情報は Using Btrfs with Multiple Devices を見て下さい。

# mkfs.btrfs -d single -m raid1 /dev/part1 /dev/part2 ...

プールで複数の Btrfs デバイスを使うには udev フックか btrfs フックを /etc/mkinitcpio.conf に記述する必要があります。詳しくは Mkinitcpio#HOOKS の記事を見て下さい。

ノート:
  • マルチデバイスファイルシステムに後からデバイスを追加することも可能です。詳しくは Btrfs wiki article を見て下さい。
  • デバイスは異なるサイズにすることができます。しかし、RAID 構成の1つのドライブが他のドライブより大きい場合、この余分なスペースは使用されません。
  • Syslinux などのいくつかの ブートローダー はマルチデバイスファイルシステムをサポートしません。
  • Btrfs は自動的に最速のデバイスから読み込むわけではないので、異なる種類のディスクを混在させるとパフォーマンスに一貫性がなくなります。詳しくは [1] を見て下さい。

マルチデバイス Btrfs ファイルシステム特有のメンテナンスに関するアドバイスは #RAID をご覧下さい。

ファイルシステムの構成

コピーオンライト (CoW)

デフォルトでは Btrfs は全てのファイルに対して常に copy-on-write を使用します。書き込みはその場のデータを上書きしません; 代わりに、ブロックの修正されたコピーが新しい場所に書き込まれ、メタデータは新しい場所を指すように更新されます。実装の詳細や利点と欠点については Btrfs Sysadmin Guide セクション を見て下さい。

CoW の無効化

デフォルトでは、いついかなる時も、全てのファイルに対して btrfs は CoW を行います: 今までに存在していなかったファイルを書き込もうとした場合、データは空き領域に書き込まれて、ファイルシステムのメタデータブロックが CoW されます。"通常の"ファイルシステムでは、ファイルの一部を上書きした場合、置換先のデータに直接上書きがなされます。CoW ファイルシステムでは、新しいデータはディスクの空き容量に書き込まれて、それから、新しいデータを参照するようにファイルのメタデータが変更されます。元のデータはどこからも参照されなくなって始めて削除されます。

CoW にはアドバンテージがありますが、大きなファイルに小さなランダム書き込みを行うときのパフォーマンスについてはあまり良い影響を与えません。たとえ"コピー"を行わないときでもファイルを断片化させるからです。データベースファイルや仮想マシンイメージについては CoW を無効化することが推奨されます。

CoW を無効にする方法の一つは "nodatacow" オプションを使ってマウントすることです。しかしながら、これではファイルシステム全体で CoW を無効にすることになります。

ノート: nodatacow は新規作成されたファイルにのみ影響します。既存のファイルにはまだ CoW が行われる可能性があります。

ファイルやディレクトリ単体で CoW を無効化するには、次のコマンドを使って下さい:

$ chattr +C </dir/file>

以上のコマンドで CoW が無効化されるのはファイルの参照が一つしかない操作の場合に限られます。複数の参照がある場合 (例: cp --reflink=always を使用したりファイルシステムのスナップショットが存在する場合)、CoW は依然として実行されます。

ノート: chattr の man ページより: btrfs では、 'C' フラグは新しい、または空のファイルにセットしなければなりません。既にデータブロックを持つファイルにフラグを設定した場合、ファイルに新しいブロックが割り当てられると完全な安定のためにフラグの定義が消されます。ディレクトリに 'C' フラグがセットされている場合、そのディレクトリ自体には影響がなく、ディレクトリに作成された新しいファイルに No_COW 属性が付けられます。
ヒント: 上の Note に従い、ディレクトリ内の既存のファイルで CoW を無効にするときは、次のようにします:
$ mv /path/to/dir /path/to/dir_old
$ mkdir /path/to/dir
$ chattr +C /path/to/dir
$ cp -a /path/to/dir_old/* /path/to/dir
$ rm -rf /path/to/dir_old

作業中にファイルが使用されないように気を付けてください。また、 mv や下で説明する cp --reflink では CoW を無効にできないことに注意してください。

同じように、ファイルのコピー時に CoW を強制してスペースを節約するには次を使って下さい (デフォルトでは cp を使った場合、実際にデータがコピーされます):

$ cp --reflink source dest

dest ファイルが変更されると、元から変更されたブロックだけがディスクに書き込まれます。cp を 'cp --reflink=auto' にするエイリアスを作ってもいいかもしれません。

圧縮

Btrfs は 透過的自動圧縮 をサポートしています。これはファイルサイズを小さくするだけでなく、書き込み増幅を減らすことでフラッシュベースのメディアの寿命を大幅に延ばします。Fedora:Changes/BtrfsByDefault#Compression, [2], [3] を参照して下さい。また、パフォーマンスを向上させる 場合もありますが(例:重いファイル I/O を持つシングルスレッド)、(例:大きなファイル I/O を持つマルチスレッドや CPU 集中タスク)では明らかにパフォーマンスを低下させることがあります。一般に、最速の圧縮アルゴリズムである zstdlzo を用いると、より良いパフォーマンスが得られます。いくつかの benchmarks では、詳細な比較がなされています。

ここで algzlib, lzo, zstd, あるいは no のいずれかです。(圧縮しない場合) このオプションを使うと、btrfs はデータの最初の部分を圧縮することで縮小されるかどうかをチェックします。 もしそうなら、そのファイルへの書き込み全体が圧縮されます。 そうでない場合は、何も圧縮されません。 このオプションでは、書き込みの最初の部分が縮小しない場合、残りのデータが非常に縮小しても、書き込みに圧縮は適用されません。[4] これは、書き込むべき全てのデータが btrfs に完全に与えられ圧縮されるまで、ディスクの書き込み開始を待たせるのを防ぐために行われます。

代わりに compress-force=alg マウントオプションを使うと、btrfs が最初の部分を圧縮しているかどうかのチェックをスキップし、全てのファイルに対して自動的に圧縮を試行することが可能になります。 最悪の場合、これは何の目的もなく CPU 使用量を (少し) 増加させる可能性があります。しかし、複数の用途が混在するシステムでの経験的なテストでは、 compress-force=zstd を使うことで、ただの compress=zstd に比べて約10%のディスク圧縮という大きな改善がありました、この場合も 10% のディスク圧縮でした。

マウントオプションが追加された後に作成または変更されたファイルのみが圧縮されます。

ここで algzlib, lzo, zstd のいずれかです。例えば、ファイルシステム全体を zstd で再圧縮する場合、以下のコマンドを実行します。

# btrfs filesystem defragment -r -v -czstd /

空の Btrfs パーティションに Arch をインストールするときに圧縮を有効にするには、ファイルシステムを マウント するときに compress オプションを使ってください。mount -o compress=zstd /dev/sdxY /mnt/ となります。設定時に、fstabでルートファイルシステムのマウントオプションに compress=zstd を追加してください。

ヒント: マウントオプション compress を使わずにファイル単位で圧縮を有効にすることもできます; そうするためには、ファイルに chattr +c を適用します。ディレクトリに適用すると、新しいファイルが来たときに自動的に圧縮されます。
警告:
  • このオプションを使うと、古いカーネルや zstd をサポートしていない btrfs-progs を使っているシステムは、ファイルシステムを読んだり修復したりできない可能性があります。
  • GRUB は 2.04 で zstd のサポートを導入しました。MBR/ESP にインストールされたブートローダを実際にアップグレードしたことを確認してください。BIOS/UEFI セットアップに適したオプションで grub-install を実行して、FS#63235 を見て下さい。

圧縮の種類と比率を表示する

compsize はファイルのリスト (または btrfs ファイルシステム全体) を受け取り、使用された圧縮タイプと有効な圧縮率を測定します。 非圧縮サイズは du(1) のような他のプログラムによって与えられる数値と一致しないかもしれません。なぜなら、たとえ何度も再リンクされていても、たとえその一部がもうどこにも使われていないけれどゴミ収集されていないとしても、全てのエクステントは一度にカウントされるからです。 これは compsize -x / のような状況で便利で、btrfs でないサブディレクトリを探そうとして、実行全体が失敗するのを避けます。

サブボリューム

btrfs の機能のひとつにサブボリュームがあります。サブボリュームは基本的にファイルとディレクトリを保持している名前の付いた b 木です。root ツリーのツリーの中に inode を持ち、root 以外の所有者やグループも設定できます。サブボリュームは任意でブロックを割り当てることもできます。ブロックとファイルエクステントの全ては参照カウントでありスナップショットを可能にしています。仮想マシンの動的な容量拡張に似て、必要な時に必要な分だけのデバイス上の容量を使います。また、サブボリュームを異なったマウントオプションを使ってマウントすることでセキュリティの柔軟性を持たせることもできます。

詳細については、次のリンクを参照してください:

サブボリュームを作成する

サブボリュームを作成するには:

# btrfs subvolume create /path/to/subvolume

サブボリュームを一覧する

現在のサブボリュームのリストを表示するには:

# btrfs subvolume list -p .

サブボリュームの削除

サブボリュームを削除するには

# btrfs subvolume delete /path/to/subvolume

Linux 4.18 以降では、通常のディレクトリのようにサブボリュームを削除することもできます (rm -r, rmdir)

サブボリュームをマウントする

サブボリュームは subvol=/path/to/subvolumesubvolid=objectid マウントフラグを使うことでファイルシステムのパーティションと同じようにマウントできます。例えば、subvol_root という名前のサブボリュームが存在したら / にマウントすることができます。ファイルシステムのトップレベルにサブボリュームを作成して適切なマウントポイントにマウントすることで、伝統的なファイルシステムのパーティションと同じように使うことができ、スナップショットを使用してファイルシステムを前の状態に簡単に戻すことが可能です。

ヒント: トップレベルのサブボリューム (ID=5) を / として使用しないことでサブボリュームのレイアウトの変更を簡単にできます。サブボリュームを作成して実際のデータを保存して / にマウントします。

Snapper#推奨ファイルシステムレイアウト, Btrfs SysadminGuide#Managing Snapshots, Btrfs SysadminGuide#Layout などにサブボリュームを使用するファイルシステムレイアウトの例が存在します。

サブボリュームをルートとしてマウントする

サブボリュームをルートマウントポイントとして使用するには、rootflags=subvol=/path/to/subvolume を使用して カーネルパラメータ 経由でサブボリュームを指定します。/etc/fstab でルート・マウントポイントを編集し、マウント・オプションに subvol= を指定します。または、サブボリュームの ID rootflags=subvolid=objectid をカーネルパラメータとして使い、subvolid=objectid/etc/fstab のマウントオプションとして指定することもできます。

デフォルトのサブボリュームを設定する

警告: btrfs subvolume set-default でデフォルトのサブボリュームを変更すると、subvolid=0 マウントオプションを使わない限り、ファイルシステムのトップレベルがアクセスできなくなります。参照: Btrfs Wiki Sysadmin Guide

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 .

クォータ

警告: Qgroup はまだ安定状態ではなくサブボリュームのスナップショットとクォータを組み合わせると操作によってパフォーマンスに問題をきたします (スナップショットの削除など)。さらに 既知の問題 が存在しています。

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 以降でサポートされています。[5] スワップファイルを初期化する適切な方法は、最初にファイルをホストする非圧縮、非スナップショットのサブボリュームを作成し、そのディレクトリに 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で説明されています。

ノート: Linux カーネル5.0 以降、 Btrfs にはネイティブスワップファイルのサポートがありますが、いくつかの制限があります。
  • スワップファイルをスナップショットサブボリュームに置くことはできません。適切な手順は、スワップファイルを配置する新しいサブボリュームを作成することです。
  • 複数のデバイスにまたがるファイルシステム上のスワップファイルはサポートされていません。 Btrfs wiki: Does btrfs support swap files? および Arch forums discussion

使用領域 空き領域の表示

df(1) のような一般的な linux ユーザースペースツールは Btrfs パーティションの空き容量を不正確に報告します。Btrfs パーティションを調べるには btrfs filesystem usage を使うことが推奨されます。例えば、デバイスのアロケーションと使用状況の統計の完全な内訳を見るには、btrfs filesystem usage を使って下さい。

# btrfs filesystem usage /
ノート: 現在、btrfs filesystem usage コマンドは RAID5/RAID6 では正しく動作していません。

あるいは、btrfs filesystem df を使えば、root で実行しなくても、割り当てられた領域の使用状況を素早くチェックすることができます。

$ btrfs filesystem df /

詳しくは [6] を参照してください。

du(1)ncdu(1) のような、ファイルシステムのあるサブセットについて空間の使用状況を分析するツールにも同じ制限が適用され、これらは reflinks, snapshots, 圧縮を考慮しません。代わりに、btrfs を意識した代替手段は btduAUR圧縮の種類と比率を表示する を見て下さい。

デフラグメンテーション

Btrfs はオンラインデフラグをサポートしています。root フォルダのメタデータをデフラグするには、次を実行してください:

# btrfs filesystem defragment /

上のコマンドはファイルシステム全体のデフラグを行いません。詳しくは、btrfs wiki のこのページを見て下さい。

ファイルシステム全体をデフラグするには、次を実行してください:

# btrfs filesystem defragment -r -v /

RAID 機能

ノート: カーネル 3.19 から、復元や再構築のコードもマージされています。通常の使用に耐えうるようになっています。新しいコードなので、安定化するのは次かその次のバージョンのカーネルになると思われます。

マルチデバイスファイルシステムを作成するとき、ファイルシステムに追加したデバイス全体で 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 を参照。

警告: パリティ RAID (RAID 5/6) のコードにはデータを消失する可能性のある深刻なバグが存在します。詳しくは Btrfs Wiki の RAID5/6 のページや linux-btrfs メーリングリスト のバグレポートを読んでください。

Scrub

Btrfs Wiki Glossary によると、Btrfs スクラブはオンラインファイルシステムチェックツールです。ファイルシステム上のすべてのデータとメタデータを読み取り、チェックサムと RAID ストレージからの複製コピーを使用して、破損したデータを特定して修復します。

ノート: 実行中のスクラブプロセスはシステムのサスペンドを防ぎます。詳細は このスレッド を参照してください。

手動で開始する

/ を含むファイルシステムに対して (バックグラウンド) scrub を開始する場合。

# btrfs scrub start /

実行中の scrub の状態を確認する。

# btrfs scrub status /

サービスまたはタイマーを使って起動する

btrfs-progs パッケージは、指定したマウントポイントを毎月 scrubbing するためのユニット btrfs-scrub@.timer を提供します。例えば / の場合は btrfs-scrub@-.timer/home の場合は btrfs-scrub@home.timer のように、エスケープしたパスでタイマーを 有効化 してください。パスのエスケープは systemd-escape -p /path/to/mountpoint で行えます、詳しくは systemd-escape(1) を見て下さい。

scrub を実行するには btrfs-scrub@.serviceスタート します。(同じエンコードされたパスで) この方法の利点は btrfs scrub と比べても同じです。(root ユーザーで) scrub の結果が systemd/ジャーナル に記録されることです。

冷却が不十分な大きな NVMe ドライブ (ラップトップなど) では、scrub はドライブを速く、長く読み込んで、ドライブを非常に高温にします。systemd で scrub を実行している場合、ドロップインファイル を使って systemd.resource-control(5) にある IOReadBandwidthMax オプションで簡単にスクラブ速度を制限することができます。

Balance

balance はファイルシステム上の全てのデータをアロケータに再度流し込みます。デバイスが追加されたり削除された場合にファイルシステム上のデータを再配置するために実行します。balance はデバイスが故障した場合に、冗長な RAID レベルのコピーを再生成します。

btrfs-progs-3.12 からバランシングはバックグラウンドプロセスになりました - 詳しくは man 8 btrfs-balance を見て下さい。

# btrfs balance start /
# btrfs balance status /

スナップショット

"スナップショットとは、btrfs の COW 機能を使って、そのデータ(とメタデータ)を他のサブボリュームと共有する、サブボリュームのことです" 詳しくは Btrfs Wiki SysadminGuide#Snapshots を見て下さい。

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

# btrfs subvolume snapshot source [dest/]name

読み取り専用のスナップショットを作成するには、-r フラグを追加します。readonly スナップショットの書き込み可能バージョンを作成するには、単純にそのスナップショットを作成します。

ノート: {Note
  • スナップショットを読み込み専用から書き込み専用に変換することは可能です。しかし、これは将来のインクリメンタル送受信で問題が発生するため、推奨されません[7] 新しい書き込み可能なスナップショットを作成することで、そのような問題を防ぐことができます。
  • スナップショットは再帰的ではありません。ネストされたサブボリュームは、スナップショット内部では空のディレクトリになります。

送信/受信

サブボリュームは 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 filesystem resize max /

ファイルシステムを特定のサイズに拡張する場合。

# btrfs filesystem resize size /

size は、希望するサイズにバイト単位で置き換えてください。K(キロバイト)、M(メガバイト)、G(ギガバイト)など、値の単位を指定することも可能です。また、値の前にプラス (+) 記号、マイナス (-) 記号を付けることで、現在のサイズに対する増減をそれぞれ指定することも可能です。

# btrfs filesystem resize +size /
# btrfs filesystem resize -size /

既知の問題

試す前に、いくつかの制限を知っておく必要があります。

暗号化

Btrfs には暗号化のサポートが組み込まれていませんが、この [8] は将来的に提供される可能性があります。 ユーザーは、 mkfs.btrfs を実行する前にパーティションを暗号化できます。 dm-crypt/スワップを使用したsystem#Btrfsサブボリューム全体の暗号化 を参照してください。

既存の Btrfs ファイルシステムは EncFSTrueCrypt のようなものを使用できますが、おそらく Btrfs の機能の一部はありません。

btrfs チェックの問題

ツールbtrfs check には既知の問題があるため、セクション #btrfscheck をよく参照してから実行してください。

ヒントとテクニック

パーティションレス Btrfs ディスク

警告:
  • ほとんどのユーザーはこのタイプのセットアップを望まず、代わりに通常のパーティションにBtrfsをインストールする必要があります。 さらに、 GRUB はパーティションレスディスクへのインストールを強くお勧めしません。
  • grub 2.04 以降、GRUB の core.img は大きすぎてBtrfsVBRに収まりません。 FS#63656 を参照してください。

Btrfs は、 subvolumes を使用してパーティションをシミュレートし、 MBR または GPT パーティションスキームを置き換えて、データストレージデバイス全体を占有できます。 ただし、別の方法で作成された既存の パーティションcreate a Btrfsfilesystem を実行するためにパーティションレスセットアップを使用する必要はありません。 パーティションレスのシングルディスクセットアップには、いくつかの制限があります。

既存のパーティションテーブルを Btrfs で上書きするには、次のコマンドを実行します:

# mkfs.btrfs /dev/sdX

たとえば、 /dev/sda1 ではなく /dev/sda を使用します。後者は、パーティショニングスキーム全体を置き換えるのではなく、既存のパーティションをフォーマットします。ルートパーティションは Btrfs なので、 btrfs がカーネルに組み込まれていることを確認するか、 btrfsmkinitcpio.conf#MODULESinitramfsを再生成する に入れてください。

ブートローダ を、 マスターブートレコード を備えたデータ記憶装置の場合と同様にインストールします。Syslinux#手動インストール または GRUB/Tips and tricks#パーティションまたはパーティションレスディスクへのインストール を参照してください。 /sysrootをマウントできませんでした。 が原因でカーネルがブートしない場合は、 /etc/default/grubGRUB_PRELOAD_MODULES="btrfs" を追加して、 grub 設定 (GRUB#メインの構成ファイルを生成する) を生成してください。

Ext3/4 から Btrfs への変換

警告: btrfs メーリングリストには、不完全/破壊/破損した変換に関する多くの報告があります。 失いたくないデータや 作業中 のバックアップがあることを確認してください。 詳細については、 btrfswiki の fromExt3 を参照してください。
警告: btrfs-progs 5.6.1 以前にはバグがあり、最後のブロックグループのサイズが間違った btrfs ファイルシステムが生成され、新しく変換されたbtrfsをマウントできなくなります。 このバグは、 thiscommit の btrfs-progs5.7 で修正されています。 btrfs-progs5.7-1 以降の btrfs-convert を使用してください。

インストール CD から起動し、次の手順で変換します:

# btrfs-convert /dev/partition

パーティションをマウントし、ファイルをチェックして変換をテストします。 変更を反映するために、必ず /etc/fstab を変更してください( typebtrfs に、 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

ノート: 新しく変換された btrfs にファイルをマウントまたは書き込みできないなどの問題がある場合は、バックアップサブボリューム /ext2_saved がまだ存在する限り、常にロールバックするオプションがあります。 btrfs-convert -r /dev/partition コマンドを使用してロールバックします。これにより、新しく変換された btrfs ファイルシステムへの変更が破棄されます。

問題がないことを確認したら、バックアップ 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.confcrc32c-intel を追加するだけでは機能しません。

ファイルシステム破損のリカバリ

警告: btrfs check ツールには既知の問題があります。セクション btrfs check を参照してください。

btrfs-check はマウントされているファイルシステムでは使えません。ライブ USB から起動しないで btrfs-check を使えるようにするには、初期 RAM ディスクに以下のように追加してください:

/etc/mkinitcpio.conf
BINARIES="/usr/bin/btrfs"

設定したら mkinitcpio を使って initramfs を再生成してください。

起動に問題が発生したら、ユーティリティを使って修復することができます。

ノート: fsck でキャッシュを無効化する必要がある場合、起動後に一定時間フリーズするのは通常の動作です (btrfs-transaction がハングアップしているというメッセージがコンソールに表示されます)。しばらく経てばシステムは復帰します。

詳しくは 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 sendbtrfs receive を使って、外部ドライブに増分バックアップを送信します。実装や機能、要件の違いを見るにはそれぞれのドキュメントを参照してください。

  • btrbk — Btrfs サブボリュームのスナップショットとリモートバックアップを作成するためのツール。
https://github.com/digint/btrbk || btrbkAUR
  • buttersink — Buttersink は Btrfs スナップショット用の rsync のようなものです。
https://github.com/AmesCornish/buttersink.git || buttersink-gitAUR
  • snap-syncSnapper スナップショットを使用して、外付けドライブまたはリモートマシンにバックアップします。
https://github.com/wesbarnett/snap-sync.git || snap-sync
  • snapsyncSnapper の同期ツール。
https://github.com/doudou/snapsync || ruby-snapsyncAUR

以下のパッケージでは、Snapper のスナップショットを Btrfs 以外のファイルシステムへバックアップすることができます。

  • snapborg — Snapper スナップショットを borg バックアップと統合する borgmatic のようなツール。
https://github.com/enzingerm/snapborg || snapborgAUR

トラブルシューティング

一般的なトラブルシューティングについては 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.confbtrfs フックを使用してマルチデバイスの Btrfs を使っている場合に以下のエラーが発生するというバグが systemdmkinitcpio のどちらかに存在します:

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.confHOOKS 行から btrfs を削除して代わりに MODULES 行に btrfs を追加することで解決します。修正を施したら mkinitcpio -p linux で initramfs を再生成して (必要ならプリセットを調整します) 再起動してください。

詳細は フォーラムスレッドFS#42884 を見て下さい。

デバイスが存在しない raid アレイをマウントしようとしたときも同じエラーが表示されます。その場合は /etc/fstabdegraded マウントオプションを追加してください。ルートパーティションがアレイ上にある場合、カーネルパラメータrootflags=degraded を追加してください。

btrfs check

警告: Btrfs はまだ開発途上であり、特に btrfs check コマンドについては仕様が固まっていないので、--repair スイッチを付けて btrfs check を実行するときはあらかじめ Btrfs のドキュメントを読んでバックアップを作成することを強く推奨します。

btrfs check コマンドを使うことでアンマウントされた Btrfs ファイルシステムをチェックしたり修復することが可能です。ただし、この修復ツールはまだ開発中であり、特定のファイルシステムエラーは修復することができません。

詳しくは Btrfsck を参照。

参照