「Btrfs」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(ブロックサイズ指定のフラグが間違っていた)
(→‎btrfs チェックの問題: リンクを修正)
 
(4人の利用者による、間の55版が非表示)
1行目: 1行目:
 
[[Category:ファイルシステム]]
 
[[Category:ファイルシステム]]
  +
[[de:Arch auf BtrFS]]
 
[[en:Btrfs]]
 
[[en:Btrfs]]
[[fr:Btrfs]]
+
[[es:Btrfs]]
  +
[[pt:Btrfs]]
  +
[[ru:Btrfs]]
 
[[zh-hans:Btrfs]]
 
[[zh-hans:Btrfs]]
 
{{Related articles start}}
 
{{Related articles start}}
 
{{Related|ファイルシステム}}
 
{{Related|ファイルシステム}}
{{Related|mkinitcpio}}
 
 
{{Related|Snapper}}
 
{{Related|Snapper}}
  +
{{Related|Yabsnap}}
{{Related|dm-crypt/システム全体の暗号化#Btrfs サブボリュームとスワップ}}
 
 
{{Related articles end}}
 
{{Related articles end}}
   
[[Wikipedia:ja:Btrfs]] より:
+
[https://btrfs.wiki.kernel.org/index.php/Main_Page Btrfs Wiki] より:
   
:''Btrfs (B-tree File System: 読み方 "バター FS", "ベター FS", "B木 FS", "ビーティーアール FS" ど) は Linux 向け実験的なコピーオンライトファイルシステムで GPL ライセンスされています。Oracle Corporation によって2007年から開発が開始されました。2014年8月にはディスク上フォーマットが固まっています。''
+
:Btrfs は、耐障害性、修復、および簡単管理に重点を置きながら、高度な機能を実装することを目的とした Linux 用の最新のコピーオンライト(CoW)ファイルシステムです。複数の企業で共同開発された Btrfs は、GPL に基づいてライセンスされており、誰からの寄付も受け付けています。
   
  +
{{Note|他のファイルシステムと同様に、Btrfs は継続的に開発中です。これは、特定の機能がまだ日常的に使用できる状態になっていない可能性があります。使用事例が影響を受ける可能性があるかどうかを確認するには、Btrfs ドキュメントの [https://btrfs.readthedocs.io/en/latest/Status.html Status] とこの記事の [[Btrfs#既知の問題|既知の問題]] セクションを確認してください。}}
[https://btrfs.wiki.kernel.org/index.php/Main_Page Btrfs Wiki] より:
 
   
  +
== 準備 ==
:''Btrfs は Linux 用の全く新しいコピーオンライト (COW) のファイルシステムです。先進的な機能を実装することを目指しつつ、障害耐性を持ち簡単に管理できることに焦点が置かれています。Btrfs は Oracle, Red Hat, Fujitsu, Intel, SUSE, STRATO やその他多くの人々によって共同で開発されており GPL でライセンスされていて誰でも貢献できるように開かれています。''
 
   
  +
ユーザースペースのユーティリティについては、基本的な操作に必要な {{Pkg|btrfs-progs}} パッケージを [[インストール]] してください。
{{Warning|Btrfs には実験的な機能が存在します。詳しくは Btrfs Wiki の [https://btrfs.wiki.kernel.org/index.php/Status Status] や [https://btrfs.wiki.kernel.org/index.php/FAQ#Is_btrfs_stable.3F Is Btrfs stable?]、[https://btrfs.wiki.kernel.org/index.php/Getting_started Getting started] などを見てください。[[#既知の問題]]も参照。}}
 
   
  +
Btrfs ファイルシステムから起動する必要がある場合 (つまり、カーネルと initramfs が Btrfs パーティションにある場合)、あなたの [[ブートローダー]] が Btrfs をサポートしているか確認してください。
== インストール ==
 
   
  +
== ファイルシステムの作成 ==
Btrfs はデフォルトのカーネルに含まれており、ツール ({{pkg|btrfs-progs}}) は[[公式リポジトリ]]から入手できます。[[GRUB]], [[mkinitcpio]], [[Syslinux]] には Btrfs のサポートがあるので追加の設定は必要ありません。
 
   
  +
以下は、新しい Btrfs [[ファイルシステム]] を作成する方法を示しています。ext3/4 パーティションを Btrfs に変換するには、[[Btrfs#Ext3/4 から Btrfs への変換|Ext3/4 から Btrfs への変換]] を見て下さい。パーティションレスなセットアップを使うには、[[Btrfs#パーティションレス Btrfs ディスク|パーティションレス Btrfs ディスク]] を見て下さい。
=== 追加のパッケージ ===
 
   
  +
詳しくは {{man|8|mkfs.btrfs}} を見て下さい。
* {{Pkg|btrfs-progs}} には Btrfs ファイルシステムのエラーを修正できるツール ''btrfsck'' が含まれています。
 
* {{AUR|btrfs-progs-git}} はナイトリービルドです。
 
   
  +
=== 単一デバイス上のファイルシステム ===
{{Tip|Btrfs を効率的に動かす提案が [https://btrfs.wiki.kernel.org/index.php/Getting_started Btrfs Wiki Getting Started] に載っています。}}
 
   
  +
パーティション {{ic|/dev/''partition''}} に Btrfs ファイルシステムを作るには、次のようにします。
== Btrfs の一般的な管理 ==
 
   
  +
# mkfs.btrfs -L ''mylabel'' /dev/''partition''
=== 新しいファイルシステムを作成する ===
 
   
  +
メタデータの Btrfs のデフォルトのノードサイズは 16KB ですが、データのデフォルトのセクターサイズはページサイズと同じで、自動検出されます。メタデータに大きなノードサイズを使用するには(セクターサイズの倍数である必要があり、最大 64KB が許可されます)、この例に示すように、{{ic|-n}} スイッチを介して {{ic|nodesize}} の値を指定します 32KB ブロックの使用例:
Btrfs ファイルシステムは新規作成することも既存のファイルシステムから変換することも可能です。
 
   
  +
# mkfs.btrfs -L ''mylabel'' -n 32k /dev/''partition''
パーティションをフォーマットするには次を実行してください:
 
   
  +
{{Note|{{man|8|mkfs.btrfs|OPTIONS}} によると、"[a]ノードサイズが小さいほど断片化は増加しますが、bツリーが高くなり、ロックの競合が少なくなります。ノードサイズが大きいほど、メタデータブロックを更新する際のメモリ操作のコストが高くなりますが、パッキングが向上し、断片化が少なくなります"}}
# mkfs.btrfs -L ''mylabel'' /dev/''partition''
 
   
  +
=== マルチデバイス対応ファイルシステム ===
{{Note|1=2013年11月の[https://git.kernel.org/cgit/linux/kernel/git/mason/btrfs-progs.git/commit/?id=c652e4efb8e2dd76ef1627d8cd649c6af5905902 この] コミット以降、Btrfs のデフォルトのブロックサイズは 16KB になっています。}}
 
   
  +
{{Warning|Btrfs の RAID 5 と RAID 6 モードには致命的な欠陥があり、"捨てデータでのテスト以外" には使用しないでください。[https://lore.kernel.org/linux-btrfs/20200627032414.GX10769@hungrycats.org/ 既知の問題と部分的な回避策のリスト]。状況の更新については [https://btrfs.wiki.kernel.org/index.php/RAID56 the Btrfs page on RAID5 and RAID6] を見て下さい (更新されていないようです)}}
大きいブロックサイズをデータ・メタデータに使うには、下の例のように {{ic|-n}} スイッチを使って {{ic|nodesize}} の値を指定して下さい (例: 16KB ブロック):
 
   
  +
複数のデバイスを使用して RAID を作成することができます。サポートされている RAID レベルは RAID 0, RAID 1, RAID 10, RAID 5, RAID 6 です。カーネル 5.5 からは RAID1c3 と RAID1c4 で RAID1 レベルの 3-コピーと 4-コピーが可能です。RAIDレベルは、データ用とメタデータ用にそれぞれ {{ic|-d}} と {{ic|-m}} オプションを使って別々に設定することができます。デフォルトでは、データは1つのコピー ({{ic|single}}) で、メタデータはミラーリング ({{ic|raid1}}) された状態になっています。これは
# mkfs.btrfs -L ''mylabel'' -n 16k /dev/''partition''
 
  +
[[W:JBOD|JBOD configuration]] を作成すると、ディスクは1つのファイルシステムとして認識されますが、ファイルは複製されません。Btrfs RAID ボリュームを作成する方法についての詳しい情報は [https://btrfs.wiki.kernel.org/index.php/Using_Btrfs_with_Multiple_Devices Using Btrfs with Multiple Devices] を見て下さい。
   
  +
# mkfs.btrfs -d single -m raid1 /dev/''part1'' /dev/''part2'' ...
複数のデバイスを入力して RAID を作成することもできます。サポートされている RAID レベルは RAID 0, RAID 1, RAID 10 などです。デフォルトではメタデータはミラーされデータはストライピングされます。より多くの情報が必要な場合、[https://btrfs.wiki.kernel.org/index.php/Using_Btrfs_with_Multiple_Devices Using Btrfs with Multiple Devices] を見てください。
 
   
  +
プールで複数の Btrfs デバイスを使うには {{ic|udev}} フックか {{ic|btrfs}} フックを {{ic|/etc/mkinitcpio.conf}} に記述する必要があります。詳しくは [[Mkinitcpio#HOOKS]] の記事を見て下さい。
# mkfs.btrfs [options] /dev/<part1> /dev/<part2>
 
   
  +
{{Note|
{{Tip|ミラーリングをしない場合、''raid0'' オプションを使って下さい: {{ic|# mkfs.btrfs -d raid0 /dev/''part1'' /dev/''part2''}}。}}
 
  +
* マルチデバイスファイルシステムに後からデバイスを追加することも可能です。詳しくは [https://btrfs.wiki.kernel.org/index.php/Using_Btrfs_with_Multiple_Devices Btrfs wiki article] を見て下さい。
  +
* デバイスは異なるサイズにすることができます。しかし、RAID 構成の1つのドライブが他のドライブより大きい場合、この余分なスペースは使用されません。
  +
* [[Syslinux]] などのいくつかの [[ブートローダー]] はマルチデバイスファイルシステムをサポートしません。
  +
* Btrfs は自動的に最速のデバイスから読み込むわけではないので、異なる種類のディスクを混在させるとパフォーマンスに一貫性がなくなります。詳しくは [https://stackoverflow.com/a/55408367] を見て下さい。
  +
}}
   
  +
マルチデバイス Btrfs ファイルシステム特有のメンテナンスに関するアドバイスは [[#RAID]] をご覧下さい。
{{Warning|Btrfs の RAID 5 と RAID 6 モードには致命的な欠点があります。壊れても良いデータ以外でテストすべきではありません。現状については https://btrfs.wiki.kernel.org/index.php/RAID56 を参照してください。}}
 
   
  +
== ファイルシステムの構成 ==
=== 使用済み・空き容量を表示する ===
 
   
  +
=== コピーオンライト (CoW)===
{{ic|/usr/bin/df}} などの linux の一般的なユーザー空間ツールは Btrfs パーティションの空き容量について間違った報告をします。なぜならメタデータによって使用される予約済みのスペースを考慮しないからです。btrfs パーティションに問い合わせるときは {{ic|/usr/bin/btrfs}} を使うのが推奨されています。以下は {{ic|df -h}} を使った時と、{{ic|btrfs filesystem df}} を使った時の出力の例です:
 
   
  +
デフォルトでは Btrfs は全てのファイルに対して常に [[Wikipedia:copy-on-write|copy-on-write]] を使用します。書き込みはその場のデータを上書きしません; 代わりに、ブロックの修正されたコピーが新しい場所に書き込まれ、メタデータは新しい場所を指すように更新されます。実装の詳細や利点と欠点については [https://btrfs.wiki.kernel.org/index.php/SysadminGuide#Copy_on_Write_.28CoW.29 Btrfs Sysadmin Guide セクション] を見て下さい。
{{hc|$ df -h /|
 
Filesystem Size Used Avail Use% Mounted on
 
/dev/sda3 119G 3.0G 116G 3% /
 
}}
 
   
  +
==== CoW の無効化 ====
{{hc|$ btrfs filesystem df /|2=
 
Data: total=3.01GB, used=2.73GB
 
System: total=4.00MB, used=16.00KB
 
Metadata: total=1.01GB, used=181.83MB
 
}}
 
   
  +
{{Warning|Btrfs で CoW を無効にすると、チェックサムも無効になります。 Btrfs は破損した {{ic|nodatacow}} ファイルを検出できません。 RAID 1 と組み合わせると、停電やその他の破損原因により、データが同期しなくなる可能性があります。}}
{{ic|df -h}} は 3.0GB 使用されているとしているのに対して {{ic|btrfs filesystem df}} はデータは 2.73GB だと報告しているのに気づいて下さい。これは Btrfs がスペースをプールに割り当てているためです。本当のディスク使用量は3つの 'used' を合計した値であり、{{ic|df -h}} による 3.0GB よりかは下回ります。
 
   
  +
マウントされたサブボリュームで新しく作成されたファイルのコピー オン ライトを無効にするには、{{ic|nodatacow}} マウント オプションを使用します。これは、新しく作成されたファイルにのみ影響します。コピーオンライトは、既存のファイルに対して引き続き影響します。 {{ic|nodatacow}} オプションも圧縮を無効にします。詳しくは {{man|5|btrfs}} をご覧ください。
{{Note|1=カーネル 3.15 以上で {{ic|btrfs filesystem df}} の出力にタイプ {{ic|unknown}} のエントリが表示される場合、これは表示のバグです。[http://thread.gmane.org/gmane.comp.file-systems.btrfs/34419 このパッチ] によって、このエントリは一種のバッファである GlobalReserve を意味しています。このエントリは RAID では {{ic|unknown, single}} として表示され re-balance することができません。}}
 
   
  +
{{Note|{{man|5|btrfs|MOUNT OPTIONS}} から:
他にも大まかに使用容量を読み出すコマンドとして {{ic|btrfs filesystem show}} が使用できます:
 
   
  +
:単一のファイル システム内で、一部のサブボリュームを {{ic|nodatacow}} でマウントし、他のサブボリュームを {{ic|datacow}} でマウントすることはできません。最初にマウントされたサブボリュームのマウント オプションは、他のサブボリュームに適用されます。
# btrfs filesystem show /dev/sda3
 
  +
}}
   
  +
ファイルやディレクトリ単体で CoW を無効化するには、次のコマンドを使って下さい:
空き容量の情報を取得する最新のコマンドは {{ic|btrfs filesystem usage}} です:
 
   
  +
$ chattr +C </dir/file>
# btrfs filesystem usage
 
   
  +
これにより、ファイルへの参照が 1つしかない操作のコピーオンライトが無効になります。複数の参照がある場合。ファイル クローン/軽量クローンまたはファイルシステムスナップショットが原因で、コピーオンライトが引き続き発生します。{{Pkg|coreutils}} 9.0 以降、{{ic|cp}} はデフォルトで軽量コピーを実行しようとすることに注意してください。詳細については、{{man|1|cp}} を参照してください。
{{Note|1={{ic|btrfs filesystem usage}} コマンドは RAID レベルが {{ic|RAID5/RAID6}} だと上手く機能しません。}}
 
   
  +
{{Note|{{man|1|chattr}} から:
== 既知の問題 ==
 
   
  +
:btrfs の場合、'{{ic|C}}' フラグを新しいファイルまたは空のファイルに設定する必要があります。すでにデータブロックがあるファイルに設定されている場合、ファイルに割り当てられたブロックが完全に安定する時期は未定義です。'{{ic|C}}' フラグがディレクトリに設定されている場合、ディレクトリには影響しませんが、そのディレクトリに作成された新しいファイルには {{ic|No_COW}} 属性が含まれます。
試行する前に知っておくべき制限事項が存在します。
 
  +
}}
   
  +
{{Tip|1=上記のメモに従い、次のトリックを使用して、ディレクトリ内の既存のファイルのコピーオンライトを無効にすることができます:
=== 暗号化 ===
 
   
  +
$ mv ''/path/to/dir'' ''/path/to/dir''_old
Btrfs にはビルトインの暗号化サポートはありません(将来実装される予定です)が、<code>mkfs.btrfs</code> をする前にパーティションを暗号化することができます。[[dm-crypt]] を見て下さい。
 
  +
$ mkdir ''/path/to/dir''
  +
$ chattr +C ''/path/to/dir''
  +
$ cp -a --reflink=never ''/path/to/dir''_old/. ''/path/to/dir''
  +
$ rm -rf ''/path/to/dir''_old
   
  +
このプロセス中にデータが使用されていないことを確認してください。また、後述のように {{ic|1=--reflink=never}} を指定しない {{ic|mv}} または {{ic|cp}} は機能しないことに注意してください。
既に btrfs ファイルシステムを作成してしまっている場合、[[EncFS]] や [[TrueCrypt]] などを使うことができます。ただし btrfs のいくつかの機能が使えなくなるかもしれません。
 
  +
}}
   
=== スップファイル ===
+
===== スップショットへの影響 =====
   
  +
ファイルのコピーオンライトが無効 (NOCOW) でスナップショットが作成された場合、スナップショットは古いファイルブロックを所定の位置にロックするため、スナップショット後のファイルブロックへの最初の書き込みは [https://www.spinics.net/lists/linux-btrfs/msg33090.html COW 操作] になります。ただし、ファイルは NOCOW 属性を保持し、同じファイルブロックへの後続の書き込みは次のスナップショットまでそのまま残ります。
Btrfs の [[スワップファイル]] は Linux カーネル5.0 以降でサポートされています。[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=ed46ff3d423780fa5173b38a844bf0fdb210a2a7] スワップファイルを初期化する適切な方法は、最初にファイルをホストする非圧縮、非スナップショットのサブボリュームを作成し、そのディレクトリに ''cd'' してから、長さゼロのファイルを作成し、{{ic|No_COW}} を設定することです。 属性を [https://wiki.archlinux.jp/index.php/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E3%83%91%E3%83%BC%E3%83%9F%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A8%E5%B1%9E%E6%80%A7#chattr_.E3.81.A8_lsattr chattr] で指定し、圧縮が無効になっていることを確認します。
 
   
  +
スナップショットを頻繁に行うと、最初の書き込みで COW が必要になるため、NOCOW の効果が低下する可能性があります。そのようなファイルのコピーオンライトを完全に避けるには、それらを別のサブボリュームに入れ、そのサブボリュームのスナップショットを作成しないでください。
# cd ''/path/to/swapfile''
 
# truncate -s 0 ./swapfile
 
# chattr +C ./swapfile
 
# btrfs property set ./swapfile compression none
 
   
  +
=== 圧縮 ===
詳細な設定については、 [https://wiki.archlinux.jp/index.php/%E3%82%B9%E3%83%AF%E3%83%83%E3%83%97#.E3.82.B9.E3.83.AF.E3.83.83.E3.83.97.E3.83.95.E3.82.A1.E3.82.A4.E3.83.AB.E3.81.AE.E4.BD.9C.E6.88.90 スワップファイルの作成] を参照してください。スワップファイルへの休止状態の構成については、[https://wiki.archlinux.org/index.php/Power_management/Suspend_and_hibernate#Hibernation_into_swap_file_on_Btrfs Hibernation into swap file on Btrfs]で説明されています。
 
   
  +
Btrfs は [https://btrfs.wiki.kernel.org/index.php/Compression 透過的自動圧縮] をサポートしています。これはファイルサイズを小さくするだけでなく、書き込み増幅を減らすことでフラッシュベースのメディアの寿命を大幅に延ばします。[[Fedora:Changes/BtrfsByDefault#Compression]], [https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org/message/NTV77NFF6NDZM3QTPUM2TQZ5PCM6GOO2/], [https://pagure.io/fedora-btrfs/project/issue/36#comment-701551] を参照して下さい。また、[https://www.phoronix.com/scan.php?page=article&item=btrfs_compress_2635&num=1 パフォーマンスを向上させる] 場合もありますが(例:重いファイル I/O を持つシングルスレッド)、(例:大きなファイル I/O を持つマルチスレッドや CPU 集中タスク)では明らかにパフォーマンスを低下させることがあります。一般に、最速の圧縮アルゴリズムである ''zstd'' と ''lzo'' を用いると、より良いパフォーマンスが得られます。いくつかの [https://www.phoronix.com/scan.php?page=article&item=btrfs-zstd-compress benchmarks] では、詳細な比較がなされています。
{{Note|1=Linux カーネル5.0 以降、 Btrfs にはネイティブスワップファイルのサポートがありますが、いくつかの制限があります。
 
* スワップファイルをスナップショットサブボリュームに置くことはできません。適切な手順は、スワップファイルを配置する新しいサブボリュームを作成することです。
 
* 複数のデバイスにまたがるファイルシステム上のスワップファイルはサポートされていません。 [https://btrfs.wiki.kernel.org/index.php/FAQ#Does_btrfs_support_swap_files.3F Btrfs wiki: Does btrfs support swap files?] および [https://bbs.archlinux.org/viewtopic.php?pid=1849371#p1849371 Arch forums discussion]。
 
}}
 
   
  +
ここで {{ic|''alg''}} は {{ic|zlib}}, {{ic|lzo}}, {{ic|zstd}}, あるいは {{ic|no}} のいずれかです。(圧縮しない場合) このオプションを使うと、btrfs はデータの最初の部分を圧縮することで縮小されるかどうかをチェックします。 もしそうなら、そのファイルへの書き込み全体が圧縮されます。 そうでない場合は、何も圧縮されません。 このオプションでは、書き込みの最初の部分が縮小しない場合、残りのデータが非常に縮小しても、書き込みに圧縮は適用されません。[https://btrfs.wiki.kernel.org/index.php/Compression#What_happens_to_incompressible_files.3F] これは、書き込むべき全てのデータが btrfs に完全に与えられ圧縮されるまで、ディスクの書き込み開始を待たせるのを防ぐために行われます。
== 機能 ==
 
   
  +
代わりに {{ic|1=compress-force=''alg''}} マウントオプションを使うと、btrfs が最初の部分を圧縮しているかどうかのチェックをスキップし、全てのファイルに対して自動的に圧縮を試行することが可能になります。 最悪の場合、これは何の目的もなく CPU 使用量を (少し) 増加させる可能性があります。しかし、複数の用途が混在するシステムでの経験的なテストでは、 {{ic|1=compress-force=''zstd''}} を使うことで、ただの {{ic|1=compress=''zstd''}} に比べて約10%のディスク圧縮という大きな改善がありました、この場合も 10% のディスク圧縮でした。
様々な機能が備わっていて、それぞれ設定が可能です。
 
   
  +
マウントオプションが追加された後に作成または変更されたファイルのみが圧縮されます。
=== クォータ ===
 
   
  +
ここで {{ic|''alg''}} は {{ic|zlib}}, {{ic|lzo}}, {{ic|zstd}} のいずれかです。例えば、ファイルシステム全体を {{pkg|zstd}} で再圧縮する場合、以下のコマンドを実行します。
{{warning|Qgroup はまだ安定状態ではなくサブボリュームのスナップショットとクォータを組み合わせると操作によってパフォーマンスに問題をきたします (スナップショットの削除など)。さらに [https://btrfs.wiki.kernel.org/index.php/Quota_support#Known_issues 既知の問題] が存在しています。}}
 
   
  +
# btrfs filesystem defragment -r -v -czstd /
Btrfs におけるクォータのサポートはクォータグループ (qgroup) を利用してサブボリュームレベルで実装されています: 各サブボリュームにはデフォルトで ''0/<subvolume id>'' という形式でクォータグループが割り当てられています。必要であればクォータグループを作成することもできます。
 
   
  +
空の Btrfs パーティションに Arch をインストールするときに圧縮を有効にするには、ファイルシステムを [[マウント]] するときに {{ic|compress}} オプションを使ってください。{{ic|1=mount -o compress=zstd /dev/sd''xY'' /mnt/}} となります。設定時に、[[fstab]]でルートファイルシステムのマウントオプションに {{ic|1=compress=zstd}} を追加してください。
クォータグループを使うにはまずクォータを有効にする必要があります:
 
   
  +
{{Tip|マウントオプション {{ic|compress}} を使わずにファイル単位で圧縮を有効にすることもできます; そうするためには、ファイルに {{ic|chattr +c}} を適用します。ディレクトリに適用すると、新しいファイルが来たときに自動的に圧縮されます。}}
# btrfs quota enable <path>
 
   
  +
{{Warning|
上記のコマンドを実行してから新しいサブボリュームを作成すると、グループによって制御が可能になります。既存のサブボリュームでも制御を行いたい場合、クォータを有効にしてから、''<subvolume id>'' を使ってサブボリュームごとにクォータグループを作成して再スキャンしてください:
 
  +
* このオプションを使うと、古いカーネルや {{ic|zstd}} をサポートしていない {{pkg|btrfs-progs}} を使っているシステムは、ファイルシステムを読んだり修復したりできない可能性があります。
  +
* [[GRUB]] は 2.04 で ''zstd'' のサポートを導入しました。MBR/ESP にインストールされたブートローダを実際にアップグレードしたことを確認してください。BIOS/UEFI セットアップに適したオプションで {{ic|grub-install}} を実行して、{{Bug|63235}} を見て下さい。
  +
}}
   
  +
==== 圧縮の種類と比率を表示する ====
# btrfs subvolume list <path> | cut -d' ' -f2 | xargs -I{} -n1 btrfs qgroup create 0/{} <path>
 
# btrfs quota rescan <path>
 
   
  +
{{pkg|compsize}} はファイルのリスト (または btrfs ファイルシステム全体) を受け取り、使用された圧縮タイプと有効な圧縮率を測定します。 非圧縮サイズは {{man|1|du}} のような他のプログラムによって与えられる数値と一致しないかもしれません。なぜなら、たとえ何度も再リンクされていても、たとえその一部がもうどこにも使われていないけれどゴミ収集されていないとしても、全てのエクステントは一度にカウントされるからです。 これは {{ic|compsize -x /}} のような状況で便利で、btrfs でないサブディレクトリを探そうとして、実行全体が失敗するのを避けます。
Btrfs のクォータグループはツリー構造になっていて、サイズ制限はクォータグループごとに設定し、ツリーに属しているサブボリュームに制限が課せられます。
 
   
  +
=== サブボリューム ===
クォータグループで設定できる制限は合計データ使用量・非共有のデータ使用量・圧縮データ使用量、あるいはそれらを組み合わせたものです。元のボリュームファイルを削除してコピーを残す場合、他のクォータグループの非共有制限が変わるため、ファイルのコピーや削除で制限に抵触する可能性があります。例えば、新しいスナップショットが元のサブボリュームの全てのブロックと同じデータを持っている場合、どちらかのサブボリュームだけで共通データを削除するともう片方のサブボリュームの制限に引っかかる可能性があります。
 
   
  +
"btrfs サブボリュームはブロックデバイスではありません(そしてブロックデバイスとして扱えません)代わりに btrfs サブボリュームは POSIX ファイル名空間として考えることができます。このネームスペースはファイルシステムのトップレベルのサブボリュームからアクセスすることもできますし、それ自体でマウントすることもできます" [https://btrfs.wiki.kernel.org/index.php/SysadminGuide#Subvolumes]
クォータグループに制限を設定するには、{{ic|btrfs qgroup limit}} コマンドを使います。合計使用量の制限や非共有制限 ({{ic|-e}}) または圧縮制限 ({{ic|-c}}) が設定できます。ファイルシステムの特定のパスにおける使用量や制限を表示するには:
 
   
  +
各 Btrfs ファイルシステムには ID 5 のトップレベルのサブボリュームがあります。これは {{ic|/}} としてマウントすることができます。(デフォルト) または、代わりに別のサブボリュームを [[Btrfs#サブボリュームをマウントする|マウントする]] こともできます。サブボリュームはファイルシステム内で移動することができ、パスよりもむしろその ID で識別されます。
# btrfs qgroup show -reF <path>
 
   
  +
詳細については、次のリンクを参照してください:
=== コミット間隔の設定 ===
 
   
  +
* [https://btrfs.wiki.kernel.org/index.php/SysadminGuide#Subvolumes Btrfs Wiki SysadminGuide#Subvolumes]
ファイルシステムにどのデータを書き込むかは BTRFS とシステム全体の設定によって決められます。BTRFS のデフォルトでは30秒のチェックポイントインターバルでファイルシステムに新しいデータが送られます。この間隔は[[#チェックポイントインターバル|後述]]のマウントオプションで調整可能です。
 
  +
* [https://btrfs.wiki.kernel.org/index.php/Getting_started#Basic_Filesystem_Commands Btrfs Wiki Getting started#Basic Filesystem Commands]
  +
* [https://btrfs.wiki.kernel.org/index.php/Trees Btrfs Wiki Trees]
   
  +
==== サブボリュームを作成する ====
システム全体の設定もインターバルに影響を与えます。それには /proc/sys/vm/* 以下のファイルも含まれており、この wiki では扱っていません。Documentation/sysctl/vm.txt にこれらのファイルに関するカーネルドキュメントがあります。
 
   
  +
サブボリュームを作成するには:
=== コピーオンライト (CoW) ===
 
  +
# btrfs subvolume create ''/path/to/subvolume''
   
  +
==== サブボリュームを一覧する ====
デフォルトでは、いついかなる時も、全てのファイルに対して btrfs は CoW を行います: 今までに存在していなかったファイルを書き込もうとした場合、データは空き領域に書き込まれて、ファイルシステムのメタデータブロックが CoW されます。"通常の"ファイルシステムでは、ファイルの一部を上書きした場合、置換先のデータに直接上書きがなされます。CoW ファイルシステムでは、新しいデータはディスクの空き容量に書き込まれて、それから、新しいデータを参照するようにファイルのメタデータが変更されます。元のデータはどこからも参照されなくなって始めて削除されます。
 
   
  +
現在のサブボリュームのリストを表示するには:
CoW にはアドバンテージがありますが、大きなファイルに小さなランダム書き込みを行うときのパフォーマンスについてはあまり良い影響を与えません。たとえ"コピー"を行わないときでもファイルを断片化させるからです。データベースファイルや仮想マシンイメージについては CoW を無効化することが推奨されます。
 
   
  +
# btrfs subvolume list -p .
CoW を無効にする方法の一つは "nodatacow" オプションを使ってマウントすることです。しかしながら、これではファイルシステム全体で CoW を無効にすることになります。
 
   
  +
==== サブボリュームの削除 ====
{{Note|{{ic|nodatacow}} は新規作成されたファイルにのみ影響します。既存のファイルにはまだ CoW が行われる可能性があります。}}
 
   
  +
サブボリュームを削除するには
ファイルやディレクトリ単体で CoW を無効化するには、次のコマンドを使って下さい:
 
   
  +
# btrfs subvolume delete ''/path/to/subvolume''
$ chattr +C </dir/file>
 
   
  +
Linux 4.18 以降では、通常のディレクトリのようにサブボリュームを削除することもできます ({{ic|rm -r}}, {{ic|rmdir}})
以上のコマンドで CoW が無効化されるのはファイルの参照が一つしかない操作の場合に限られます。複数の参照がある場合 (例: {{ic|1=cp --reflink=always}} を使用したりファイルシステムのスナップショットが存在する場合)、CoW は依然として実行されます。
 
   
  +
==== サブボリュームをマウントする ====
{{Note|chattr の man ページより: btrfs では、 'C' フラグは新しい、または空のファイルにセットしなければなりません。既にデータブロックを持つファイルにフラグを設定した場合、ファイルに新しいブロックが割り当てられると完全な安定のためにフラグの定義が消されます。ディレクトリに 'C' フラグがセットされている場合、そのディレクトリ自体には影響がなく、ディレクトリに作成された新しいファイルに {{ic|No_COW}} 属性が付けられます。}}
 
   
  +
サブボリュームは {{ic|1=subvol=''/path/to/subvolume''}} や {{ic|1=subvolid=''objectid''}} マウントフラグを使うことでファイルシステムのパーティションと同じようにマウントできます。例えば、{{ic|subvol_root}} という名前のサブボリュームが存在したら {{ic|/}} にマウントすることができます。ファイルシステムのトップレベルにサブボリュームを作成して適切なマウントポイントにマウントすることで、伝統的なファイルシステムのパーティションと同じように使うことができ、[[Btrfs#スナップショット|スナップショット]] を使用してファイルシステムを前の状態に簡単に戻すことが可能です。
{{Tip|上の 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
 
作業中にファイルが使用されないように気を付けてください。また、 {{ic|mv}} や下で説明する {{ic|cp --reflink}} では CoW を無効にできないことに注意してください。
 
}}
 
   
  +
{{Tip|1=トップレベルのサブボリューム (ID=5) を {{ic|/}} として使用しないことでサブボリュームのレイアウトの変更を簡単にできます。サブボリュームを作成して実際のデータを保存して {{ic|/}} にマウントします。}}
同じように、ファイルのコピー時に CoW を強制してスペースを節約するには次を使って下さい (デフォルトでは {{ic|cp}} を使った場合、実際にデータがコピーされます):
 
   
  +
{{Note|{{man|5|btrfs|MOUNT OPTIONS}} から
$ cp --reflink source dest
 
  +
:ほとんどのマウントオプションは '''ファイルシステム全体''' に適用され、マウントされる最初のサブボリュームのオプションだけが有効になります。これは実装不足によるもので、将来的に変更されるかもしれません。
   
  +
サブボリュームごとにどのマウントオプションが使えるかは [https://btrfs.wiki.kernel.org/index.php/FAQ#Can_I_mount_subvolumes_with_different_mount_options.3F Btrfs Wiki FAQ] を見て下さい。
dest ファイルが変更されると、元から変更されたブロックだけがディスクに書き込まれます。cp を 'cp --reflink=auto' にするエイリアスを作ってもいいかもしれません。
 
  +
}}
   
  +
[[Snapper#推奨ファイルシステムレイアウト]], [https://btrfs.wiki.kernel.org/index.php/SysadminGuide#Managing_Snapshots Btrfs SysadminGuide#Managing Snapshots], [https://btrfs.wiki.kernel.org/index.php/SysadminGuide#Layout Btrfs SysadminGuide#Layout] などにサブボリュームを使用するファイルシステムレイアウトの例が存在します。
=== マルチデバイスファイルシステムと RAID 機能 ===
 
   
  +
btrfs 固有のマウントオプションの完全なリストは {{man|5|btrfs}} を見て下さい。
[https://btrfs.wiki.kernel.org/index.php/Using_Btrfs_with_Multiple_Devices Using Btrfs with Multiple Devices] の提案も見て下さい。
 
   
  +
==== サブボリュームをルートとしてマウントする ====
====マルチデバイスファイルシステム====
 
   
  +
サブボリュームをルートマウントポイントとして使用するには、{{ic|1=rootflags=subvol=''/path/to/subvolume''}} を使用して [[カーネルパラメータ#設定|カーネルパラメータ]] 経由でサブボリュームを指定します。{{ic|/etc/fstab}} でルート・マウントポイントを編集し、マウント・オプションに {{ic|1=subvol=}} を指定します。または、サブボリュームの ID {{ic|1=rootflags=subvolid=''objectid''}} をカーネルパラメータとして使い、{{ic|1=subvolid=''objectid''}} を {{ic|/etc/fstab}} のマウントオプションとして指定することもできます。
{{Note|適当な ''.device'' ジョブ以外でマルチデバイスファイルシステムをマウントするとファイルシステムの [https://github.com/systemd/systemd/issues/1921 バグ] が原因でフリーズして systemd が起動できなくなります。}}
 
   
  +
==== デフォルトのサブボリュームを設定する ====
''btrfs'' ファイルシステムを作成する際に、''mkfs.btrfs'' したい分だけのパーティション・デバイスを指定することができます。ファイルシステムは指定された全てのデバイスにわたって作成されます。このように '''"'''pool'''"''' することによって、複数のパーティションやデバイスを一つの大きな ''btrfs'' ファイルシステムにできるのです。
 
   
  +
マウントオプションに {{ic|1=subvol=}} が指定されない場合、デフォルトのサブボリュームがマウントされます。デフォルトサブボリュームを変更するには、次のようにします。
また、既に存在している btrfs ファイルシステムからデバイスを追加・削除することも可能です(用心が必要ですが)。
 
   
  +
# btrfs subvolume set-default ''subvolume-id'' /
(btrfs ボリュームとも呼ばれる) マルチデバイス ''btrfs'' ファイルシステムは {{ic|btrfs device scan}} を実行するまで認識されません。''btrfs'' mkinitcpio フックがこれを行います。
 
   
  +
ここで、''subvolume-id'' は [[Btrfs#サブボリュームを一覧する|listing]] で見つけることができます。
====RAID 機能====
 
   
  +
{{Note|1=[[GRUB]] があるシステムでデフォルトのサブボリュームを変更した後、ブートローダに変更を通知するために {{ic|grub-install}} を再度実行する必要があります。[https://bbs.archlinux.org/viewtopic.php?pid=1615373 このフォーラムのスレッド] を参照してください。}}
{{Note|カーネル 3.19 から、復元や再構築のコードもマージされています。通常の使用に耐えうるようになっています。新しいコードなので、安定化するのは次かその次のバージョンのカーネルになると思われます。}}
 
   
  +
{{ic|btrfs subvolume set-default}} でデフォルトのサブボリュームを変更すると、ファイルシステムのトップレベルは {{ic|1=subvol=/}} や {{ic|1=subvolid=5}} マウントオプションを使ってアクセスする以外ではアクセスできなくなります [https://btrfs.wiki.kernel.org/index.php/SysadminGuide]
マルチデバイスファイルシステムを作成するとき、ファイルシステムに追加したデバイス全体で RAID0, RAID1, RAID10, RAID5, RAID6 を使うように指定することもできます。RAID レベルはデータとメタデータで別個に適用することができます。デフォルトでは、メタデータはシングルボリュームやマルチディスクの RAID1 で複製されます。
 
   
  +
=== クォータ ===
btrfs は raid0, raid1, raid10 のブロックペアで動作します:
 
   
  +
{{warning|Qgroup はまだ安定状態ではなくサブボリュームのスナップショットとクォータを組み合わせると操作によってパフォーマンスに問題をきたします (スナップショットの削除など)。さらに [https://btrfs.wiki.kernel.org/index.php/Quota_support#Known_issues 既知の問題] が存在しています。}}
raid0 - 2つのデバイスに分散されるブロックペア
 
   
  +
Btrfs におけるクォータのサポートはクォータグループ (qgroup) を利用してサブボリュームレベルで実装されています: 各サブボリュームにはデフォルトで ''0/<subvolume id>'' という形式でクォータグループが割り当てられています。必要であればクォータグループを作成することもできます。
raid1 - 2つのデバイスに書き込まれるブロックペア
 
   
  +
クォータグループを使うにはまずクォータを有効にする必要があります:
マウント中に {{ic|btrfs balance}} コマンドを使って RAID レベルを変更することができます:
 
   
  +
# btrfs quota enable <path>
# btrfs balance start -mconvert=RAIDレベル -dconvert=RAIDレベル マウントポイント
 
   
  +
上記のコマンドを実行してから新しいサブボリュームを作成すると、グループによって制御が可能になります。既存のサブボリュームでも制御を行いたい場合、クォータを有効にしてから、''<subvolume id>'' を使ってサブボリュームごとにクォータグループを作成して再スキャンしてください:
ディスクが2つある場合、md-raid ([[mdadm]]) で定義する raid レベルと一致します。ディスクが3つ以上の場合は、md-raid とは全く異なるものになります。
 
   
  +
# btrfs subvolume list <path> | cut -d' ' -f2 | xargs -I{} -n1 btrfs qgroup create 0/{} <path>
例えば:
 
  +
# btrfs quota rescan <path>
* md による raid1 の3つの 1TB ディスクを使って、1TB の空き容量で、2つのディスクを失ってもデータが消失しないようにすることが出来ます。
 
* data=raid1 の Btrfs ボリュームの3つの 1TB ディスクを使って、満杯になるまでほぼ 1.5TB のデータを保存することができます。ディスクが1つなくなってもデータは消失しません。
 
   
  +
Btrfs のクォータグループはツリー構造になっていて、サイズ制限はクォータグループごとに設定し、ツリーに属しているサブボリュームに制限が課せられます。
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 と同じです)。詳しくは [https://btrfs.wiki.kernel.org/index.php/FAQ#How_much_space_do_I_get_with_unequal_devices_in_RAID-1_mode.3F BTRFS FAQ] を参照。
 
   
  +
クォータグループで設定できる制限は合計データ使用量・非共有のデータ使用量・圧縮データ使用量、あるいはそれらを組み合わせたものです。元のボリュームファイルを削除してコピーを残す場合、他のクォータグループの非共有制限が変わるため、ファイルのコピーや削除で制限に抵触する可能性があります。例えば、新しいスナップショットが元のサブボリュームの全てのブロックと同じデータを持っている場合、どちらかのサブボリュームだけで共通データを削除するともう片方のサブボリュームの制限に引っかかる可能性があります。
{{Warning|パリティ RAID (RAID 5/6) のコードにはデータを消失する可能性のある深刻なバグが存在します。詳しくは Btrfs Wiki の [https://btrfs.wiki.kernel.org/index.php/RAID56 RAID5/6] のページや [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg55161.html linux-btrfs メーリングリスト] のバグレポートを読んでください。}}
 
   
  +
クォータグループに制限を設定するには、{{ic|btrfs qgroup limit}} コマンドを使います。合計使用量の制限や非共有制限 ({{ic|-e}}) または圧縮制限 ({{ic|-c}}) が設定できます。ファイルシステムの特定のパスにおける使用量や制限を表示するには:
=== サブボリューム ===
 
   
  +
# btrfs qgroup show -reF <path>
btrfs の機能のひとつにサブボリュームがあります。サブボリュームは基本的にファイルとディレクトリを保持している名前の付いた b 木です。root ツリーのツリーの中に inode を持ち、root 以外の所有者やグループも設定できます。サブボリュームは任意でブロックを割り当てることもできます。ブロックとファイルエクステントの全ては参照カウントでありスナップショットを可能にしています。仮想マシンの動的な容量拡張に似て、必要な時に必要な分だけのデバイス上の容量を使います。また、サブボリュームを異なったマウントオプションを使ってマウントすることでセキュリティの柔軟性を持たせることもできます。
 
   
  +
=== コミット間隔の設定 ===
==== サブボリュームを作成する ====
 
   
  +
データがファイルシステムに書き込まれる解像度は、Btrfs自体とシステム全体の設定によって決まります。 Btrfs のデフォルトは、新しいデータがファイルシステムにコミットされる30秒のチェックポイント間隔です。これは、btrfs パーティションの {{ic|/etc/fstab}} に {{ic|commit}} マウントオプションを追加することで変更できます。
サブボリュームを作成するには:
 
# btrfs subvolume create ''/path/to/subvolume''
 
   
  +
LABEL=arch64 / btrfs defaults,compress=zstd,commit=120 0 0
==== サブボリュームを一覧する ====
 
   
  +
システム全体の設定もコミット間隔に影響します。これらには {{ic|/proc/sys/vm/*}} の下のファイルが含まれており、このwiki記事の範囲外です。それらのカーネルドキュメントは、https://www.kernel.org/doc/html/latest/admin-guide/sysctl/vm.html で入手できます。
現在のサブボリュームのリストを表示するには:
 
   
  +
=== SSD TRIM ===
# btrfs subvolume list -p .
 
   
  +
Btrfs ファイルシステムは、TRIM コマンドをサポートする SSD ドライブから未使用のブロックを解放できます。カーネルバージョン 5.6 以降、非同期破棄がサポートされ、マウントオプション {{ic|1=discard=async}} で有効になります。解放されたエクステントはすぐには破棄されませんが、グループ化され、後で別のワーカースレッドによってトリミングされるため、コミットの待ち時間が短縮されます。
==== サブボリュームをマウントする ====
 
   
  +
TRIM の有効化と使用に関するより詳しい情報は [[ソリッドステートドライブ#TRIM]] に記載されています。
サブボリュームは {{ic|1=subvol=''/path/to/subvolume''}} や {{ic|1=subvolid=''objectid''}} マウントフラグを使うことでファイルシステムのパーティションと同じようにマウントできます。例えば、{{ic|subvol_root}} という名前のサブボリュームが存在したら {{ic|/}} にマウントすることができます。ファイルシステムのトップレベルにサブボリュームを作成して適切なマウントポイントにマウントすることで、伝統的なファイルシステムのパーティションと同じように使うことができ、[[#スナップショット|スナップショット]]を使用してファイルシステムを前の状態に簡単に戻すことが可能です。
 
   
  +
== 使い方 ==
{{Tip|1=トップレベルのサブボリューム (ID=5) を {{ic|/}} として使用しないことでサブボリュームのレイアウトの変更を簡単にできます。サブボリュームを作成して実際のデータを保存して {{ic|/}} にマウントします。}}
 
   
  +
=== スワップファイル ===
[[Snapper#推奨ファイルシステムレイアウト]], [https://btrfs.wiki.kernel.org/index.php/SysadminGuide#Managing_Snapshots Btrfs SysadminGuide#Managing Snapshots], [https://btrfs.wiki.kernel.org/index.php/SysadminGuide#Layout Btrfs SysadminGuide#Layout] などにサブボリュームを使用するファイルシステムレイアウトの例が存在します。
 
   
  +
Btrfs の [[スワップファイル]] は Linux カーネル5.0 以降でサポートされています。[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=ed46ff3d423780fa5173b38a844bf0fdb210a2a7] スワップファイルを初期化する適切な方法は、最初にファイルをホストする非圧縮、非スナップショットのサブボリュームを作成し、そのディレクトリに ''cd'' してから、長さゼロのファイルを作成し、{{ic|No_COW}} を設定することです。 属性を [https://wiki.archlinux.jp/index.php/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E3%83%91%E3%83%BC%E3%83%9F%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A8%E5%B1%9E%E6%80%A7#chattr_.E3.81.A8_lsattr chattr] で指定し、圧縮が無効になっていることを確認します。
===== マウントオプション =====
 
   
  +
# cd ''/path/to/swapfile''
{{ic|1=subvol=}} でサブボリュームをマウントする際、複数のマウントオプションが利用できます。例えば、[[#圧縮|圧縮]]や[[#コピーオンライト (CoW)|コピーオンライト (CoW)]] に関するマウントオプションが使えます。
 
  +
# truncate -s 0 ./swapfile
  +
# chattr +C ./swapfile
  +
# btrfs property set ./swapfile compression none
   
  +
詳細な設定については、 [https://wiki.archlinux.jp/index.php/%E3%82%B9%E3%83%AF%E3%83%83%E3%83%97#.E3.82.B9.E3.83.AF.E3.83.83.E3.83.97.E3.83.95.E3.82.A1.E3.82.A4.E3.83.AB.E3.81.AE.E4.BD.9C.E6.88.90 スワップファイルの作成] を参照してください。スワップファイルへの休止状態の構成については、[https://wiki.archlinux.org/index.php/Power_management/Suspend_and_hibernate#Hibernation_into_swap_file_on_Btrfs Hibernation into swap file on Btrfs]で説明されています。
詳しくは [https://btrfs.wiki.kernel.org/index.php/Mount_options Btrfs Wiki Mount options] や [https://btrfs.wiki.kernel.org/index.php/Gotchas Btrfs Wiki Gotchas] を見てください。様々なマウントオプションを使うことで Btrfs の特性は大きく変わります。活発に開発されているファイルシステムであるため、リグレッションも考慮してください。[[#参照|参照]]セクションには複数のベンチマークへのリンクが存在します。
 
   
  +
{{Note|1=Linux カーネル5.0 以降、 Btrfs にはネイティブスワップファイルのサポートがありますが、いくつかの制限があります。
{{Warning|特定のマウントオプションは安全を保証するための機能を無効化して、ファイルシステムが完全に破損する危険性を引き上げてしまいます。}}
 
  +
* スワップファイルをスナップショットサブボリュームに置くことはできません。適切な手順は、スワップファイルを配置する新しいサブボリュームを作成することです。
  +
* 複数のデバイスにまたがるファイルシステム上のスワップファイルはサポートされていません。 [https://btrfs.wiki.kernel.org/index.php/FAQ#Does_btrfs_support_swap_files.3F Btrfs wiki: Does btrfs support swap files?] および [https://bbs.archlinux.org/viewtopic.php?pid=1849371#p1849371 Arch forums discussion]。
  +
}}
   
  +
=== 使用領域 空き領域の表示 ===
==== サブボリュームをルートとしてマウントする ====
 
   
  +
{{man|1|df}} のような一般的な linux ユーザースペースツールは Btrfs パーティションの空き容量を不正確に報告します。Btrfs パーティションを調べるには {{ic|btrfs filesystem usage}} を使うことが推奨されます。例えば、デバイスのアロケーションと使用状況の統計の完全な内訳を見るには、{{ic|btrfs filesystem usage}} を使って下さい。
サブボリュームをルートマウントポイントとして使用するには、{{ic|1=rootflags=subvol=''/path/to/subvolume''}} を使用して [[カーネルパラメータ#設定|カーネルパラメータ]] 経由でサブボリュームを指定します。{{ic|/etc/fstab}} でルート・マウントポイントを編集し、マウント・オプションに {{ic|1=subvol=}} を指定します。または、サブボリュームの ID {{ic|1=rootflags=subvolid=''objectid''}} をカーネルパラメータとして使い、{{ic|1=subvolid=''objectid''}} を {{ic|/etc/fstab}} のマウントオプションとして指定することもできます。
 
   
  +
# btrfs filesystem usage /
==== デフォルトのサブボリュームを設定する ====
 
   
  +
{{Note|現在、{{ic|btrfs filesystem usage}} コマンドは {{ic|RAID5/RAID6}} では正しく動作していません。}}
{{Warning|{{ic|btrfs subvolume set-default}} でデフォルトのサブボリュームを変更すると、{{ic|1=subvolid=0}} マウントオプションを使わない限り、ファイルシステムのトップレベルがアクセスできなくなります。参照: [https://btrfs.wiki.kernel.org/index.php/SysadminGuide Btrfs Wiki Sysadmin Guide]。}}
 
   
  +
あるいは、{{ic|btrfs filesystem df}} を使えば、root で実行しなくても、割り当てられた領域の使用状況を素早くチェックすることができます。
{{ic|1=subvol=}} マウントオプションが指定されていない場合、デフォルトのサブボリュームがマウントされます。
 
   
# btrfs subvolume set-default ''subvolume-id'' /.
+
$ btrfs filesystem df /
   
  +
詳しくは [https://btrfs.wiki.kernel.org/index.php/FAQ#How_much_free_space_do_I_have.3F] を参照してください。
'''サンプル:'''
 
   
  +
{{man|1|du}} や {{man|1|ncdu}} のような、ファイルシステムのあるサブセットについて空間の使用状況を分析するツールにも同じ制限が適用され、これらは reflinks, snapshots, 圧縮を考慮しません。代わりに、btrfs を意識した代替手段は {{AUR|btdu}} と [[Btrfs#圧縮の種類と比率を表示する|圧縮の種類と比率を表示する]] を見て下さい。
{{hc|# 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 .
 
   
  +
{{Warning|Linux カーネル バージョン 5.16.x < 5.16.5 のメジャーレグレッションにより、一部のシステムで Btrfs デフラグが無限ループし、手動および自動デフラグの両方に影響があります。これにより、影響を受けるドライブに極端な I/O 負荷がかかり、ドライブの寿命が極端に短くなり、パフォーマンスに影響を与える可能性があります。このため、これらのバージョンで {{ic|autodefrag}} を使うことは推奨されません。むしろ {{ic|noautodefrag}} を使ってオンラインデフラグが無効になるようにすべきです。[https://www.reddit.com/r/linux/comments/sgybyr/psa_linux_516_has_major_regression_in_btrfs/] と [https://lore.kernel.org/linux-btrfs/CAEwRaO4y3PPPUdwYjNDoB9m9CLzfd3DFFk2iK1X6OyyEWG5-mg@mail.gmail.com/] を参照してください。}}
'''リセット:'''
 
   
  +
Btrfs はマウントオプション {{ic|autodefrag}} でオンラインデフラグをサポートしています、{{man|5|btrfs|MOUNT OPTIONS}} を見て下さい。手動でルートのデフラグをするには:
# btrfs subvolume set-default 0 .
 
   
  +
# btrfs filesystem defragment -r /
==== スナップショット ====
 
   
  +
上記のコマンドを {{ic|-r}} スイッチなしで使用すると、ディレクトリを含むサブボリュームが保持するメタデータのみがデフラグされる結果となります。このため、パスを指定するだけで単一ファイルのデフラグが可能です。
詳しくは [https://btrfs.wiki.kernel.org/index.php/SysadminGuide#Snapshots Btrfs Wiki SysadminGuide#Snapshots] を見て下さい。
 
   
  +
COW コピー (スナップショット コピーまたは {{ic|cp}} や bcp で作成されたもの) を持つファイルに圧縮アルゴリズムで {{ic|-c}} スイッチを使用したデフラグを行うと、無関係の 2 つのファイルが効果的にディスク使用量を増加させる結果になることがあります。
スナップショットを作成するには:
 
   
  +
=== RAID ===
# btrfs subvolume snapshot ''source'' [''dest''/]''name''
 
   
  +
Btrfs は [[Btrfs#マルチデバイス対応ファイルシステム|マルチデバイス対応ファイルシステム]] のためのネイティブな ''RAID'' を提供します。btrfs RAID を [[mdadm]] と区別する注目すべき機能は自己回復型の冗長アレイとオンラインバランシングです。より詳しい情報は [https://btrfs.wiki.kernel.org/index.php/Using_Btrfs_with_Multiple_Devices the Btrfs wiki page] を見て下さい。Btrfs sysadmin ページにも [https://btrfs.wiki.kernel.org/index.php/SysadminGuide#RAID_and_data_replication にセクションがありますので参照して下さい。] 技術的な背景があります。
スナップショットは再帰的ではありません、つまりサブボリューム内にある全てのサブボリュームはスナップショットでは空のディレクトリになります。
 
   
  +
{{Warning|Parity RAID (RAID 5/6) コードには、複数の重大なデータ損失のバグがあります。より詳細な情報は Btrfs Wiki の [https://btrfs.wiki.kernel.org/index.php/RAID56 RAID5/6 page] と [https://lore.kernel.org/linux-btrfs/8695beeb-f991-28c4-cf6b-8c92339e468f@inwind.it/ linux-btrfs mailing list] のバグレポートを見て下さい。2020年6月、誰かが [https://lore.kernel.org/linux-btrfs/20200627030614.GW10769@hungrycats.org/ 現在の問題の包括的なリスト] と [https://lore.kernel.org/linux-btrfs/20200627032414.GX10769@hungrycats.org/ 役に立つ回復ガイド] を投稿しています}}
==== 送信/受信 ====
 
   
  +
==== Scrub ====
サブボリュームは {{ic|send}} コマンドを使って標準出力やファイルに送信することができます。Btrfs の {{ic|receive}} コマンドにパイプで渡すことで非常に便利に使うことが可能です。例えば、{{ic|/root_backup}} という名前のスナップショットを {{ic|/backup}} に送信するには以下のコマンドを実行します:
 
   
  +
[https://btrfs.wiki.kernel.org/index.php/Glossary Btrfs Wiki Glossary] によると、Btrfs スクラブはオンラインファイルシステムチェックツールです。ファイルシステム上のすべてのデータとメタデータを読み取り、チェックサムと RAID ストレージからの複製コピーを使用して、破損したデータを特定して修復します。
# btrfs send /root_backup | btrfs receive /backup
 
   
  +
{{Note|実行中のスクラブプロセスはシステムのサスペンドを防ぎます。詳細は [https://lore.kernel.org/linux-btrfs/20140227190656.GA28338@merlins.org/ このスレッド] を参照してください。}}
送信するスナップショットは読み取り専用である必要があります。上記のコマンドは外部デバイスにサブボリュームをコピーするのにも使えます (例えば上の {{ic|/backup}} を USB ディスクにマウント)。
 
   
  +
===== 手動で開始する =====
また、スナップショットの差分だけを送信することも可能です。例えば、上記のように {{ic|root_backup}} のコピーを送信したことがある場合、{{ic|root_backup_new}} という名前の読み取り専用のスナップショットを新しく作成してから、増加差分だけを {{ic|/backup}} に送信するには:
 
   
  +
{{ic|/}} を含むファイルシステムに対して (バックグラウンド) scrub を開始する場合。
# btrfs send -p /root_backup /root_backup_new | btrfs receive /backup
 
   
  +
# btrfs scrub start /
これで {{ic|root_backup_new}} という名前の新しいサブボリュームが {{ic|/backup}} に作成されます。
 
   
  +
実行中の scrub の状態を確認する。
差分バックアップをしたり自動的にバックアップを行うツールは [https://btrfs.wiki.kernel.org/index.php/Incremental_Backup Btrfs Wiki's Incremental Backup] を見てください。
 
   
  +
# btrfs scrub status /
=== デフラグメンテーション ===
 
   
  +
===== サービスまたはタイマーを使って起動する =====
Btrfs はオンラインデフラグをサポートしています。root フォルダのメタデータをデフラグするには、次を実行してください:
 
# btrfs filesystem defragment /
 
上のコマンドはファイルシステム全体のデフラグを''行いません''。詳しくは、btrfs wiki の[https://btrfs.wiki.kernel.org/index.php/Problem_FAQ#Defragmenting_a_directory_doesn.27t_work このページ]を見て下さい。
 
   
  +
{{Pkg|btrfs-progs}} パッケージは、指定したマウントポイントを毎月 scrubbing するためのユニット {{ic|btrfs-scrub@.timer}} を提供します。例えば {{ic|/}} の場合は {{ic|btrfs-scrub@-.timer}} 、{{ic|/home}} の場合は {{ic|btrfs-scrub@home.timer}} のように、エスケープしたパスでタイマーを [[有効化]] してください。パスのエスケープは {{ic|systemd-escape -p ''/path/to/mountpoint''}} で行えます、詳しくは {{man|1|systemd-escape}} を見て下さい。
ファイルシステム全体をデフラグするには、次を実行してください:
 
# btrfs filesystem defragment -r -v /
 
   
  +
scrub を実行するには {{ic|btrfs-scrub@.service}} を [[systemd#ユニットを使う|スタート]] します。(同じエンコードされたパスで) この方法の利点は {{ic|btrfs scrub}} と比べても同じです。(root ユーザーで) scrub の結果が [[systemd/ジャーナル]] に記録されることです。
=== 圧縮 ===
 
   
  +
冷却が不十分な大きな NVMe ドライブ (ラップトップなど) では、scrub はドライブを速く、長く読み込んで、ドライブを非常に高温にします。systemd で scrub を実行している場合、[[ドロップインファイル]] を使って {{man|5|systemd.resource-control}} にある {{ic|IOReadBandwidthMax}} オプションで簡単にスクラブ速度を制限することができます。
Btrfs は透過圧縮をサポートしています、これはパーティション上の全てのファイルが自動的に圧縮されることを意味します。このことはファイルの容量を減らすだけでなく、特に [https://www.phoronix.com/scan.php?page=article&item=btrfs_lzo_2638&num=1 lzo アルゴリズム] を使っている場合は [https://www.phoronix.com/scan.php?page=article&item=btrfs_compress_2635&num=1 パフォーマンスを向上させる] こともできます。
 
   
  +
==== Balance ====
圧縮は {{ic|1=compress=zlib}} か {{ic|1=compress=lzo}} マウントオプションを使って有効にします。マウントオプションが追加された後に作成・変更されたファイルだけに圧縮が適用されます。ただし、{{ic|btrfs filesystem defragment -c''alg''}} コマンドを使うことで既存のファイルに圧縮を適用することも簡単にできます (例えば ext3/4 から変換した後)。{{ic|''alg''}} は {{ic|zlib}} または {{ic|lzo}} のどちらかに置き換えてください。{{ic|lzo}} を使ってファイルシステム全体を再圧縮するには、次のコマンドを実行してください:
 
   
  +
balance はファイルシステム上の全てのデータをアロケータに再度流し込みます。デバイスが追加されたり削除された場合にファイルシステム上のデータを再配置するために実行します。balance はデバイスが故障した場合に、冗長な RAID レベルのコピーを再生成します。
# btrfs filesystem defragment -r -v -clzo /
 
   
  +
{{Pkg|btrfs-progs}}-3.12 から''バランシング''はバックグラウンドプロセスになりました - 詳しくは {{ic|man 8 btrfs-balance}} を見て下さい。
{{Tip|{{ic|compress}} マウントオプションを使わずファイルごとに圧縮を有効にすることも可能です。ファイルに {{ic|chattr +c}} を適用するだけです。ディレクトリに適用した場合、新しいファイルは自動的に圧縮されます。}}
 
   
  +
# btrfs balance start /
空の Btrfs パーティションに Arch をインストールする際に、[[ビギナーズガイド#ドライブの準備|ドライブの準備]]をした後 {{ic|compress}} オプションを設定してください。他のターミナルに切り替えて ({{ic|Ctrl+Alt+number}})、次のコマンドを実行してください:
 
  +
# btrfs balance status /
# mount -o remount,compress=lzo /mnt/target
 
   
  +
=== スナップショット ===
インストールが完了した後に、{{ic|/etc/[[fstab]]}} の root ファイルシステムのマウントオプションに {{ic|1=compress=lzo}} を加えて下さい。
 
   
  +
"スナップショットとは、btrfs の COW 機能を使って、そのデータ(とメタデータ)を他のサブボリュームと共有する、サブボリュームのことです" 詳しくは [https://btrfs.wiki.kernel.org/index.php/SysadminGuide#Snapshots Btrfs Wiki SysadminGuide#Snapshots] を見て下さい。
=== チェックポイントインターバル ===
 
Linux 3.12 から、チェックポイントインターバルをデフォルトの30秒から変えることができるようになっています。{{ic|/etc/fstab}} の btrfs パーティションに {{ic|commit}} マウントフラグを追加してください。
 
   
  +
スナップショットを作成するには
LABEL=arch64 / btrfs defaults,noatime,compress=lzo,commit=120 0 0
 
   
  +
# btrfs subvolume snapshot ''source'' [''dest''/]''name''
=== パーティショニング ===
 
   
  +
読み取り専用のスナップショットを作成するには、{{ic|-r}} フラグを追加します。readonly スナップショットの書き込み可能バージョンを作成するには、単純にそのスナップショットを作成します。
Btrfs はデータストレージデバイス全体を占領して [[Master Boot Record|MBR]] や [[GUID Partition Table|GPT]] パーティショニングスキームを置き換えることができます。[[#サブボリューム|サブボリューム]]を使ってパーティションを模すことが可能です。ディスクを一つしか使っていない場合、このアプローチにはいくつか制限があります:
 
   
  +
{{Note|{Note
* [[fstab|マウントポイント]]によって異なる[[ファイルシステム]]を使うことはできません
 
  +
* スナップショットを読み込み専用から書き込み専用に変換することは可能です。しかし、これは将来のインクリメンタル送受信で問題が発生するため、推奨されません[https://lore.kernel.org/linux-btrfs/06e92a0b-e71b-eb21-edb5-9d2a5513b718@gmail.com/] 新しい書き込み可能なスナップショットを作成することで、そのような問題を防ぐことができます。
* Btrfs は[[スワップ#スワップファイル|スワップファイル]]をサポートしていないので[[スワップ|スワップ領域]]を使うことができません。[[スワップ#スワップパーティション|スワップパーティション]]も作れません。ハイバネーションイメージはスワップ領域に保存されるので、ハイバネーション/レジュームも使えません
 
  +
* スナップショットは再帰的ではありません。ネストされたサブボリュームは、スナップショット内部では空のディレクトリになります。
* [[Unified Extensible Firmware Interface|UEFI]] を使って起動できません
 
  +
}}
   
  +
=== 送信/受信 ===
既存のパーティションテーブルを Btrfs で上書きするには、次のコマンドを実行してください:
 
# mkfs.btrfs /dev/sdX
 
{{ic|/dev/sdaX}} を指定するとパーティションスキーム全体を置き換える代わりに既存のパーティションがフォーマットされます。
 
   
  +
サブボリュームは {{ic|send}} コマンドを使って標準出力やファイルに送信することができます。Btrfs の {{ic|receive}} コマンドにパイプで渡すことで非常に便利に使うことが可能です。例えば、{{ic|/root_backup}} という名前のスナップショットを {{ic|/backup}} に送信するには以下のコマンドを実行します:
[[Master Boot Record|MBR]] のデータストレージデバイスと同じ方法で[[ブートローダー]]をインストールしてください。例えば [[GRUB]] なら:
 
# grub-install --recheck /dev/sdX
 
   
  +
# btrfs send /root_backup | btrfs receive /backup
{{Warning|{{ic|btrfs subvolume set-default}} コマンドを使ってデフォルトのサブボリュームをトップレベル (ID 0) 以外に変更すると GRUB を破壊するおそれがあります。リセットするには [[#デフォルトのサブボリュームを設定する]] を見て下さい。}}
 
   
  +
送信するスナップショットは読み取り専用である必要があります。上記のコマンドは外部デバイスにサブボリュームをコピーするのにも使えます (例えば上の {{ic|/backup}} を USB ディスクにマウント)。
=== Scrub ===
 
   
  +
また、スナップショットの差分だけを送信することも可能です。例えば、上記のように {{ic|root_backup}} のコピーを送信したことがある場合、{{ic|root_backup_new}} という名前の読み取り専用のスナップショットを新しく作成してから、増加差分だけを {{ic|/backup}} に送信するには:
Btrfs の scrub はオンラインのファイルシステムチェックツールです。ファイルシステム上の全てのデータとメタデータを読み込んで、チェックサムと RAID ストレージの重複コピーを使用してデータに破損がないか確認して修復を行います。
 
   
  +
# btrfs send -p /root_backup /root_backup_new | btrfs receive /backup
# btrfs scrub start /
 
# btrfs scrub status /
 
   
  +
これで {{ic|root_backup_new}} という名前の新しいサブボリュームが {{ic|/backup}} に作成されます。
{{Warning|scrub プロセスが動作しているとシステムはサスペンドできません、詳しくは [http://comments.gmane.org/gmane.comp.file-systems.btrfs/33106 このスレッド] を見て下さい。}}
 
   
  +
差分バックアップをしたり自動的にバックアップを行うツールは [https://btrfs.wiki.kernel.org/index.php/Incremental_Backup Btrfs Wiki's Incremental Backup] を見てください。
==== systemd サービス ====
 
   
  +
=== 重複排除 ===
{{Pkg|btrfs-progs}} パッケージには特定のマウントポイントをひと月毎にスクラブする {{ic|btrfs-scrub@.timer}} ユニットが付属しています。エンコードしたパスを指定してタイマーを[[有効化]]してください。例えば {{ic|/}} なら {{ic|btrfs-scrub@-.timer}} を、{{ic|/home}} なら {{ic|btrfs-scrub@home.timer}} を使います。
 
   
  +
コピーオンライトを使用した場合、Btrfs は実際にはデータをコピーしないでファイルやサブボリュームをコピーできます。ファイルに変更が加えられたときに新しい本当のコピーが作成されます。重複排除はさらに共通部分が存在するデータブロックを認識して、コピーオンライトと同じようにエクステントにまとめてしまいます。
{{ic|btrfs-scrub@.service}} を[[起動]]することで手動でスクラブを実行することもできます (同じくエンコードしたパスを指定してください)。{{ic|btrfs scrub}} コマンドを手動で実行するのとは違って systemd サービスを使うことで [[systemd#Journal|journal]] にログが記録されます。
 
   
  +
Btrfs パーティションの重複排除に使用するツールについては [https://btrfs.wiki.kernel.org/index.php/Deduplication#Batch 上流の Wiki エントリ] を見てください。{{Pkg|duperemove}}, {{aur|bedup}}, ''btrfs-dedup'' などが存在します。{{pkg|rmlint}} あるいは {{aur|jdupes}} などを使うことでファイルベースでデータの重複排除を行うこともできます。
=== Balance ===
 
   
  +
Btrfs の開発者はインバンド (同期的・インライン) 重複排除に取り組んでおり、新しいデータがファイルシステムに書き込まれたときに重複排除が実行されます。現在のところ実験的な機能としてツリー外で開発されています。新しい機能をテストしてみたい場合は [https://btrfs.wiki.kernel.org/index.php/User_notes_on_dedupe カーネルの wiki ページ] を参照してください。
balance はファイルシステム上の全てのデータをアロケータに再度流し込みます。デバイスが追加されたり削除された場合にファイルシステム上のデータを再配置するために実行します。balance はデバイスが故障した場合に、冗長な RAID レベルのコピーを再生成します。
 
   
  +
=== リサイズ ===
{{Pkg|btrfs-progs}}-3.12 から''バランシング''はバックグラウンドプロセスになりました - 詳しくは {{ic|man 8 btrfs-balance}} を見て下さい。
 
   
  +
{{Warning|データの損失を防ぐために、サイズ変更作業を始める前に必ずデータをバックアップしてください}}
# btrfs balance start /
 
# btrfs balance status /
 
   
  +
ファイルシステムは、デバイスで利用可能な最大のスペースまで拡大することができ、正確なサイズを指定することもできます。ファイルシステムのサイズを大きくする前に、デバイスまたは論理ボリュームのサイズを大きくすることを確認します。
=== SSD TRIM ===
 
  +
ファイルシステムに正確なサイズを指定する場合、新しいサイズが次の条件を満たすことを確認します。
   
  +
* 新しいサイズは既存のデータサイズより大きくなければなりません。
{{ic|discard}} オプションを使ってマウントした場合、Btrfs ファイルシステムは TRIM コマンドをサポートしている SSD ドライブの空きブロックを自動的に開放します。
 
  +
* ファイルシステムのサイズは、使用可能な領域を超えて拡張できないため、新しいサイズは現在のデバイスサイズと同じかそれ以下でなければなりません。
   
  +
デバイス上のファイルシステムのサイズを小さくする場合は、新しいサイズが以下の条件を満たすことを確認する。
SATA 3.1 よりも古い場合、TRIM コマンドは同期的で、コマンドが実行されている間は全ての I/O がブロックされます。ファイルシステムの同期などによって、プチフリーズが発生する可能性があります。このような場合、{{ic|discard}} を使用する代わりに定期的な trim を有効にすることができます:
 
   
  +
* 新しいサイズは既存のデータサイズより大きくなければなりません。
# systemctl enable fstrim.timer
 
  +
* ファイルシステムのサイズは使用可能な領域を超えて拡張できないため、新しいサイズは現在のデバイスのサイズと同じかそれ以下でなければなりません。
   
  +
{{Note|ファイルシステムを保持する論理ボリュームのサイズも小さくする場合は、デバイスまたは論理ボリュームのサイズを小さくする前に、必ずファイルシステムのサイズを小さくしてください。}}
SATA バージョンを確認するには次を実行:
 
   
  +
ファイルシステムのサイズをデバイスの利用可能な最大サイズに拡張するには、次のようにします。
# smartctl --info /dev/sd''X''
 
   
  +
# btrfs filesystem resize max /
詳しくは[[ソリッドステートドライブ#TRIM]] を参照。
 
   
  +
ファイルシステムを特定のサイズに拡張する場合。
=== 重複排除 ===
 
   
  +
# btrfs filesystem resize ''size'' /
コピーオンライトを使用した場合、Btrfs は実際にはデータをコピーしないでファイルやサブボリュームをコピーできます。ファイルに変更が加えられたときに新しい本当のコピーが作成されます。重複排除はさらに共通部分が存在するデータブロックを認識して、コピーオンライトと同じようにエクステントにまとめてしまいます。
 
   
  +
{{ic|''size''}} は、希望するサイズにバイト単位で置き換えてください。K(キロバイト)、M(メガバイト)、G(ギガバイト)など、値の単位を指定することも可能です。また、値の前にプラス (+) 記号、マイナス (-) 記号を付けることで、現在のサイズに対する増減をそれぞれ指定することも可能です。
Btrfs パーティションの重複排除に使用するツールについては [https://btrfs.wiki.kernel.org/index.php/Deduplication#Batch 上流の Wiki エントリ] を見てください。{{Pkg|duperemove}}, {{aur|bedup}}, ''btrfs-dedup'' などが存在します。{{pkg|rmlint}} あるいは {{aur|jdupes}} などを使うことでファイルベースでデータの重複排除を行うこともできます。
 
   
  +
# btrfs filesystem resize +''size'' /
Btrfs の開発者はインバンド (同期的・インライン) 重複排除に取り組んでおり、新しいデータがファイルシステムに書き込まれたときに重複排除が実行されます。現在のところ実験的な機能としてツリー外で開発されています。新しい機能をテストしてみたい場合は [https://btrfs.wiki.kernel.org/index.php/User_notes_on_dedupe カーネルの wiki ページ] を参照してください。
 
  +
# btrfs filesystem resize -''size'' /
   
 
== 既知の問題 ==
 
== 既知の問題 ==
401行目: 397行目:
   
 
既存の Btrfs ファイルシステムは [[EncFS]] や [[TrueCrypt]] のようなものを使用できますが、おそらく Btrfs の機能の一部はありません。
 
既存の Btrfs ファイルシステムは [[EncFS]] や [[TrueCrypt]] のようなものを使用できますが、おそらく Btrfs の機能の一部はありません。
 
=== TLP ===
 
 
TLP を使用するには、ファイルシステムの破損を回避するために特別な予防措置が必要です。 詳細については、 [[TLP#Btrfs|TLP の Btrfs セクション]] を参照してください。
 
   
 
=== btrfs チェックの問題 ===
 
=== btrfs チェックの問題 ===
ツール{{ic|btrfs check}} には既知の問題があるため、セクション [[#btrfscheck]] をよく参照してから実行してください。
+
ツール{{ic|btrfs check}} には既知の問題があるため、セクション [[#btrfs check]] をよく参照してから実行してください。
   
 
== ヒントとテクニック ==
 
== ヒントとテクニック ==
430行目: 422行目:
 
たとえば、 {{ic|/dev/sda1}} ではなく {{ic|/dev/sda}} を使用します。後者は、パーティショニングスキーム全体を置き換えるのではなく、既存のパーティションをフォーマットします。ルートパーティションは Btrfs なので、 {{ic|btrfs}} がカーネルに組み込まれていることを確認するか、 {{ic|btrfs}} を [[mkinitcpio.conf#MODULES]] と [https://wiki.archlinux.jp/index.php/Mkinitcpio#.E3.82.A4.E3.83.A1.E3.83.BC.E3.82.B8.E4.BD.9C.E6.88.90.E3.81.A8.E3.82.A2.E3.82.AF.E3.83.86.E3.82.A3.E3.83.99.E3.83.BC.E3.82.B7.E3.83.A7.E3.83.B3 initramfsを再生成する] に入れてください。
 
たとえば、 {{ic|/dev/sda1}} ではなく {{ic|/dev/sda}} を使用します。後者は、パーティショニングスキーム全体を置き換えるのではなく、既存のパーティションをフォーマットします。ルートパーティションは Btrfs なので、 {{ic|btrfs}} がカーネルに組み込まれていることを確認するか、 {{ic|btrfs}} を [[mkinitcpio.conf#MODULES]] と [https://wiki.archlinux.jp/index.php/Mkinitcpio#.E3.82.A4.E3.83.A1.E3.83.BC.E3.82.B8.E4.BD.9C.E6.88.90.E3.81.A8.E3.82.A2.E3.82.AF.E3.83.86.E3.82.A3.E3.83.99.E3.83.BC.E3.82.B7.E3.83.A7.E3.83.B3 initramfsを再生成する] に入れてください。
   
[https://wiki.archlinux.jp/index.php/Arch_%E3%83%96%E3%83%BC%E3%83%88%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9#.E3.83.96.E3.83.BC.E3.83.88.E3.83.AD.E3.83.BC.E3.83.80.E3.83.BC ブートローダ] を、 [https://wiki.archlinux.jp/index.php/%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8B%E3%83%B3%E3%82%B0#Master_Boot_Record マスターブートレコード] を備えたデータ記憶装置の場合と同様にインストールします。[[Syslinux#手動インストール]] または [[GRUB/Tips and tricks#パーティションまたはパーティションレスディスクへのインストール]] を参照してください。 {{ic|/sysrootをマウントできませんでした。}} が原因でカーネルがブートしない場合は、 {{ic|/etc/default/grub}} に {{ic|1=GRUB_PRELOAD_MODULES="btrfs"}} を追加して、 grub 設定 ([[GRUB#メインの構成ファイル生成する]]) を生成してください。
+
[https://wiki.archlinux.jp/index.php/Arch_%E3%83%96%E3%83%BC%E3%83%88%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9#.E3.83.96.E3.83.BC.E3.83.88.E3.83.AD.E3.83.BC.E3.83.80.E3.83.BC ブートローダ] を、 [https://wiki.archlinux.jp/index.php/%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8B%E3%83%B3%E3%82%B0#Master_Boot_Record マスターブートレコード] を備えたデータ記憶装置の場合と同様にインストールします。[[Syslinux#手動インストール]] または [[GRUB/Tips and tricks#パーティションまたはパーティションレスディスクへのインストール]] を参照してください。 {{ic|/sysrootをマウントできませんでした。}} が原因でカーネルがブートしない場合は、 {{ic|/etc/default/grub}} に {{ic|1=GRUB_PRELOAD_MODULES="btrfs"}} を追加して、 grub 設定 ([[GRUB#メイン設定ファイル生成]]) を生成してください。
   
 
=== Ext3/4 から Btrfs への変換 ===
 
=== Ext3/4 から Btrfs への変換 ===
   
 
{{Warning|btrfs メーリングリストには、不完全/破壊/破損した変換に関する多くの報告があります。 失いたくないデータや ''作業中'' のバックアップがあることを確認してください。 詳細については、 btrfswiki の [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3Conversion fromExt3] を参照してください。}}
 
{{Warning|btrfs メーリングリストには、不完全/破壊/破損した変換に関する多くの報告があります。 失いたくないデータや ''作業中'' のバックアップがあることを確認してください。 詳細については、 btrfswiki の [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3Conversion fromExt3] を参照してください。}}
{{Warning| btrfs-progs 5.6.1 以前にはバグがあり、最後のブロックグループのサイズが間違った btrfs ファイルシステムが生成され、新しく変換されたbtrfsをマウントできなくなります。 このバグは、 [https://github.com/kdave/btrfs-progs/commit/0ff7a9b5210723bd4ad0d9d78dbbb18ee8fdd2b1#diff-31168275dcaac634489082b54c4c66d0 thiscommit] の btrfs-progs5.7 で修正されています。 btrfs-progs5.7-1 以降の btrfs-convert を使用してください。}}
 
   
 
インストール CD から起動し、次の手順で変換します:
 
インストール CD から起動し、次の手順で変換します:
441行目: 432行目:
 
# btrfs-convert /dev/''partition''
 
# btrfs-convert /dev/''partition''
   
パーティションをマウントし、ファイルをチェックして変換をテストします変更を反映するために、必ず {{ic|/etc/fstab}} を変更してください( '''type''' を {{ic|btrfs}} に、 '''fs_passno''' [最後のフィールド] を {{ic|0}} Btrfs は起動時にファイルシステムチェックを行わないため)また、パーティションの UUID が変更されることに注意してください。したがって UUID を使用する場合それに応じ fstab を更新してください。 {{ic|chroot}} をシステムにインストールし、 GRUB メニューリストを再構築します ([[既存の Linux からインストール]] および [[GRUB]] の記事を参照)ルートファイルシステムを変換する場合、 chroot されたまま {{ic|mkinitcpio -p linux}} を実行して initramfs を再生成しないと、システムが正常に起動しません。 'unknown filesystem' で grub でスタックした場合は、 {{ic|grub-install /dev/''partition''}} で grub を再インストールし、構成も再生成してください {{ic|grub-mkconfig -o /boot/grub/grub.cfg}}
+
パーティションをマウントし、ファイルを確認して変換をテストしてください。 必ず {{ic|/etc/fstab}} を変更してください ({{ic|/etc/fstab}} の '''type''' を {{ic|btrfs}} に、 '''fs_passno'' をに変更すること) [最後のフィールド] を {{ic|0}} に設定します(Btrfs は起動時にファイルシステムチェックを行わないため)また、パーティションの UUID が変更されていることに注意してください、UUID を使うとき fstab もそれに合わせて更新してください。システムに {{ic|chroot}} して、ブーダのメニューリストを再構築します([[既存の Linux からインストール]] を参照)ルートファイルシステムを変換する場合、chroot たまま {{ic|mkinitcpio -p linux}} を実行して initramfs を再生成しないと、システムが正常に起動しません。
   
 
{{Note|新しく変換された btrfs にファイルをマウントまたは書き込みできないなどの問題がある場合は、バックアップサブボリューム {{ic|/ext2_saved}} がまだ存在する限り、常にロールバックするオプションがあります。 {{ic|btrfs-convert -r /dev/''partition''}} コマンドを使用してロールバックします。これにより、新しく変換された btrfs ファイルシステムへの変更が破棄されます。}}
 
{{Note|新しく変換された btrfs にファイルをマウントまたは書き込みできないなどの問題がある場合は、バックアップサブボリューム {{ic|/ext2_saved}} がまだ存在する限り、常にロールバックするオプションがあります。 {{ic|btrfs-convert -r /dev/''partition''}} コマンドを使用してロールバックします。これにより、新しく変換された btrfs ファイルシステムへの変更が破棄されます。}}
482行目: 473行目:
 
スナップショットをブートするためには、セクション [[Btrfs#サブボリュームをルートとしてマウントする|サブボリュームをルートとしてマウントする]] で説明されているように、サブボリュームをルートパーティションとしてマウントする場合と同じ手順が適用されます。スナップショットはサブボリュームのようにマウントできます。
 
スナップショットをブートするためには、セクション [[Btrfs#サブボリュームをルートとしてマウントする|サブボリュームをルートとしてマウントする]] で説明されているように、サブボリュームをルートパーティションとしてマウントする場合と同じ手順が適用されます。スナップショットはサブボリュームのようにマウントできます。
   
* [[GRUB]] を使用している場合、{{Pkg|grub-btrfs}} または {{AUR|grub-btrfs-git}} を使用して構成ファイルを再生成すると、自動的に btrfs スナップショットをブートメニューに取り込むことができます。
+
* [[GRUB]] を使用している場合、{{Pkg|grub-btrfs}} または {{AUR|grub-btrfs-git}} を使用して設定ファイルを再生成すると、自動的に btrfs スナップショットをブートメニューに取り込むことができます。
 
* [[rEFInd]] を使用している場合は、{{ic|refind-btrfs.service}} を [[systemd#ユニットを使う|有効]] にして開始後に、{{AUR|refind-btrfs}} を使用してブートメニューに btrfs スナップショットを自動的に取り込むことができます。
 
* [[rEFInd]] を使用している場合は、{{ic|refind-btrfs.service}} を [[systemd#ユニットを使う|有効]] にして開始後に、{{AUR|refind-btrfs}} を使用してブートメニューに btrfs スナップショットを自動的に取り込むことができます。
   
492行目: 483行目:
   
 
Btrfs は書き込み時にコピーの性質を持つため、ファイルにアクセスするだけでメタデータのコピーと書き込みを開始します。アクセス時間の更新頻度を減らすと、この予期しないディスク使用がなくなり、パフォーマンスが向上する可能性があります。使用可能なオプションについては、 [[fstab#atime オプション|atime オプション]] を参照してください。
 
Btrfs は書き込み時にコピーの性質を持つため、ファイルにアクセスするだけでメタデータのコピーと書き込みを開始します。アクセス時間の更新頻度を減らすと、この予期しないディスク使用がなくなり、パフォーマンスが向上する可能性があります。使用可能なオプションについては、 [[fstab#atime オプション|atime オプション]] を参照してください。
  +
  +
=== 外付けドライブへの増分バックアップ ===
  +
  +
以下のパッケージは {{ic|btrfs send}} と {{ic|btrfs receive}} を使って、外部ドライブに増分バックアップを送信します。実装や機能、要件の違いを見るにはそれぞれのドキュメントを参照してください。
  +
  +
* {{App|btrbk|Btrfs サブボリュームのスナップショットとリモートバックアップを作成するためのツール。|https://github.com/digint/btrbk|{{AUR|btrbk}}}}
  +
* {{App|buttersink|Buttersink は Btrfs スナップショット用の rsync のようなものです。|https://github.com/AmesCornish/buttersink.git|{{AUR|buttersink-git}}}}
  +
* {{App|snap-sync|[[Snapper]] スナップショットを使用して、外付けドライブまたはリモートマシンにバックアップします。|https://github.com/wesbarnett/snap-sync.git|{{Pkg|snap-sync}}}}
  +
* {{App|snapsync|[[Snapper]] の同期ツール。|https://github.com/doudou/snapsync|{{AUR|ruby-snapsync}}}}
  +
  +
以下のパッケージでは、Snapper のスナップショットを Btrfs 以外のファイルシステムへバックアップすることができます。
  +
  +
* {{App|snapborg|Snapper スナップショットを {{Pkg|borg}} バックアップと統合する borgmatic のようなツール。|https://github.com/enzingerm/snapborg|{{AUR|snapborg}}}}
   
 
== トラブルシューティング ==
 
== トラブルシューティング ==
501行目: 505行目:
 
==== パーティションオフセット ====
 
==== パーティションオフセット ====
   
[[GRUB]] Btrfs パーティションを起動すことができますが、そのモジュールは ext4 などよりも大きく、''grub-install'' よって作成される {{ic|core.img}} が MBR 最初のパーティションの間収まらない可能性があります。GPT使うか、最初のパーティションの前に数 MB の空きスペスを作ることこの問題を解決きます。
+
オフセットの問題パーティションのあディスクに {{ic|core.img}} を埋め込もうしたとき発生する可能性があります。つまり、GRUB の {{ic|core.img}} をパーティションレスディスク (例: {{ic|/dev/sd''X''}}) Btrfs ルに直接埋め込んも [[Special:Diff/319474|大丈夫]] です。
  +
  +
[[GRUB]] は Btrfs パーティションを起動できますが、モジュールが他の [[ファイルシステム]] よりも大きくなる可能性があります。また、{{ic|grub-install}} で作成した {{ic|core.img}} ファイルは、MBR と最初のパーティションの間にあるドライブの最初の 63 セクタ (31.5KiB) に収まらないかもしれません。{{ic|fdisk}} や {{ic|gdisk}} のような最新のパーティションツールは、最初のパーティションをおよそ 1MiB または 2MiB オフセットすることでこの問題を回避しています。
   
 
==== root が見つからない ====
 
==== root が見つからない ====
   
 
RAID セットアップから起動した時にエラー {{ic|1=error no such device: root}} が表示される場合、{{ic|/usr/share/grub/grub-mkconfig_lib}} を編集して {{ic|1=echo " search --no-floppy --fs-uuid --set=root ${hints} ${fs_uuid}"}} からクォートを削除してください。grub の設定を再生成すればエラーを出さずに起動できるはずです。
 
RAID セットアップから起動した時にエラー {{ic|1=error no such device: root}} が表示される場合、{{ic|/usr/share/grub/grub-mkconfig_lib}} を編集して {{ic|1=echo " search --no-floppy --fs-uuid --set=root ${hints} ${fs_uuid}"}} からクォートを削除してください。grub の設定を再生成すればエラーを出さずに起動できるはずです。
  +
  +
=== マウントがタイムアウト ===
  +
  +
特に大きな RAID1 アレイでは、ブート中にマウントがタイムアウトして、次のようなジャーナルメッセージが表示されることがあります。
  +
  +
{{bc|1=
  +
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]] のシステム固有のマウントオプション {{ic|x-systemd.mount-timeout}} で長いタイムアウトを指定することで簡単に回避することが可能です。例:
  +
  +
/dev/sda /storage btrfs rw,relatime,x-systemd.mount-timeout=5min 0 0
   
 
=== BTRFS: open_ctree failed ===
 
=== BTRFS: open_ctree failed ===
521行目: 544行目:
   
 
{{ic|/etc/mkinitcpio.conf}} の {{ic|HOOKS}} 行から {{ic|btrfs}} を削除して代わりに {{ic|MODULES}} 行に {{ic|btrfs}} を追加することで解決します。修正を施したら {{ic|mkinitcpio -p linux}} で initramfs を再生成して (必要ならプリセットを調整します) 再起動してください。
 
{{ic|/etc/mkinitcpio.conf}} の {{ic|HOOKS}} 行から {{ic|btrfs}} を削除して代わりに {{ic|MODULES}} 行に {{ic|btrfs}} を追加することで解決します。修正を施したら {{ic|mkinitcpio -p linux}} で initramfs を再生成して (必要ならプリセットを調整します) 再起動してください。
 
詳細は [https://bbs.archlinux.org/viewtopic.php?id=189845 フォーラムスレッド] や {{Bug|42884}} を見て下さい。
 
   
 
デバイスが存在しない raid アレイをマウントしようとしたときも同じエラーが表示されます。その場合は {{ic|/etc/fstab}} に {{ic|degraded}} マウントオプションを追加してください。ルートパーティションがアレイ上にある場合、[[カーネルパラメータ]]に {{ic|1=rootflags=degraded}} を追加してください。
 
デバイスが存在しない raid アレイをマウントしようとしたときも同じエラーが表示されます。その場合は {{ic|/etc/fstab}} に {{ic|degraded}} マウントオプションを追加してください。ルートパーティションがアレイ上にある場合、[[カーネルパラメータ]]に {{ic|1=rootflags=degraded}} を追加してください。
  +
  +
2016年8月現在、このバグの回避策として考えられるのは、{{ic|/etc/fstab}} で単一ドライブのみでアレイをマウントし、他のドライブは btrfs が自動的に発見して追記するようにすることです。UUID や LABEL のようなグループベースの識別子は、この不具合の原因になっているようです。例えば、'disk1' と 'disk2' からなる2デバイスの RAID1 アレイには UUID が割り当てられますが、UUID を使う代わりに {{ic|/dev/mapper/disk1}} のみを {{ic|/etc/fstab}} で使用します。より詳しい説明は、以下の [https://web.archive.org/web/20161108175034/http://blog.samcater.com/fix-for-btrfs-open_ctree-failed-when-running-root-fs-on-raid-1-or-raid10-arch-linux/ ブログ記事] を参照してください。
  +
  +
また、[[mkinitcpio#設定|mkinitcpio.conf]] の {{ic|udev}} フックを削除し、{{ic|systemd}} フックに置き換えることも可能な対処法です。この場合、{{ic|btrfs}} は{{ic|HOOKS}}や{{ic|MODULES}} 配列に ''not'' とする必要があります。
  +
  +
詳細は [https://bbs.archlinux.org/viewtopic.php?id=189845 フォーラムスレッド] や {{Bug|42884}} を見て下さい。
   
 
=== btrfs check ===
 
=== btrfs check ===
532行目: 559行目:
 
''[https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-check btrfs check]'' コマンドを使うことでアンマウントされた Btrfs ファイルシステムをチェックしたり修復することが可能です。ただし、この修復ツールはまだ開発中であり、特定のファイルシステムエラーは修復することができません。
 
''[https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-check btrfs check]'' コマンドを使うことでアンマウントされた Btrfs ファイルシステムをチェックしたり修復することが可能です。ただし、この修復ツールはまだ開発中であり、特定のファイルシステムエラーは修復することができません。
   
  +
=== 絶え間ないドライブアクティビティ ===
詳しくは [https://btrfs.wiki.kernel.org/index.php/Btrfsck Btrfsck] を参照。
 
  +
  +
[[カーネル]] バージョン 6.2 以降、{{ic|1=discard=async}} {{man|8|mount}} オプションがデフォルトで設定されています。これ [https://lore.kernel.org/linux-btrfs/Y%2F%2Bn1wS%2F4XAH7X1p@nz/#r 報告] により、廃棄キューがいっぱいになると、アイドル状態でも一部のドライブで一定のドライブアクティビティが発生し、処理されるよりも速くなります。これにより、特に NVMe ベースのドライブで電力使用量が増加する可能性があります。
  +
  +
回避策の 1 つは、ドライブのアクティビティが停止するまで破棄 {{ic|iops_limit}} を増やすことです。
  +
  +
これは、[[Wikipedia:sysfs|sysfs]] を使用して実現できます。例:
  +
  +
# echo 1000 > /sys/fs/btrfs/''uuid''/discard/iops_limit
  +
  +
ここで、{{ic|''uuid''}} は btrfs ファイルシステムの UUID です。{{ic|1000}} の制限は実験的に調整する必要があります。
  +
  +
起動時にパラメータを設定するには、[[systemd-tmpfiles]] を使用できます。たとえば、次のファイルを作成します。
  +
  +
{{hc|/etc/tmpfiles.d/btrfs-discard.conf|
  +
w /sys/fs/btrfs/''uuid''/discard/iops_limit - - - - 1000
  +
}}
  +
  +
あるいは、[[fstab]] の {{ic|nodiscard}} マウントオプションを使用してマウントし、代わりに [[ソリッドステートドライブ#定期的な TRIM|定期的な TRIM]] を使用して、非同期破棄を完全に無効にすることもできます。
   
 
== 参照 ==
 
== 参照 ==

2024年10月9日 (水) 01:01時点における最新版

関連記事

Btrfs Wiki より:

Btrfs は、耐障害性、修復、および簡単な管理に重点を置きながら、高度な機能を実装することを目的とした Linux 用の最新のコピーオンライト(CoW)ファイルシステムです。複数の企業で共同開発された Btrfs は、GPL に基づいてライセンスされており、誰からの寄付も受け付けています。
ノート: 他のファイルシステムと同様に、Btrfs は継続的に開発中です。これは、特定の機能がまだ日常的に使用できる状態になっていない可能性があります。使用事例が影響を受ける可能性があるかどうかを確認するには、Btrfs ドキュメントの Status とこの記事の 既知の問題 セクションを確認してください。

目次

準備

ユーザースペースのユーティリティについては、基本的な操作に必要な 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 を無効にすると、チェックサムも無効になります。 Btrfs は破損した nodatacow ファイルを検出できません。 RAID 1 と組み合わせると、停電やその他の破損原因により、データが同期しなくなる可能性があります。

マウントされたサブボリュームで新しく作成されたファイルのコピー オン ライトを無効にするには、nodatacow マウント オプションを使用します。これは、新しく作成されたファイルにのみ影響します。コピーオンライトは、既存のファイルに対して引き続き影響します。 nodatacow オプションも圧縮を無効にします。詳しくは btrfs(5) をご覧ください。

ノート: btrfs(5) § MOUNT OPTIONS から:
単一のファイル システム内で、一部のサブボリュームを nodatacow でマウントし、他のサブボリュームを datacow でマウントすることはできません。最初にマウントされたサブボリュームのマウント オプションは、他のサブボリュームに適用されます。

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

$ chattr +C </dir/file>

これにより、ファイルへの参照が 1つしかない操作のコピーオンライトが無効になります。複数の参照がある場合。ファイル クローン/軽量クローンまたはファイルシステムスナップショットが原因で、コピーオンライトが引き続き発生します。coreutils 9.0 以降、cp はデフォルトで軽量コピーを実行しようとすることに注意してください。詳細については、cp(1) を参照してください。

ノート: chattr(1) から:
btrfs の場合、'C' フラグを新しいファイルまたは空のファイルに設定する必要があります。すでにデータブロックがあるファイルに設定されている場合、ファイルに割り当てられたブロックが完全に安定する時期は未定義です。'C' フラグがディレクトリに設定されている場合、ディレクトリには影響しませんが、そのディレクトリに作成された新しいファイルには No_COW 属性が含まれます。
ヒント: 上記のメモに従い、次のトリックを使用して、ディレクトリ内の既存のファイルのコピーオンライトを無効にすることができます:
$ mv /path/to/dir /path/to/dir_old
$ mkdir /path/to/dir
$ chattr +C /path/to/dir
$ cp -a --reflink=never /path/to/dir_old/. /path/to/dir
$ rm -rf /path/to/dir_old
このプロセス中にデータが使用されていないことを確認してください。また、後述のように --reflink=never を指定しない mv または cp は機能しないことに注意してください。
スナップショットへの影響

ファイルのコピーオンライトが無効 (NOCOW) でスナップショットが作成された場合、スナップショットは古いファイルブロックを所定の位置にロックするため、スナップショット後のファイルブロックへの最初の書き込みは COW 操作 になります。ただし、ファイルは NOCOW 属性を保持し、同じファイルブロックへの後続の書き込みは次のスナップショットまでそのまま残ります。

スナップショットを頻繁に行うと、最初の書き込みで COW が必要になるため、NOCOW の効果が低下する可能性があります。そのようなファイルのコピーオンライトを完全に避けるには、それらを別のサブボリュームに入れ、そのサブボリュームのスナップショットを作成しないでください。

圧縮

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 サブボリュームはブロックデバイスではありません(そしてブロックデバイスとして扱えません)代わりに btrfs サブボリュームは POSIX ファイル名空間として考えることができます。このネームスペースはファイルシステムのトップレベルのサブボリュームからアクセスすることもできますし、それ自体でマウントすることもできます" [5]

各 Btrfs ファイルシステムには ID 5 のトップレベルのサブボリュームがあります。これは / としてマウントすることができます。(デフォルト) または、代わりに別のサブボリュームを マウントする こともできます。サブボリュームはファイルシステム内で移動することができ、パスよりもむしろその ID で識別されます。

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

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

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

# 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) を / として使用しないことでサブボリュームのレイアウトの変更を簡単にできます。サブボリュームを作成して実際のデータを保存して / にマウントします。
ノート: btrfs(5) § MOUNT OPTIONS から
ほとんどのマウントオプションは ファイルシステム全体 に適用され、マウントされる最初のサブボリュームのオプションだけが有効になります。これは実装不足によるもので、将来的に変更されるかもしれません。

サブボリュームごとにどのマウントオプションが使えるかは Btrfs Wiki FAQ を見て下さい。

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-idlisting で見つけることができます。

ノート: GRUB があるシステムでデフォルトのサブボリュームを変更した後、ブートローダに変更を通知するために grub-install を再度実行する必要があります。このフォーラムのスレッド を参照してください。

btrfs subvolume set-default でデフォルトのサブボリュームを変更すると、ファイルシステムのトップレベルは subvol=/subvolid=5 マウントオプションを使ってアクセスする以外ではアクセスできなくなります [6]

クォータ

警告: 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秒のチェックポイント間隔です。これは、btrfs パーティションの /etc/fstabcommit マウントオプションを追加することで変更できます。

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で説明されています。

ノート: 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 /

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

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

デフラグメンテーション

警告: Linux カーネル バージョン 5.16.x < 5.16.5 のメジャーレグレッションにより、一部のシステムで Btrfs デフラグが無限ループし、手動および自動デフラグの両方に影響があります。これにより、影響を受けるドライブに極端な I/O 負荷がかかり、ドライブの寿命が極端に短くなり、パフォーマンスに影響を与える可能性があります。このため、これらのバージョンで autodefrag を使うことは推奨されません。むしろ noautodefrag を使ってオンラインデフラグが無効になるようにすべきです。[9][10] を参照してください。

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 ページにも にセクションがありますので参照して下さい。 技術的な背景があります。

警告: Parity RAID (RAID 5/6) コードには、複数の重大なデータ損失のバグがあります。より詳細な情報は Btrfs Wiki の RAID5/6 pagelinux-btrfs mailing list のバグレポートを見て下さい。2020年6月、誰かが 現在の問題の包括的なリスト役に立つ回復ガイド を投稿しています

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

送信/受信

サブボリュームは 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 ファイルシステムは EncFSTrueCrypt のようなものを使用できますが、おそらく Btrfs の機能の一部はありません。

btrfs チェックの問題

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

ヒントとテクニック

パーティションレス 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 を参照してください。

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

# btrfs-convert /dev/partition

パーティションをマウントし、ファイルを確認して変換をテストしてください。 必ず /etc/fstab を変更してください (/etc/fstabtype'btrfs に、 fs_passno をに変更すること) [最後のフィールド] を 0 に設定します(Btrfs は起動時にファイルシステムのチェックを行わないため)また、パーティションの UUID が変更されていることに注意してください、UUID を使うときは fstab もそれに合わせて更新してください。システムに chroot して、ブートローダのメニューリストを再構築します(既存の Linux からインストール を参照)ルートファイルシステムを変換する場合、chroot したまま mkinitcpio -p linux を実行して initramfs を再生成しないと、システムが正常に起動しません。

ノート: 新しく変換された 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

パーティションオフセット

オフセットの問題は、パーティションのあるディスクに core.img を埋め込もうとしたときに発生する可能性があります。つまり、GRUB の core.img をパーティションレスディスク (例: /dev/sdX) の Btrfs プールに直接埋め込んでも 大丈夫 です。

GRUB は Btrfs パーティションを起動できますが、モジュールが他の ファイルシステム よりも大きくなる可能性があります。また、grub-install で作成した core.img ファイルは、MBR と最初のパーティションの間にあるドライブの最初の 63 セクタ (31.5KiB) に収まらないかもしれません。fdiskgdisk のような最新のパーティションツールは、最初のパーティションをおよそ 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.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 を再生成して (必要ならプリセットを調整します) 再起動してください。

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

2016年8月現在、このバグの回避策として考えられるのは、/etc/fstab で単一ドライブのみでアレイをマウントし、他のドライブは btrfs が自動的に発見して追記するようにすることです。UUID や LABEL のようなグループベースの識別子は、この不具合の原因になっているようです。例えば、'disk1' と 'disk2' からなる2デバイスの RAID1 アレイには UUID が割り当てられますが、UUID を使う代わりに /dev/mapper/disk1 のみを /etc/fstab で使用します。より詳しい説明は、以下の ブログ記事 を参照してください。

また、mkinitcpio.confudev フックを削除し、systemd フックに置き換えることも可能な対処法です。この場合、btrfsHOOKSMODULES 配列に not とする必要があります。

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

btrfs check

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

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

あるいは、fstabnodiscard マウントオプションを使用してマウントし、代わりに 定期的な TRIM を使用して、非同期破棄を完全に無効にすることもできます。

参照