Btrfs
Btrfs Wiki より:
- Btrfs は、耐障害性、修復、および簡単な管理に重点を置きながら、高度な機能を実装することを目的とした Linux 用の最新のコピーオンライト(CoW)ファイルシステムです。複数の企業で共同開発された Btrfs は、GPL に基づいてライセンスされており、誰からの寄付も受け付けています。
準備
ユーザースペースのユーティリティについては、基本的な操作に必要な 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
マルチデバイス対応ファイルシステム
複数のデバイスを使用して 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 ファイルシステム特有のメンテナンスに関するアドバイスは #RAID をご覧下さい。
ファイルシステムの構成
コピーオンライト (CoW)
デフォルトでは Btrfs は全てのファイルに対して常に copy-on-write を使用します。書き込みはその場のデータを上書きしません; 代わりに、ブロックの修正されたコピーが新しい場所に書き込まれ、メタデータは新しい場所を指すように更新されます。実装の詳細や利点と欠点については Btrfs Sysadmin Guide セクション を見て下さい。
CoW の無効化
マウントされたサブボリュームで新しく作成されたファイルのコピー オン ライトを無効にするには、nodatacow
マウント オプションを使用します。これは、新しく作成されたファイルにのみ影響します。コピーオンライトは、既存のファイルに対して引き続き影響します。 nodatacow
オプションも圧縮を無効にします。詳しくは btrfs(5) をご覧ください。
ファイルやディレクトリ単体で CoW を無効化するには、次のコマンドを使って下さい:
$ chattr +C </dir/file>
これにより、ファイルへの参照が 1つしかない操作のコピーオンライトが無効になります。複数の参照がある場合。ファイル クローン/軽量クローンまたはファイルシステムスナップショットが原因で、コピーオンライトが引き続き発生します。coreutils 9.0 以降、cp
はデフォルトで軽量コピーを実行しようとすることに注意してください。詳細については、cp(1) を参照してください。
スナップショットへの影響
ファイルのコピーオンライトが無効 (NOCOW) でスナップショットが作成された場合、スナップショットは古いファイルブロックを所定の位置にロックするため、スナップショット後のファイルブロックへの最初の書き込みは COW 操作 になります。ただし、ファイルは NOCOW 属性を保持し、同じファイルブロックへの後続の書き込みは次のスナップショットまでそのまま残ります。
スナップショットを頻繁に行うと、最初の書き込みで COW が必要になるため、NOCOW の効果が低下する可能性があります。そのようなファイルのコピーオンライトを完全に避けるには、それらを別のサブボリュームに入れ、そのサブボリュームのスナップショットを作成しないでください。
圧縮
Btrfs は 透過的自動圧縮 をサポートしています。これはファイルサイズを小さくするだけでなく、書き込み増幅を減らすことでフラッシュベースのメディアの寿命を大幅に延ばします。Fedora:Changes/BtrfsByDefault#Compression, [2], [3] を参照して下さい。また、パフォーマンスを向上させる 場合もありますが(例:重いファイル I/O を持つシングルスレッド)、(例:大きなファイル I/O を持つマルチスレッドや CPU 集中タスク)では明らかにパフォーマンスを低下させることがあります。一般に、最速の圧縮アルゴリズムである zstd と lzo を用いると、より良いパフォーマンスが得られます。いくつかの benchmarks では、詳細な比較がなされています。
ここで alg
は zlib
, lzo
, zstd
, あるいは no
のいずれかです。(圧縮しない場合) このオプションを使うと、btrfs はデータの最初の部分を圧縮することで縮小されるかどうかをチェックします。 もしそうなら、そのファイルへの書き込み全体が圧縮されます。 そうでない場合は、何も圧縮されません。 このオプションでは、書き込みの最初の部分が縮小しない場合、残りのデータが非常に縮小しても、書き込みに圧縮は適用されません。[4] これは、書き込むべき全てのデータが btrfs に完全に与えられ圧縮されるまで、ディスクの書き込み開始を待たせるのを防ぐために行われます。
代わりに compress-force=alg
マウントオプションを使うと、btrfs が最初の部分を圧縮しているかどうかのチェックをスキップし、全てのファイルに対して自動的に圧縮を試行することが可能になります。 最悪の場合、これは何の目的もなく CPU 使用量を (少し) 増加させる可能性があります。しかし、複数の用途が混在するシステムでの経験的なテストでは、 compress-force=zstd
を使うことで、ただの compress=zstd
に比べて約10%のディスク圧縮という大きな改善がありました、この場合も 10% のディスク圧縮でした。
マウントオプションが追加された後に作成または変更されたファイルのみが圧縮されます。
ここで 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 サブボリュームはブロックデバイスではありません(そしてブロックデバイスとして扱えません)代わりに btrfs サブボリュームは POSIX ファイル名空間として考えることができます。このネームスペースはファイルシステムのトップレベルのサブボリュームからアクセスすることもできますし、それ自体でマウントすることもできます" [5]
各 Btrfs ファイルシステムには ID 5 のトップレベルのサブボリュームがあります。これは /
としてマウントすることができます。(デフォルト) または、代わりに別のサブボリュームを マウントする こともできます。サブボリュームはファイルシステム内で移動することができ、パスよりもむしろその ID で識別されます。
詳細については、次のリンクを参照してください:
- Btrfs Wiki SysadminGuide#Subvolumes
- Btrfs Wiki Getting started#Basic Filesystem Commands
- Btrfs Wiki Trees
サブボリュームを作成する
サブボリュームを作成するには:
# 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/subvolume
や subvolid=objectid
マウントフラグを使うことでファイルシステムのパーティションと同じようにマウントできます。例えば、subvol_root
という名前のサブボリュームが存在したら /
にマウントすることができます。ファイルシステムのトップレベルにサブボリュームを作成して適切なマウントポイントにマウントすることで、伝統的なファイルシステムのパーティションと同じように使うことができ、スナップショット を使用してファイルシステムを前の状態に簡単に戻すことが可能です。
Snapper#推奨ファイルシステムレイアウト, Btrfs SysadminGuide#Managing Snapshots, Btrfs SysadminGuide#Layout などにサブボリュームを使用するファイルシステムレイアウトの例が存在します。
btrfs 固有のマウントオプションの完全なリストは btrfs(5) を見て下さい。
サブボリュームをルートとしてマウントする
サブボリュームをルートマウントポイントとして使用するには、rootflags=subvol=/path/to/subvolume
を使用して カーネルパラメータ 経由でサブボリュームを指定します。/etc/fstab
でルート・マウントポイントを編集し、マウント・オプションに subvol=
を指定します。または、サブボリュームの ID rootflags=subvolid=objectid
をカーネルパラメータとして使い、subvolid=objectid
を /etc/fstab
のマウントオプションとして指定することもできます。
デフォルトのサブボリュームを設定する
マウントオプションに subvol=
が指定されない場合、デフォルトのサブボリュームがマウントされます。デフォルトサブボリュームを変更するには、次のようにします。
# btrfs subvolume set-default subvolume-id /
ここで、subvolume-id は listing で見つけることができます。
btrfs subvolume set-default
でデフォルトのサブボリュームを変更すると、ファイルシステムのトップレベルは subvol=/
や subvolid=5
マウントオプションを使ってアクセスする以外ではアクセスできなくなります [6]
クォータ
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秒のチェックポイント間隔です。これは、btrfs パーティションの /etc/fstab
に commit
マウントオプションを追加することで変更できます。
LABEL=arch64 / btrfs defaults,compress=zstd,commit=120 0 0
システム全体の設定もコミット間隔に影響します。これらには /proc/sys/vm/*
の下のファイルが含まれており、このwiki記事の範囲外です。それらのカーネルドキュメントは、https://www.kernel.org/doc/html/latest/admin-guide/sysctl/vm.html で入手できます。
SSD TRIM
Btrfs ファイルシステムは、TRIM コマンドをサポートする SSD ドライブから未使用のブロックを解放できます。カーネルバージョン 5.6 以降、非同期破棄がサポートされ、マウントオプション discard=async
で有効になります。解放されたエクステントはすぐには破棄されませんが、グループ化され、後で別のワーカースレッドによってトリミングされるため、コミットの待ち時間が短縮されます。
TRIM の有効化と使用に関するより詳しい情報は ソリッドステートドライブ#TRIM に記載されています。
使い方
スワップファイル
Btrfs の スワップファイル は Linux カーネル5.0 以降でサポートされています。[7] スワップファイルを初期化する適切な方法は、最初にファイルをホストする非圧縮、非スナップショットのサブボリュームを作成し、そのディレクトリに 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で説明されています。
使用領域 空き領域の表示
df(1) のような一般的な linux ユーザースペースツールは Btrfs パーティションの空き容量を不正確に報告します。Btrfs パーティションを調べるには btrfs filesystem usage
を使うことが推奨されます。例えば、デバイスのアロケーションと使用状況の統計の完全な内訳を見るには、btrfs filesystem usage
を使って下さい。
# btrfs filesystem usage /
あるいは、btrfs filesystem df
を使えば、root で実行しなくても、割り当てられた領域の使用状況を素早くチェックすることができます。
$ btrfs filesystem df /
詳しくは [8] を参照してください。
du(1) や ncdu(1) のような、ファイルシステムのあるサブセットについて空間の使用状況を分析するツールにも同じ制限が適用され、これらは reflinks, snapshots, 圧縮を考慮しません。代わりに、btrfs を意識した代替手段は btduAUR と 圧縮の種類と比率を表示する を見て下さい。
デフラグメンテーション
Btrfs はマウントオプション autodefrag
でオンラインデフラグをサポートしています、btrfs(5) § MOUNT OPTIONS を見て下さい。手動でルートのデフラグをするには:
# btrfs filesystem defragment -r /
上記のコマンドを -r
スイッチなしで使用すると、ディレクトリを含むサブボリュームが保持するメタデータのみがデフラグされる結果となります。このため、パスを指定するだけで単一ファイルのデフラグが可能です。
COW コピー (スナップショット コピーまたは cp
や bcp で作成されたもの) を持つファイルに圧縮アルゴリズムで -c
スイッチを使用したデフラグを行うと、無関係の 2 つのファイルが効果的にディスク使用量を増加させる結果になることがあります。
RAID
Btrfs は マルチデバイス対応ファイルシステム のためのネイティブな RAID を提供します。btrfs RAID を mdadm と区別する注目すべき機能は自己回復型の冗長アレイとオンラインバランシングです。より詳しい情報は the Btrfs wiki page を見て下さい。Btrfs sysadmin ページにも にセクションがありますので参照して下さい。 技術的な背景があります。
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 スナップショットの書き込み可能バージョンを作成するには、単純にそのスナップショットを作成します。
送信/受信
サブボリュームは 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 には暗号化のサポートが組み込まれていませんが、この [12] は将来的に提供される可能性があります。 ユーザーは、 mkfs.btrfs
を実行する前にパーティションを暗号化できます。 dm-crypt/スワップを使用したsystem#Btrfsサブボリューム全体の暗号化 を参照してください。
既存の Btrfs ファイルシステムは EncFS や TrueCrypt のようなものを使用できますが、おそらく Btrfs の機能の一部はありません。
btrfs チェックの問題
ツールbtrfs check
には既知の問題があるため、セクション #btrfs check をよく参照してから実行してください。
ヒントとテクニック
パーティションレス 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
を変更してください (/etc/fstab
の type' を btrfs
に、 fs_passno をに変更すること) [最後のフィールド] を 0
に設定します(Btrfs は起動時にファイルシステムのチェックを行わないため)また、パーティションの UUID が変更されていることに注意してください、UUID を使うときは fstab もそれに合わせて更新してください。システムに chroot
して、ブートローダのメニューリストを再構築します(既存の Linux からインストール を参照)ルートファイルシステムを変換する場合、chroot したまま mkinitcpio -p linux
を実行して initramfs を再生成しないと、システムが正常に起動しません。
問題がないことを確認したら、バックアップ 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
パーティションオフセット
オフセットの問題は、パーティションのあるディスクに core.img
を埋め込もうとしたときに発生する可能性があります。つまり、GRUB の core.img
をパーティションレスディスク (例: /dev/sdX
) の Btrfs プールに直接埋め込んでも 大丈夫 です。
GRUB は Btrfs パーティションを起動できますが、モジュールが他の ファイルシステム よりも大きくなる可能性があります。また、grub-install
で作成した core.img
ファイルは、MBR と最初のパーティションの間にあるドライブの最初の 63 セクタ (31.5KiB) に収まらないかもしれません。fdisk
や gdisk
のような最新のパーティションツールは、最初のパーティションをおよそ 1MiB または 2MiB オフセットすることでこの問題を回避しています。
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 を再生成して (必要ならプリセットを調整します) 再起動してください。
デバイスが存在しない raid アレイをマウントしようとしたときも同じエラーが表示されます。その場合は /etc/fstab
に degraded
マウントオプションを追加してください。ルートパーティションがアレイ上にある場合、カーネルパラメータに rootflags=degraded
を追加してください。
2016年8月現在、このバグの回避策として考えられるのは、/etc/fstab
で単一ドライブのみでアレイをマウントし、他のドライブは btrfs が自動的に発見して追記するようにすることです。UUID や LABEL のようなグループベースの識別子は、この不具合の原因になっているようです。例えば、'disk1' と 'disk2' からなる2デバイスの RAID1 アレイには UUID が割り当てられますが、UUID を使う代わりに /dev/mapper/disk1
のみを /etc/fstab
で使用します。より詳しい説明は、以下の ブログ記事 を参照してください。
また、mkinitcpio.conf の udev
フックを削除し、systemd
フックに置き換えることも可能な対処法です。この場合、btrfs
はHOOKS
やMODULES
配列に not とする必要があります。
詳細は フォーラムスレッド や FS#42884 を見て下さい。
btrfs check
btrfs check コマンドを使うことでアンマウントされた Btrfs ファイルシステムをチェックしたり修復することが可能です。ただし、この修復ツールはまだ開発中であり、特定のファイルシステムエラーは修復することができません。
絶え間ないドライブアクティビティ
カーネル バージョン 6.2 以降、discard=async
mount(8) オプションがデフォルトで設定されています。これ 報告 により、廃棄キューがいっぱいになると、アイドル状態でも一部のドライブで一定のドライブアクティビティが発生し、処理されるよりも速くなります。これにより、特に NVMe ベースのドライブで電力使用量が増加する可能性があります。
回避策の 1 つは、ドライブのアクティビティが停止するまで破棄 iops_limit
を増やすことです。
これは、sysfs を使用して実現できます。例:
# echo 1000 > /sys/fs/btrfs/uuid/discard/iops_limit
ここで、uuid
は btrfs ファイルシステムの UUID です。1000
の制限は実験的に調整する必要があります。
起動時にパラメータを設定するには、systemd-tmpfiles を使用できます。たとえば、次のファイルを作成します。
/etc/tmpfiles.d/btrfs-discard.conf
w /sys/fs/btrfs/uuid/discard/iops_limit - - - - 1000
あるいは、fstab の nodiscard
マウントオプションを使用してマウントし、代わりに 定期的な TRIM を使用して、非同期破棄を完全に無効にすることもできます。
参照
- 公式サイト
- パフォーマンス関連
- その他
- 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