「Btrfs」の版間の差分
細 |
Kusakata.bot2 (トーク | 投稿記録) (Pkg/AUR テンプレートの更新) |
||
(3人の利用者による、間の15版が非表示) | |||
1行目: | 1行目: | ||
[[Category:ファイルシステム]] |
[[Category:ファイルシステム]] |
||
[[en:Btrfs]] |
[[en:Btrfs]] |
||
− | [[ |
+ | [[fr:Btrfs]] |
+ | [[zh-hans:Btrfs]] |
||
{{Related articles start}} |
{{Related articles start}} |
||
{{Related|ファイルシステム}} |
{{Related|ファイルシステム}} |
||
+ | {{Related|mkinitcpio}} |
||
− | {{Related4|Btrfs - Tips and tricks}} |
||
+ | {{Related|Snapper}} |
||
− | {{Related4|Mkinitcpio-btrfs}} |
||
+ | {{Related|dm-crypt/システム全体の暗号化#Btrfs サブボリュームとスワップ}} |
||
{{Related articles end}} |
{{Related articles end}} |
||
[[Wikipedia:ja:Btrfs]] より: |
[[Wikipedia:ja:Btrfs]] より: |
||
− | :''Btrfs (B-tree File System: 読み方は "バター FS", "ベター FS", "B木 FS", "ビーティーアール FS" など) は Linux 向けの実験的なコピーオンライトのファイルシステムで GPL でライセンスされています。Oracle Corporation によって2007年から開発が開始されました。'' |
+ | :''Btrfs (B-tree File System: 読み方は "バター FS", "ベター FS", "B木 FS", "ビーティーアール FS" など) は Linux 向けの実験的なコピーオンライトのファイルシステムで GPL でライセンスされています。Oracle Corporation によって2007年から開発が開始されました。2014年8月にはディスク上のフォーマットが固まっています。'' |
[https://btrfs.wiki.kernel.org/index.php/Main_Page Btrfs Wiki] より: |
[https://btrfs.wiki.kernel.org/index.php/Main_Page Btrfs Wiki] より: |
||
16行目: | 18行目: | ||
:''Btrfs は Linux 用の全く新しいコピーオンライト (COW) のファイルシステムです。先進的な機能を実装することを目指しつつ、障害耐性を持ち簡単に管理できることに焦点が置かれています。Btrfs は Oracle, Red Hat, Fujitsu, Intel, SUSE, STRATO やその他多くの人々によって共同で開発されており GPL でライセンスされていて誰でも貢献できるように開かれています。'' |
:''Btrfs は Linux 用の全く新しいコピーオンライト (COW) のファイルシステムです。先進的な機能を実装することを目指しつつ、障害耐性を持ち簡単に管理できることに焦点が置かれています。Btrfs は Oracle, Red Hat, Fujitsu, Intel, SUSE, STRATO やその他多くの人々によって共同で開発されており GPL でライセンスされていて誰でも貢献できるように開かれています。'' |
||
+ | {{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] などを見てください。[[#既知の問題]]も参照。}} |
||
− | {{Warning| |
||
− | * Btrfs は未だに実験的であると考えられてます。詳しくは Btrfs Wiki の [https://btrfs.wiki.kernel.org/index.php/Main_Page#Stability_status Stability 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 はデフォルトのカーネルに含まれており、ツール ({{pkg|btrfs-progs}}) は[[公式リポジトリ]]から入手できます。[[ |
+ | Btrfs はデフォルトのカーネルに含まれており、ツール ({{pkg|btrfs-progs}}) は[[公式リポジトリ]]から入手できます。[[GRUB]], [[mkinitcpio]], [[Syslinux]] には Btrfs のサポートがあるので追加の設定は必要ありません。 |
=== 追加のパッケージ === |
=== 追加のパッケージ === |
||
* {{Pkg|btrfs-progs}} には Btrfs ファイルシステムのエラーを修正できるツール ''btrfsck'' が含まれています。 |
* {{Pkg|btrfs-progs}} には Btrfs ファイルシステムのエラーを修正できるツール ''btrfsck'' が含まれています。 |
||
− | * {{AUR|mkinitcpio-btrfs}} はロールバック機能を有効にします。 |
||
* {{AUR|btrfs-progs-git}} はナイトリービルドです。 |
* {{AUR|btrfs-progs-git}} はナイトリービルドです。 |
||
43行目: | 41行目: | ||
# mkfs.btrfs -L ''mylabel'' /dev/''partition'' |
# 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 になっています。}} |
+ | {{Note|1=2013年11月の[https://git.kernel.org/cgit/linux/kernel/git/mason/btrfs-progs.git/commit/?id=c652e4efb8e2dd76ef1627d8cd649c6af5905902 この] コミット以降、Btrfs のデフォルトのブロックサイズは 16KB になっています。}} |
− | 大きいブロックサイズをデータ・メタデータに使うには、下の例のように {{ic|- |
+ | 大きいブロックサイズをデータ・メタデータに使うには、下の例のように {{ic|-n}} スイッチを使って {{ic|nodesize}} の値を指定して下さい (例: 16KB ブロック): |
# mkfs.btrfs -L ''mylabel'' -l 16k /dev/''partition'' |
# mkfs.btrfs -L ''mylabel'' -l 16k /dev/''partition'' |
||
52行目: | 50行目: | ||
# mkfs.btrfs [options] /dev/<part1> /dev/<part2> |
# mkfs.btrfs [options] /dev/<part1> /dev/<part2> |
||
+ | |||
+ | {{Tip|ミラーリングをしない場合、''raid0'' オプションを使って下さい: {{ic|# mkfs.btrfs -d raid0 /dev/''part1'' /dev/''part2''}}。}} |
||
=== Ext3/4 から変換する === |
=== Ext3/4 から変換する === |
||
+ | |||
+ | {{Warning|2015年後期現在、btrfs メーリングリストには変換が上手く行かないという報告が多数存在します。パッチが投稿されて自体は改善しつつありますが、細心の注意を払ってください。重要なデータがあるときはバックアップを作成することを推奨します。btrfs wiki の [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3 Conversion from Ext3] も参照。}} |
||
インストール CD から起動して、次を実行することで変換できます: |
インストール CD から起動して、次を実行することで変換できます: |
||
59行目: | 61行目: | ||
# btrfs-convert /dev/''partition'' |
# btrfs-convert /dev/''partition'' |
||
− | パーティションをマウントして、ファイルを確認して変換をテストしてください。{{ic|/etc/fstab}} を適切に変更する必要があります ('''type''' を {{ic|btrfs}} に '''fs_passno''' [the last field] を {{ic|0}} にしてください、Btrfs は起動時にファイルシステムのチェックを行いません)。また、パーティションの UUID も変わるので注意してください。UUID を使っている場合は fstab をそれに合わせて更新してください。システムに {{ic|chroot}} して GRUB メニューリストを再生成してください ([[既存の Linux からインストール]]や [[GRUB]] を参照)。 root ファイルシステムを変換する場合は、chroot している間に {{ic|mkinitcpio -p linux}} を実行して initramfs を再生成しないとシステムが起動しなくなります。 |
+ | パーティションをマウントして、ファイルを確認して変換をテストしてください。{{ic|/etc/fstab}} を適切に変更する必要があります ('''type''' を {{ic|btrfs}} に '''fs_passno''' [the last field] を {{ic|0}} にしてください、Btrfs は起動時にファイルシステムのチェックを行いません)。また、パーティションの UUID も変わるので注意してください。UUID を使っている場合は fstab をそれに合わせて更新してください。システムに {{ic|chroot}} して GRUB メニューリストを再生成してください ([[既存の Linux からインストール]]や [[GRUB]] を参照)。 root ファイルシステムを変換する場合は、chroot している間に {{ic|mkinitcpio -p linux}} を実行して initramfs を再生成しないとシステムが起動しなくなります。'unknown filesystem' で grub が止まってしまう場合は {{ic|grub-install /dev/''partition''}} で grub を再インストールして {{ic|grub-mkconfig -o /boot/grub/grub.cfg}} で設定を再生成してみてください。 |
保存したイメージを削除し、イメージがあるサブボリュームを削除して、最後に [[#Balance|Balance]] を行いファイルシステムがスペースを回収するようにしてください。 |
保存したイメージを削除し、イメージがあるサブボリュームを削除して、最後に [[#Balance|Balance]] を行いファイルシステムがスペースを回収するようにしてください。 |
||
+ | {{Warning|問題がないと確信ができないときは {{ic|ext2_saved}} サブボリュームを削除してはいけません。このサブボリュームがないかぎり ext3/ext4 に戻すことは不可能です。}} |
||
− | |||
− | # rm /ext2_saved/* |
||
# btrfs subvolume delete /ext2_saved |
# btrfs subvolume delete /ext2_saved |
||
76行目: | 77行目: | ||
活発に開発されているファイルシステムのため、変化やリグレッションが想定されます。ベンチマークは"参照"セクションのリンクを見て下さい。 |
活発に開発されているファイルシステムのため、変化やリグレッションが想定されます。ベンチマークは"参照"セクションのリンクを見て下さい。 |
||
− | btrfs パーティションを {{ic|/etc/fstab}} に追加する場合 {{ic|btrfs}} フックを [[ |
+ | btrfs パーティションを {{ic|/etc/fstab}} に追加する場合 {{ic|btrfs}} フックを [[mkinitcpio]] に追加する必要があります。 |
==== サンプル ==== |
==== サンプル ==== |
||
− | {{Note|1=SSD で {{ic|autodefrag}} を使用することに関する疑問は [https://btrfs.wiki.kernel.org/index.php/Gotchas Btrfs Wiki Gotchas], [https://btrfs.wiki.kernel.org/index.php/Mount_options Btrfs Wiki Mount options], [ |
+ | {{Note|1=SSD で {{ic|autodefrag}} を使用することに関する疑問は [https://btrfs.wiki.kernel.org/index.php/Gotchas Btrfs Wiki Gotchas], [https://btrfs.wiki.kernel.org/index.php/Mount_options Btrfs Wiki Mount options], [https://www.phoronix.com/scan.php?page=article&item=linux_btrfs_311&num=1 Phoronix 3.11 Benchmarking] を見て下さい。}} |
* '''Linux 3.15''' |
* '''Linux 3.15''' |
||
** SSD の Btrfs で出来る限りパフォーマンスを引き出したい場合。 |
** SSD の Btrfs で出来る限りパフォーマンスを引き出したい場合。 |
||
− | *:{{bc|1=noatime,discard,ssd |
+ | *:{{bc|1=noatime,discard,ssd,compress=lzo,space_cache}} |
** HDD の Btrfs で出来る限り容量を削減したい場合。 |
** HDD の Btrfs で出来る限り容量を削減したい場合。 |
||
*: {{bc|1=noatime,autodefrag,compress-force=lzo,space_cache}} |
*: {{bc|1=noatime,autodefrag,compress-force=lzo,space_cache}} |
||
109行目: | 110行目: | ||
他にも大まかに使用容量を読み出すコマンドとして {{ic|btrfs filesystem show}} が使用できます: |
他にも大まかに使用容量を読み出すコマンドとして {{ic|btrfs filesystem show}} が使用できます: |
||
− | + | # btrfs filesystem show /dev/sda3 |
|
− | failed to open /dev/sr0: No medium found |
||
− | Label: 'arch64' uuid: 02ad2ea2-be12-2233-8765-9e0a48e9303a |
||
− | Total devices 1 FS bytes used 2.91GB |
||
− | devid 1 size 118.95GB used 4.02GB path /dev/sda2 |
||
+ | 空き容量の情報を取得する最新のコマンドは {{ic|btrfs filesystem usage}} です: |
||
− | Btrfs v0.20-rc1-358-g194aa4a-dirty |
||
− | }} |
||
+ | # btrfs filesystem usage |
||
− | == 制限 == |
||
+ | |||
+ | {{Note|1={{ic|btrfs filesystem usage}} コマンドは RAID レベルが {{ic|RAID5/RAID6}} だと上手く機能しません。}} |
||
+ | |||
+ | == 既知の問題 == |
||
試行する前に知っておくべき制限事項が存在します。 |
試行する前に知っておくべき制限事項が存在します。 |
||
124行目: | 124行目: | ||
=== 暗号化 === |
=== 暗号化 === |
||
− | Btrfs にはビルトインの暗号化サポートはありません(将来実装される予定です)が、<code>mkfs.btrfs</code> をする前にパーティションを暗号化することができます。[[ |
+ | Btrfs にはビルトインの暗号化サポートはありません(将来実装される予定です)が、<code>mkfs.btrfs</code> をする前にパーティションを暗号化することができます。[[dm-crypt]] を見て下さい。 |
− | 既に btrfs ファイルシステムを作成してしまっている場合、[[ |
+ | 既に btrfs ファイルシステムを作成してしまっている場合、[[EncFS]] や [[TrueCrypt]] などを使うことができます。ただし btrfs のいくつかの機能が使えなくなるかもしれません。 |
=== スワップファイル === |
=== スワップファイル === |
||
− | Btrfs は[[スワップ#スワップファイル|スワップファイル]]をサポートしていません。これはスワップファイルに必要な機能が Btrfs に存在しないためです [https://btrfs.wiki.kernel.org/index.php/FAQ#Does_btrfs_support_swap_files.3F]。ループデバイスにスワップファイルをマウントすることは可能ですがハイバネートには使えません。自動化するには[[公式リポジトリ]]から {{Pkg|systemd-swap}} パッケージをインストールしてください。 |
+ | Btrfs は[[スワップ#スワップファイル|スワップファイル]]をサポートしていません。これはスワップファイルに必要な機能が Btrfs に存在しないためです [https://btrfs.wiki.kernel.org/index.php/FAQ#Does_btrfs_support_swap_files.3F]。スワップファイルをサポートするパッチは既に存在するので [https://lkml.org/lkml/2014/12/9/718]、将来のカーネルリリースで恐らくサポートされるようになるでしょう。代わりの方法として、ループデバイスにスワップファイルをマウントすることは可能ですがハイバネートには使えません。自動化するには[[公式リポジトリ]]から {{Pkg|systemd-swap}} パッケージをインストールしてください。 |
− | |||
− | === Linux-rt カーネル === |
||
− | |||
− | バージョン 3.14.12_rt9 から、Btrfs ファイルシステムで [[カーネル#-rt|linux-rt]] カーネルを起動することはできなくなっています。これは ''rt'' パッチセットの開発が遅れているのが原因です。 |
||
== 機能 == |
== 機能 == |
||
140行目: | 136行目: | ||
様々な機能が備わっていて、それぞれ設定が可能です。 |
様々な機能が備わっていて、それぞれ設定が可能です。 |
||
− | === |
+ | === クォータ === |
+ | |||
+ | {{warning|Qgroup はまだ安定状態ではなくサブボリュームのスナップショットとクォータを組み合わせると操作によってパフォーマンスに問題をきたします (スナップショットの削除など)。さらに [https://btrfs.wiki.kernel.org/index.php/Quota_support#Known_issues 既知の問題] が存在しています。}} |
||
+ | |||
+ | 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 のクォータグループはツリー構造になっていて、サイズ制限はクォータグループごとに設定し、ツリーに属しているサブボリュームに制限が課せられます。 |
||
+ | |||
+ | クォータグループで設定できる制限は合計データ使用量・非共有のデータ使用量・圧縮データ使用量、あるいはそれらを組み合わせたものです。元のボリュームファイルを削除してコピーを残す場合、他のクォータグループの非共有制限が変わるため、ファイルのコピーや削除で制限に抵触する可能性があります。例えば、新しいスナップショットが元のサブボリュームの全てのブロックと同じデータを持っている場合、どちらかのサブボリュームだけで共通データを削除するともう片方のサブボリュームの制限に引っかかる可能性があります。 |
||
+ | |||
+ | クォータグループに制限を設定するには、{{ic|btrfs qgroup limit}} コマンドを使います。合計使用量の制限や非共有制限 ({{ic|-e}}) または圧縮制限 ({{ic|-c}}) が設定できます。ファイルシステムの特定のパスにおける使用量や制限を表示するには: |
||
+ | |||
+ | # btrfs qgroup show -reF <path> |
||
+ | |||
+ | === コミット間隔の設定 === |
||
ファイルシステムにどのデータを書き込むかは BTRFS とシステム全体の設定によって決められます。BTRFS のデフォルトでは30秒のチェックポイントインターバルでファイルシステムに新しいデータが送られます。この間隔は[[#チェックポイントインターバル|後述]]のマウントオプションで調整可能です。 |
ファイルシステムにどのデータを書き込むかは BTRFS とシステム全体の設定によって決められます。BTRFS のデフォルトでは30秒のチェックポイントインターバルでファイルシステムに新しいデータが送られます。この間隔は[[#チェックポイントインターバル|後述]]のマウントオプションで調整可能です。 |
||
146行目: | 165行目: | ||
システム全体の設定もインターバルに影響を与えます。それには /proc/sys/vm/* 以下のファイルも含まれており、この wiki では扱っていません。Documentation/sysctl/vm.txt にこれらのファイルに関するカーネルドキュメントがあります。 |
システム全体の設定もインターバルに影響を与えます。それには /proc/sys/vm/* 以下のファイルも含まれており、この wiki では扱っていません。Documentation/sysctl/vm.txt にこれらのファイルに関するカーネルドキュメントがあります。 |
||
+ | === コピーオンライト (CoW) === |
||
− | CoW にはアドバンテージがありますが、大きなファイルに小さなランダム書き込みを行うときのパフォーマンスについてはあまり良い影響を与えません。データベースファイルや仮想マシンイメージについては CoW を無効化することが推奨されます。 |
||
+ | |||
+ | デフォルトでは、いついかなる時も、全てのファイルに対して btrfs は CoW を行います: 今までに存在していなかったファイルを書き込もうとした場合、データは空き領域に書き込まれて、ファイルシステムのメタデータブロックが CoW されます。"通常の"ファイルシステムでは、ファイルの一部を上書きした場合、置換先のデータに直接上書きがなされます。CoW ファイルシステムでは、新しいデータはディスクの空き容量に書き込まれて、それから、新しいデータを参照するようにファイルのメタデータが変更されます。元のデータはどこからも参照されなくなって始めて削除されます。 |
||
+ | |||
+ | CoW にはアドバンテージがありますが、大きなファイルに小さなランダム書き込みを行うときのパフォーマンスについてはあまり良い影響を与えません。たとえ"コピー"を行わないときでもファイルを断片化させるからです。データベースファイルや仮想マシンイメージについては CoW を無効化することが推奨されます。 |
||
+ | |||
CoW を無効にする方法の一つは "nodatacow" オプションを使ってマウントすることです。しかしながら、これではファイルシステム全体で CoW を無効にすることになります。 |
CoW を無効にする方法の一つは "nodatacow" オプションを使ってマウントすることです。しかしながら、これではファイルシステム全体で CoW を無効にすることになります。 |
||
155行目: | 179行目: | ||
$ chattr +C </dir/file> |
$ chattr +C </dir/file> |
||
+ | 以上のコマンドで CoW が無効化されるのはファイルの参照が一つしかない操作の場合に限られます。複数の参照がある場合 (例: {{ic|1=cp --reflink=always}} を使用したりファイルシステムのスナップショットが存在する場合)、CoW は依然として実行されます。 |
||
− | {{Note|chattr の man ページより: btrfs では、 'C' フラグは新しい、または空のファイルにセットしなければなりません。既にデータブロックを持つファイルにフラグを設定した場合、ファイルに新しいブロックが割り当てられると完全な安定のためにフラグの定義が消されます。ディレクトリに 'C' フラグがセットされている場合、そのディレクトリ自体には影響がなく、ディレクトリに作成された新しいファイルに No_COW 属性が付けられます。}} |
||
+ | |||
+ | {{Note|chattr の man ページより: btrfs では、 'C' フラグは新しい、または空のファイルにセットしなければなりません。既にデータブロックを持つファイルにフラグを設定した場合、ファイルに新しいブロックが割り当てられると完全な安定のためにフラグの定義が消されます。ディレクトリに 'C' フラグがセットされている場合、そのディレクトリ自体には影響がなく、ディレクトリに作成された新しいファイルに {{ic|No_COW}} 属性が付けられます。}} |
||
{{Tip|上の Note に従い、ディレクトリ内の既存のファイルで CoW を無効にするときは、次のようにします: |
{{Tip|上の Note に従い、ディレクトリ内の既存のファイルで CoW を無効にするときは、次のようにします: |
||
166行目: | 192行目: | ||
}} |
}} |
||
− | 同じように、ファイルのコピー時に CoW を強制してスペースを節約するには次を使って下さい: |
+ | 同じように、ファイルのコピー時に CoW を強制してスペースを節約するには次を使って下さい (デフォルトでは {{ic|cp}} を使った場合、実際にデータがコピーされます): |
$ cp --reflink source dest |
$ cp --reflink source dest |
||
177行目: | 203行目: | ||
====マルチデバイスファイルシステム==== |
====マルチデバイスファイルシステム==== |
||
+ | |||
+ | {{Note|適当な ''.device'' ジョブ以外でマルチデバイスファイルシステムをマウントするとファイルシステムの [https://github.com/systemd/systemd/issues/1921 バグ] が原因でフリーズして systemd が起動できなくなります。}} |
||
''btrfs'' ファイルシステムを作成する際に、''mkfs.btrfs'' したい分だけのパーティション・デバイスを指定することができます。ファイルシステムは指定された全てのデバイスにわたって作成されます。このように '''"'''pool'''"''' することによって、複数のパーティションやデバイスを一つの大きな ''btrfs'' ファイルシステムにできるのです。 |
''btrfs'' ファイルシステムを作成する際に、''mkfs.btrfs'' したい分だけのパーティション・デバイスを指定することができます。ファイルシステムは指定された全てのデバイスにわたって作成されます。このように '''"'''pool'''"''' することによって、複数のパーティションやデバイスを一つの大きな ''btrfs'' ファイルシステムにできるのです。 |
||
186行目: | 214行目: | ||
====RAID 機能==== |
====RAID 機能==== |
||
+ | {{Note|カーネル 3.19 から、復元や再構築のコードもマージされています。通常の使用に耐えうるようになっています。新しいコードなので、安定化するのは次かその次のバージョンのカーネルになると思われます。}} |
||
− | {{Warning|パリティ RAID (RAID 5 と RAID 6) はまだ不完全で、デバイスの故障からリカバリするときに問題を抱えています。テスト目的以外では使用しないほうが良いでしょう。}} |
||
マルチデバイスファイルシステムを作成するとき、ファイルシステムに追加したデバイス全体で RAID0, RAID1, RAID10, RAID5, RAID6 を使うように指定することもできます。RAID レベルはデータとメタデータで別個に適用することができます。デフォルトでは、メタデータはシングルボリュームやマルチディスクの RAID1 で複製されます。 |
マルチデバイスファイルシステムを作成するとき、ファイルシステムに追加したデバイス全体で RAID0, RAID1, RAID10, RAID5, RAID6 を使うように指定することもできます。RAID レベルはデータとメタデータで別個に適用することができます。デフォルトでは、メタデータはシングルボリュームやマルチディスクの RAID1 で複製されます。 |
||
198行目: | 226行目: | ||
マウント中に {{ic|btrfs balance}} コマンドを使って RAID レベルを変更することができます: |
マウント中に {{ic|btrfs balance}} コマンドを使って RAID レベルを変更することができます: |
||
− | # btrfs balance - |
+ | # btrfs balance start -mconvert=RAIDレベル -dconvert=RAIDレベル マウントポイント |
− | ディスクが2つある場合、md-raid (mdadm) で定義する raid レベルと一致します。ディスクが3つ以上の場合は、md-raid とは全く異なるものになります。 |
+ | ディスクが2つある場合、md-raid ([[mdadm]]) で定義する raid レベルと一致します。ディスクが3つ以上の場合は、md-raid とは全く異なるものになります。 |
例えば: |
例えば: |
||
206行目: | 234行目: | ||
* data=raid1 の Btrfs ボリュームの3つの 1TB ディスクを使って、満杯になるまでほぼ 1.5TB のデータを保存することができます。ディスクが1つなくなってもデータは消失しません。 |
* data=raid1 の Btrfs ボリュームの3つの 1TB ディスクを使って、満杯になるまでほぼ 1.5TB のデータを保存することができます。ディスクが1つなくなってもデータは消失しません。 |
||
− | Btrfs はディスクに分散してブロックペアを配置するのにラウンドロビン方式を使っています。Linux 3.0 から,ブロックペアを分散する際に大きなディスクを優先するように quasi-round-robin 方式が使われています。これによって複数のディスクからディスクセットが出来ているときに raid0 や raid1 でほとんど (もしくは全て) の領域を効率的に利用することが可能になっています。例えば、1台の 1TB のディスクと2台の 500GB のディスクからなるセットで data=raid1 を使用すると 1TB のディスクには全てのブロックのコピーが、500GB のそれぞれのディスクにはブロックが交互に (ラウンドロビンで) 配置されます。完全な利用効率が実現されます。1TB のディスクと 750GB のディスク、500GB のディスクからなるセットでも同じことが行われますが、ファイルシステムは 750GB のディスクの 250GB が利用できないことを報告します。いつでも全ての領域を活用できるようにするには (最後に上げた例でも)、data=single を使って下さい (data=single は raid コントローラによって定義される JBOD と同じです)。詳しくは [https://btrfs.wiki.kernel.org/index.php/FAQ#How_much_space_do_I_get_with_unequal_devices_in_RAID-1_mode.3F BTRFS FAQ] を参照 |
+ | 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 メーリングリスト] のバグレポートを読んでください。}} |
||
=== サブボリューム === |
=== サブボリューム === |
||
215行目: | 245行目: | ||
サブボリュームを作成するには: |
サブボリュームを作成するには: |
||
+ | # btrfs subvolume create ''/path/to/subvolume'' |
||
− | |||
− | # btrfs subvolume create subvolume-name |
||
==== サブボリュームを一覧する ==== |
==== サブボリュームを一覧する ==== |
||
223行目: | 252行目: | ||
# btrfs subvolume list -p . |
# btrfs subvolume list -p . |
||
+ | |||
+ | ==== サブボリュームをマウントする ==== |
||
+ | |||
+ | サブボリュームは {{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] などにサブボリュームを使用するファイルシステムレイアウトの例が存在します。 |
||
+ | |||
+ | ===== マウントオプション ===== |
||
+ | |||
+ | {{ic|1=subvol=}} でサブボリュームをマウントする際、複数のマウントオプションが利用できます。例えば、[[#圧縮|圧縮]]や[[#コピーオンライト (CoW)|コピーオンライト (CoW)]] に関するマウントオプションが使えます。 |
||
+ | |||
+ | 詳しくは [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 の特性は大きく変わります。活発に開発されているファイルシステムであるため、リグレッションも考慮してください。[[#参照|参照]]セクションには複数のベンチマークへのリンクが存在します。 |
||
+ | |||
+ | {{Warning|特定のマウントオプションは安全を保証するための機能を無効化して、ファイルシステムが完全に破損する危険性を引き上げてしまいます。}} |
||
==== デフォルトのサブボリュームを設定する ==== |
==== デフォルトのサブボリュームを設定する ==== |
||
− | {{Warning|btrfs subvolume default でデフォルトのサブボリュームを変更すると、{{ic|1=subvolid=0}} マウントオプションを使わない限り、ファイルシステムのトップレベルがアクセスできなくなります。参照: [https://btrfs.wiki.kernel.org/index.php/SysadminGuide Btrfs Wiki Sysadmin Guide]。}} |
+ | {{Warning|{{ic|btrfs subvolume set-default}} でデフォルトのサブボリュームを変更すると、{{ic|1=subvolid=0}} マウントオプションを使わない限り、ファイルシステムのトップレベルがアクセスできなくなります。参照: [https://btrfs.wiki.kernel.org/index.php/SysadminGuide Btrfs Wiki Sysadmin Guide]。}} |
{{ic|1=subvol=}} マウントオプションが指定されていない場合、デフォルトのサブボリュームがマウントされます。 |
{{ic|1=subvol=}} マウントオプションが指定されていない場合、デフォルトのサブボリュームがマウントされます。 |
||
256行目: | 301行目: | ||
スナップショットは再帰的ではありません、つまりサブボリューム内にある全てのサブボリュームはスナップショットでは空のディレクトリになります。 |
スナップショットは再帰的ではありません、つまりサブボリューム内にある全てのサブボリュームはスナップショットでは空のディレクトリになります。 |
||
+ | |||
+ | ==== 送信/受信 ==== |
||
+ | |||
+ | サブボリュームは {{ic|send}} コマンドを使って標準出力やファイルに送信することができます。Btrfs の {{ic|receive}} コマンドにパイプで渡すことで非常に便利に使うことが可能です。例えば、{{ic|/root_backup}} という名前のスナップショットを {{ic|/backup}} に送信するには以下のコマンドを実行します: |
||
+ | |||
+ | # btrfs send /root_backup | btrfs receive /backup |
||
+ | |||
+ | 送信するスナップショットは読み取り専用である必要があります。上記のコマンドは外部デバイスにサブボリュームをコピーするのにも使えます (例えば上の {{ic|/backup}} を USB ディスクにマウント)。 |
||
+ | |||
+ | また、スナップショットの差分だけを送信することも可能です。例えば、上記のように {{ic|root_backup}} のコピーを送信したことがある場合、{{ic|root_backup_new}} という名前の読み取り専用のスナップショットを新しく作成してから、増加差分だけを {{ic|/backup}} に送信するには: |
||
+ | |||
+ | # btrfs send -p /root_backup /root_backup_new | btrfs receive /backup |
||
+ | |||
+ | これで {{ic|root_backup_new}} という名前の新しいサブボリュームが {{ic|/backup}} に作成されます。 |
||
+ | |||
+ | 差分バックアップをしたり自動的にバックアップを行うツールは [https://btrfs.wiki.kernel.org/index.php/Incremental_Backup Btrfs Wiki's Incremental Backup] を見てください。 |
||
=== デフラグメンテーション === |
=== デフラグメンテーション === |
||
265行目: | 326行目: | ||
ファイルシステム全体をデフラグするには、次を実行してください: |
ファイルシステム全体をデフラグするには、次を実行してください: |
||
# btrfs filesystem defragment -r -v / |
# btrfs filesystem defragment -r -v / |
||
− | |||
− | {{Note|このコマンドはファイルデータだけをデフラグします。ファイルシステムの全てのディレクトリのディレクトリメタデータをデフラグするには、次のコマンドを実行してください: {{bc|# find / -xdev -type d -print -exec btrfs filesystem defragment '{}' \;}}}} |
||
=== 圧縮 === |
=== 圧縮 === |
||
− | Btrfs は透過圧縮をサポートしています、これはパーティション上の全てのファイルが自動的に圧縮されることを意味します。このことはファイルの容量を減らすだけでなく、特に [ |
+ | 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 パフォーマンスを向上させる] こともできます。 |
− | 圧縮は {{ic|1=compress= |
+ | 圧縮は {{ic|1=compress=zlib}} か {{ic|1=compress=lzo}} マウントオプションを使って有効にします。マウントオプションが追加された後に作成・変更されたファイルだけに圧縮が適用されます。ただし、{{ic|btrfs filesystem defragment -c''alg''}} コマンドを使うことで既存のファイルに圧縮を適用することも簡単にできます (例えば ext3/4 から変換した後)。{{ic|''alg''}} は {{ic|zlib}} または {{ic|lzo}} のどちらかに置き換えてください。{{ic|lzo}} を使ってファイルシステム全体を再圧縮するには、次のコマンドを実行してください: |
# btrfs filesystem defragment -r -v -clzo / |
# btrfs filesystem defragment -r -v -clzo / |
||
281行目: | 340行目: | ||
# mount -o remount,compress=lzo /mnt/target |
# mount -o remount,compress=lzo /mnt/target |
||
− | インストールが完了した後に、{{ic|/etc/[[ |
+ | インストールが完了した後に、{{ic|/etc/[[fstab]]}} の root ファイルシステムのマウントオプションに {{ic|1=compress=lzo}} を加えて下さい。 |
=== チェックポイントインターバル === |
=== チェックポイントインターバル === |
||
Linux 3.12 から、チェックポイントインターバルをデフォルトの30秒から変えることができるようになっています。{{ic|/etc/fstab}} の btrfs パーティションに {{ic|commit}} マウントフラグを追加してください。 |
Linux 3.12 から、チェックポイントインターバルをデフォルトの30秒から変えることができるようになっています。{{ic|/etc/fstab}} の btrfs パーティションに {{ic|commit}} マウントフラグを追加してください。 |
||
− | LABEL=arch64 / btrfs defaults,noatime |
+ | LABEL=arch64 / btrfs defaults,noatime,compress=lzo,commit=120 0 0 |
=== パーティショニング === |
=== パーティショニング === |
||
293行目: | 352行目: | ||
* [[fstab|マウントポイント]]によって異なる[[ファイルシステム]]を使うことはできません |
* [[fstab|マウントポイント]]によって異なる[[ファイルシステム]]を使うことはできません |
||
− | * Btrfs は[[スワップ#スワップファイル|スワップファイル]]をサポートしていないので[[スワップ|スワップ領域]]を使うことができません。[[スワップ#スワップパーティション|スワップパーティション]]も作れません |
+ | * Btrfs は[[スワップ#スワップファイル|スワップファイル]]をサポートしていないので[[スワップ|スワップ領域]]を使うことができません。[[スワップ#スワップパーティション|スワップパーティション]]も作れません。ハイバネーションイメージはスワップ領域に保存されるので、ハイバネーション/レジュームも使えません |
* [[Unified Extensible Firmware Interface|UEFI]] を使って起動できません |
* [[Unified Extensible Firmware Interface|UEFI]] を使って起動できません |
||
300行目: | 359行目: | ||
{{ic|/dev/sdaX}} を指定するとパーティションスキーム全体を置き換える代わりに既存のパーティションがフォーマットされます。 |
{{ic|/dev/sdaX}} を指定するとパーティションスキーム全体を置き換える代わりに既存のパーティションがフォーマットされます。 |
||
− | [[Master Boot Record|MBR]] のデータストレージデバイスと同じ方法で[[ブートローダー]]をインストールしてください。例えば [[ |
+ | [[Master Boot Record|MBR]] のデータストレージデバイスと同じ方法で[[ブートローダー]]をインストールしてください。例えば [[GRUB]] なら: |
# grub-install --recheck /dev/sdX |
# grub-install --recheck /dev/sdX |
||
− | {{Warning|{{ic|btrfs |
+ | {{Warning|{{ic|btrfs subvolume set-default}} コマンドを使ってデフォルトのサブボリュームをトップレベル (ID 0) 以外に変更すると GRUB を破壊するおそれがあります。リセットするには [[#デフォルトのサブボリュームを設定する]] を見て下さい。}} |
=== Scrub === |
=== Scrub === |
||
+ | Btrfs の scrub はオンラインのファイルシステムチェックツールです。ファイルシステム上の全てのデータとメタデータを読み込んで、チェックサムと RAID ストレージの重複コピーを使用してデータに破損がないか確認して修復を行います。 |
||
− | [https://btrfs.wiki.kernel.org/index.php/Glossary Btrfs Wiki Glossary] を参照してください。 |
||
# btrfs scrub start / |
# btrfs scrub start / |
||
314行目: | 373行目: | ||
{{Warning|scrub プロセスが動作しているとシステムはサスペンドできません、詳しくは [http://comments.gmane.org/gmane.comp.file-systems.btrfs/33106 このスレッド] を見て下さい。}} |
{{Warning|scrub プロセスが動作しているとシステムはサスペンドできません、詳しくは [http://comments.gmane.org/gmane.comp.file-systems.btrfs/33106 このスレッド] を見て下さい。}} |
||
+ | ==== systemd サービス ==== |
||
− | scrub を systemd のサービスとして実行する場合は、{{ic|1=Type=forking}} を使用します。もしくは、btrfs scrub start に "-B" フラグを追加することでフォアグラウンドで実行することができデフォルトの Type 値が使われます。 |
||
+ | |||
+ | {{Pkg|btrfs-progs}} パッケージには特定のマウントポイントをひと月毎にスクラブする {{ic|btrfs-scrub@.timer}} ユニットが付属しています。エンコードしたパスを指定してタイマーを[[有効化]]してください。例えば {{ic|/}} なら {{ic|btrfs-scrub@-.timer}} を、{{ic|/home}} なら {{ic|btrfs-scrub@home.timer}} を使います。 |
||
+ | |||
+ | {{ic|btrfs-scrub@.service}} を[[起動]]することで手動でスクラブを実行することもできます (同じくエンコードしたパスを指定してください)。{{ic|btrfs scrub}} コマンドを手動で実行するのとは違って systemd サービスを使うことで [[systemd#Journal|journal]] にログが記録されます。 |
||
=== Balance === |
=== Balance === |
||
+ | balance はファイルシステム上の全てのデータをアロケータに再度流し込みます。デバイスが追加されたり削除された場合にファイルシステム上のデータを再配置するために実行します。balance はデバイスが故障した場合に、冗長な RAID レベルのコピーを再生成します。 |
||
− | [https://btrfs.wiki.kernel.org/index.php/FAQ#What_does_.22balance.22_do.3F 上流の FAQ ページ]を参照してください。 |
||
{{Pkg|btrfs-progs}}-3.12 から''バランシング''はバックグラウンドプロセスになりました - 詳しくは {{ic|man 8 btrfs-balance}} を見て下さい。 |
{{Pkg|btrfs-progs}}-3.12 から''バランシング''はバックグラウンドプロセスになりました - 詳しくは {{ic|man 8 btrfs-balance}} を見て下さい。 |
||
324行目: | 387行目: | ||
# btrfs balance start / |
# btrfs balance start / |
||
# btrfs balance status / |
# btrfs balance status / |
||
+ | |||
+ | === SSD TRIM === |
||
+ | |||
+ | {{ic|discard}} オプションを使ってマウントした場合、Btrfs ファイルシステムは TRIM コマンドをサポートしている SSD ドライブの空きブロックを自動的に開放します。 |
||
+ | |||
+ | SATA 3.1 よりも古い場合、TRIM コマンドは同期的で、コマンドが実行されている間は全ての I/O がブロックされます。ファイルシステムの同期などによって、プチフリーズが発生する可能性があります。このような場合、{{ic|discard}} を使用する代わりに定期的な trim を有効にすることができます: |
||
+ | |||
+ | # systemctl enable fstrim.timer |
||
+ | |||
+ | SATA バージョンを確認するには次を実行: |
||
+ | |||
+ | # smartctl --info /dev/sd''X'' |
||
+ | |||
+ | 詳しくは[[ソリッドステートドライブ#TRIM]] を参照。 |
||
+ | |||
+ | === 重複排除 === |
||
+ | |||
+ | コピーオンライトを使用した場合、Btrfs は実際にはデータをコピーしないでファイルやサブボリュームをコピーできます。ファイルに変更が加えられたときに新しい本当のコピーが作成されます。重複排除はさらに共通部分が存在するデータブロックを認識して、コピーオンライトと同じようにエクステントにまとめてしまいます。 |
||
+ | |||
+ | Btrfs パーティションの重複排除に使用するツールについては [https://btrfs.wiki.kernel.org/index.php/Deduplication#Batch 上流の Wiki エントリ] を見てください。{{Pkg|duperemove}}, {{aur|bedup}}, ''btrfs-dedup'' などが存在します。{{pkg|rmlint}} あるいは {{aur|jdupes}} などを使うことでファイルベースでデータの重複排除を行うこともできます。 |
||
+ | |||
+ | Btrfs の開発者はインバンド (同期的・インライン) 重複排除に取り組んでおり、新しいデータがファイルシステムに書き込まれたときに重複排除が実行されます。現在のところ実験的な機能としてツリー外で開発されています。新しい機能をテストしてみたい場合は [https://btrfs.wiki.kernel.org/index.php/User_notes_on_dedupe カーネルの wiki ページ] を参照してください。 |
||
+ | |||
+ | == ヒントとテクニック == |
||
+ | |||
+ | === チェックサムのハードウェアアクセラレーション === |
||
+ | |||
+ | Btrfs のチェックサムでハードウェアアクセラレーションが使われているかどうか確認するには: |
||
+ | {{hc|<nowiki>$ dmesg | grep crc32c</nowiki>|<nowiki>Btrfs loaded, crc32c=crc32c-intel</nowiki>}} |
||
+ | |||
+ | {{ic|<nowiki>crc32c=crc32c-generic</nowiki>}} と表示された場合、ルートパーティションが Btrfs であるため、ハードウェアアクセラレーションを使うにはカーネルに {{ic|crc32c-intel}} を組み込む必要があります。[[mkinitcpio.conf]] に {{ic|crc32c-intel}} を追加するだけでは機能しません。 |
||
+ | |||
+ | === ファイルシステム破損のリカバリ === |
||
+ | |||
+ | ''btrfs-check'' はマウントされているファイルシステムでは使えません。ライブ USB から起動しないで ''btrfs-check'' を使えるようにするには、初期 RAM ディスクに以下のように追加してください: |
||
+ | |||
+ | {{hc|/etc/mkinitcpio.conf|output= |
||
+ | BINARIES="/usr/bin/btrfs" |
||
+ | }} |
||
+ | |||
+ | 設定したら [[mkinitcpio]] を使って initramfs を再生成してください。 |
||
+ | |||
+ | 起動に問題が発生したら、ユーティリティを使って修復することができます。 |
||
+ | |||
+ | {{Note|fsck でキャッシュを無効化する必要がある場合、起動後に一定時間フリーズするのは通常の動作です (btrfs-transaction がハングアップしているというメッセージがコンソールに表示されます)。しばらく経てばシステムは復帰します。}} |
||
+ | |||
+ | 詳しくは [https://btrfs.wiki.kernel.org/index.php/Btrfsck Btrfs Wiki] を参照。 |
||
+ | |||
+ | === GRUB でスナップショットを起動 === |
||
+ | |||
+ | {{ic|1=rootflags=subvol=}} 引数を使って[[GRUB#GNU/Linux のメニューエントリ|メニューエントリ]]を手動で作成することができます。{{ic|/etc/fstab}} の {{ic|1=subvol=}} マウントオプションでも起動したいスナップショットを正しく指定する必要があります。 |
||
+ | |||
+ | また、{{Pkg|grub-btrfs}} や {{AUR|grub-btrfs-git}} を使うことで GRUB のメニューに Btrfs のスナップショットを自動的に (GRUB 設定ファイルを作成するときに) 作成することも可能です。 |
||
+ | |||
+ | === systemd-nspawn で Btrfs サブボリュームを使う === |
||
+ | |||
+ | [[Systemd-nspawn#Btrfs のサブボリュームをコンテナのルートとして使う]]や [[Systemd-nspawn#コンテナの一時的な Btrfs スナップショットを使う]]を見てください。 |
||
== トラブルシューティング == |
== トラブルシューティング == |
||
+ | |||
+ | 一般的なトラブルシューティングについては [https://btrfs.wiki.kernel.org/index.php/Problem_FAQ Btrfs Problem FAQ] を見て下さい。 |
||
=== GRUB === |
=== GRUB === |
||
331行目: | 453行目: | ||
==== パーティションオフセット ==== |
==== パーティションオフセット ==== |
||
− | [[GRUB |
+ | [[GRUB]] は Btrfs パーティションを起動することができますが、そのモジュールは ext4 などよりも大きく、''grub-install'' によって作成される {{ic|core.img}} が MBR と最初のパーティションの間に収まらない可能性があります。GPT を使うか、最初のパーティションの前に数 MB の空きスペースを作ることでこの問題を解決できます。 |
==== root が見つからない ==== |
==== root が見つからない ==== |
||
339行目: | 461行目: | ||
=== BTRFS: open_ctree failed === |
=== BTRFS: open_ctree failed === |
||
− | 2014年11月現在、{{ic|mkinitcpio.conf}} で {{ic|btrfs}} フックを使用してマルチデバイスの Btrfs を使っている場合に以下のエラーが発生するというバグが [[ |
+ | 2014年11月現在、{{ic|mkinitcpio.conf}} で {{ic|btrfs}} フックを使用してマルチデバイスの Btrfs を使っている場合に以下のエラーが発生するというバグが [[systemd]] か [[mkinitcpio]] のどちらかに存在します: |
{{bc|<nowiki> |
{{bc|<nowiki> |
||
352行目: | 474行目: | ||
{{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}} を見て下さい。 |
+ | 詳細は [https://bbs.archlinux.org/viewtopic.php?id=189845 フォーラムスレッド] や {{Bug|42884}} を見て下さい。 |
+ | |||
+ | デバイスが存在しない raid アレイをマウントしようとしたときも同じエラーが表示されます。その場合は {{ic|/etc/fstab}} に {{ic|degraded}} マウントオプションを追加してください。ルートパーティションがアレイ上にある場合、[[カーネルパラメータ]]に {{ic|1=rootflags=degraded}} を追加してください。 |
||
+ | |||
+ | === btrfs check === |
||
+ | |||
+ | {{Warning|Btrfs はまだ開発途上であり、特に {{ic|btrfs check}} コマンドについては仕様が固まっていないので、{{ic|--repair}} スイッチを付けて {{ic|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] を参照。 |
||
== 参照 == |
== 参照 == |
||
358行目: | 490行目: | ||
* 公式サイト |
* 公式サイト |
||
** [https://btrfs.wiki.kernel.org/ Btrfs Wiki] |
** [https://btrfs.wiki.kernel.org/ Btrfs Wiki] |
||
− | ** [https://btrfs.wiki.kernel.org/index.php/Glossary Btrfs Wiki Glossary] |
||
− | * 公式 FAQ |
||
− | ** [https://btrfs.wiki.kernel.org/index.php/FAQ Btrfs Wiki FAQ] |
||
− | ** [https://btrfs.wiki.kernel.org/index.php/Problem_FAQ Btrfs Wiki Problem FAQ] |
||
− | * Btrfs のプルリクエスト |
||
− | ** [http://lkml.indiana.edu/hypermail/linux/kernel/1401.3/03045.html 3.14] |
||
− | ** [http://lkml.indiana.edu/hypermail/linux/kernel/1311.1/03526.html 3.13] |
||
− | ** [http://lkml.indiana.edu/hypermail/linux/kernel/1309.1/02981.html 3.12] |
||
− | ** [http://lkml.indiana.edu/hypermail/linux/kernel/1305.1/01064.html 3.11] |
||
* パフォーマンス関連 |
* パフォーマンス関連 |
||
− | ** [ |
+ | ** [https://superuser.com/questions/432188/should-i-put-my-multi-device-btrfs-filesystem-on-disk-partitions-or-raw-devices Btrfs on raw disks?] |
** [http://comments.gmane.org/gmane.comp.file-systems.btrfs/19440 Varying leafsize and nodesize in Btrfs] |
** [http://comments.gmane.org/gmane.comp.file-systems.btrfs/19440 Varying leafsize and nodesize in Btrfs] |
||
** [http://comments.gmane.org/gmane.comp.file-systems.btrfs/15646 Btrfs support for efficient SSD operation (data blocks alignment)] |
** [http://comments.gmane.org/gmane.comp.file-systems.btrfs/15646 Btrfs support for efficient SSD operation (data blocks alignment)] |
||
** [https://btrfs.wiki.kernel.org/index.php/FAQ#Is_Btrfs_optimized_for_SSD.3F Is Btrfs optimized for SSDs?] |
** [https://btrfs.wiki.kernel.org/index.php/FAQ#Is_Btrfs_optimized_for_SSD.3F Is Btrfs optimized for SSDs?] |
||
** Phoronix によるマウントオプションのベンチマーク |
** Phoronix によるマウントオプションのベンチマーク |
||
− | *** [ |
+ | *** [https://www.phoronix.com/scan.php?page=article&item=btrfs-mount-linux49 Linux 4.9] |
− | *** [ |
+ | *** [https://www.phoronix.com/scan.php?page=article&item=linux_314_btrfs Linux 3.14] |
− | *** [ |
+ | *** [https://www.phoronix.com/scan.php?page=article&item=linux_btrfs_311&num=1 Linux 3.11] |
− | *** [ |
+ | *** [https://www.phoronix.com/scan.php?page=news_item&px=MTM0OTU Linux 3.9] |
− | *** [ |
+ | *** [https://www.phoronix.com/scan.php?page=article&item=btrfs_linux37_mounts&num=1 Linux 3.7] |
+ | *** [https://www.phoronix.com/scan.php?page=article&item=linux_btrfs_options&num=1 Linux 3.2] |
||
** [http://blog.erdemagaoglu.com/post/4605524309/lzo-vs-snappy-vs-lzf-vs-zlib-a-comparison-of Lzo vs. zLib] |
** [http://blog.erdemagaoglu.com/post/4605524309/lzo-vs-snappy-vs-lzf-vs-zlib-a-comparison-of Lzo vs. zLib] |
||
* その他 |
* その他 |
||
** [http://www.funtoo.org/wiki/BTRFS_Fun Funtoo Wiki Btrfs Fun] |
** [http://www.funtoo.org/wiki/BTRFS_Fun Funtoo Wiki Btrfs Fun] |
||
− | ** [ |
+ | ** [https://www.phoronix.com/scan.php?page=news_item&px=MTA0ODU Avi Miller presenting Btrfs] at SCALE 10x, January 2012. |
− | ** [ |
+ | ** [https://www.phoronix.com/scan.php?page=news_item&px=MTA4Mzc Summary of Chris Mason's talk] from LFCS 2012 |
− | ** [ |
+ | ** [https://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=35054394c4b3cecd52577c2662c84da1f3e73525 Btrfs: stop providing a bmap operation to avoid swapfile corruptions] 2009-01-21 |
** [http://marc.merlins.org/perso/btrfs/post_2014-03-22_Btrfs-Tips_-Doing-Fast-Incremental-Backups-With-Btrfs-Send-and-Receive.html Doing Fast Incremental Backups With Btrfs Send and Receive] |
** [http://marc.merlins.org/perso/btrfs/post_2014-03-22_Btrfs-Tips_-Doing-Fast-Incremental-Backups-With-Btrfs-Send-and-Receive.html Doing Fast Incremental Backups With Btrfs Send and Receive] |
2019年11月21日 (木) 18:48時点における版
- Btrfs (B-tree File System: 読み方は "バター FS", "ベター FS", "B木 FS", "ビーティーアール FS" など) は Linux 向けの実験的なコピーオンライトのファイルシステムで GPL でライセンスされています。Oracle Corporation によって2007年から開発が開始されました。2014年8月にはディスク上のフォーマットが固まっています。
Btrfs Wiki より:
- Btrfs は Linux 用の全く新しいコピーオンライト (COW) のファイルシステムです。先進的な機能を実装することを目指しつつ、障害耐性を持ち簡単に管理できることに焦点が置かれています。Btrfs は Oracle, Red Hat, Fujitsu, Intel, SUSE, STRATO やその他多くの人々によって共同で開発されており GPL でライセンスされていて誰でも貢献できるように開かれています。
目次
インストール
Btrfs はデフォルトのカーネルに含まれており、ツール (btrfs-progs) は公式リポジトリから入手できます。GRUB, mkinitcpio, Syslinux には Btrfs のサポートがあるので追加の設定は必要ありません。
追加のパッケージ
- btrfs-progs には Btrfs ファイルシステムのエラーを修正できるツール btrfsck が含まれています。
- btrfs-progs-gitAUR はナイトリービルドです。
Btrfs の一般的な管理
新しいファイルシステムを作成する
Btrfs ファイルシステムは新規作成することも既存のファイルシステムから変換することも可能です。
パーティションをフォーマットするには次を実行してください:
# mkfs.btrfs -L mylabel /dev/partition
大きいブロックサイズをデータ・メタデータに使うには、下の例のように -n
スイッチを使って nodesize
の値を指定して下さい (例: 16KB ブロック):
# mkfs.btrfs -L mylabel -l 16k /dev/partition
複数のデバイスを入力して RAID を作成することもできます。サポートされている RAID レベルは RAID 0, RAID 1, RAID 10 などです。デフォルトではメタデータはミラーされデータはストライピングされます。より多くの情報が必要な場合、Using Btrfs with Multiple Devices を見てください。
# mkfs.btrfs [options] /dev/<part1> /dev/<part2>
Ext3/4 から変換する
インストール CD から起動して、次を実行することで変換できます:
# btrfs-convert /dev/partition
パーティションをマウントして、ファイルを確認して変換をテストしてください。/etc/fstab
を適切に変更する必要があります (type を btrfs
に fs_passno [the last field] を 0
にしてください、Btrfs は起動時にファイルシステムのチェックを行いません)。また、パーティションの UUID も変わるので注意してください。UUID を使っている場合は fstab をそれに合わせて更新してください。システムに chroot
して GRUB メニューリストを再生成してください (既存の Linux からインストールや GRUB を参照)。 root ファイルシステムを変換する場合は、chroot している間に mkinitcpio -p linux
を実行して initramfs を再生成しないとシステムが起動しなくなります。'unknown filesystem' で grub が止まってしまう場合は grub-install /dev/partition
で grub を再インストールして grub-mkconfig -o /boot/grub/grub.cfg
で設定を再生成してみてください。
保存したイメージを削除し、イメージがあるサブボリュームを削除して、最後に Balance を行いファイルシステムがスペースを回収するようにしてください。
# btrfs subvolume delete /ext2_saved
マウントオプション
Btrfs Wiki Mount options を参照してください。
ファイルシステムの作成中に行うことが出来る設定に加えて、Btrfs の様々なマウントオプションは性能特性を劇的に変えることができます。
活発に開発されているファイルシステムのため、変化やリグレッションが想定されます。ベンチマークは"参照"セクションのリンクを見て下さい。
btrfs パーティションを /etc/fstab
に追加する場合 btrfs
フックを mkinitcpio に追加する必要があります。
サンプル
- Linux 3.15
- SSD の Btrfs で出来る限りパフォーマンスを引き出したい場合。
noatime,discard,ssd,compress=lzo,space_cache
- HDD の Btrfs で出来る限り容量を削減したい場合。
noatime,autodefrag,compress-force=lzo,space_cache
使用済み・空き容量を表示する
/usr/bin/df
などの linux の一般的なユーザー空間ツールは Btrfs パーティションの空き容量について間違った報告をします。なぜならメタデータによって使用される予約済みのスペースを考慮しないからです。btrfs パーティションに問い合わせるときは /usr/bin/btrfs
を使うのが推奨されています。以下は df -h
を使った時と、btrfs filesystem df
を使った時の出力の例です:
$ df -h /
Filesystem Size Used Avail Use% Mounted on /dev/sda3 119G 3.0G 116G 3% /
$ btrfs filesystem df /
Data: total=3.01GB, used=2.73GB System: total=4.00MB, used=16.00KB Metadata: total=1.01GB, used=181.83MB
df -h
は 3.0GB 使用されているとしているのに対して btrfs filesystem df
はデータは 2.73GB だと報告しているのに気づいて下さい。これは Btrfs がスペースをプールに割り当てているためです。本当のディスク使用量は3つの 'used' を合計した値であり、df -h
による 3.0GB よりかは下回ります。
他にも大まかに使用容量を読み出すコマンドとして btrfs filesystem show
が使用できます:
# btrfs filesystem show /dev/sda3
空き容量の情報を取得する最新のコマンドは btrfs filesystem usage
です:
# btrfs filesystem usage
既知の問題
試行する前に知っておくべき制限事項が存在します。
暗号化
Btrfs にはビルトインの暗号化サポートはありません(将来実装される予定です)が、mkfs.btrfs
をする前にパーティションを暗号化することができます。dm-crypt を見て下さい。
既に btrfs ファイルシステムを作成してしまっている場合、EncFS や TrueCrypt などを使うことができます。ただし btrfs のいくつかの機能が使えなくなるかもしれません。
スワップファイル
Btrfs はスワップファイルをサポートしていません。これはスワップファイルに必要な機能が Btrfs に存在しないためです [1]。スワップファイルをサポートするパッチは既に存在するので [2]、将来のカーネルリリースで恐らくサポートされるようになるでしょう。代わりの方法として、ループデバイスにスワップファイルをマウントすることは可能ですがハイバネートには使えません。自動化するには公式リポジトリから systemd-swap パッケージをインストールしてください。
機能
様々な機能が備わっていて、それぞれ設定が可能です。
クォータ
Btrfs におけるクォータのサポートはクォータグループ (qgroup) を利用してサブボリュームレベルで実装されています: 各サブボリュームにはデフォルトで 0/<subvolume id> という形式でクォータグループが割り当てられています。必要であればクォータグループを作成することもできます。
クォータグループを使うにはまずクォータを有効にする必要があります:
# btrfs quota enable <path>
上記のコマンドを実行してから新しいサブボリュームを作成すると、グループによって制御が可能になります。既存のサブボリュームでも制御を行いたい場合、クォータを有効にしてから、<subvolume id> を使ってサブボリュームごとにクォータグループを作成して再スキャンしてください:
# btrfs subvolume list <path> | cut -d' ' -f2 | xargs -I{} -n1 btrfs qgroup create 0/{} <path> # btrfs quota rescan <path>
Btrfs のクォータグループはツリー構造になっていて、サイズ制限はクォータグループごとに設定し、ツリーに属しているサブボリュームに制限が課せられます。
クォータグループで設定できる制限は合計データ使用量・非共有のデータ使用量・圧縮データ使用量、あるいはそれらを組み合わせたものです。元のボリュームファイルを削除してコピーを残す場合、他のクォータグループの非共有制限が変わるため、ファイルのコピーや削除で制限に抵触する可能性があります。例えば、新しいスナップショットが元のサブボリュームの全てのブロックと同じデータを持っている場合、どちらかのサブボリュームだけで共通データを削除するともう片方のサブボリュームの制限に引っかかる可能性があります。
クォータグループに制限を設定するには、btrfs qgroup limit
コマンドを使います。合計使用量の制限や非共有制限 (-e
) または圧縮制限 (-c
) が設定できます。ファイルシステムの特定のパスにおける使用量や制限を表示するには:
# btrfs qgroup show -reF <path>
コミット間隔の設定
ファイルシステムにどのデータを書き込むかは BTRFS とシステム全体の設定によって決められます。BTRFS のデフォルトでは30秒のチェックポイントインターバルでファイルシステムに新しいデータが送られます。この間隔は後述のマウントオプションで調整可能です。
システム全体の設定もインターバルに影響を与えます。それには /proc/sys/vm/* 以下のファイルも含まれており、この wiki では扱っていません。Documentation/sysctl/vm.txt にこれらのファイルに関するカーネルドキュメントがあります。
コピーオンライト (CoW)
デフォルトでは、いついかなる時も、全てのファイルに対して btrfs は CoW を行います: 今までに存在していなかったファイルを書き込もうとした場合、データは空き領域に書き込まれて、ファイルシステムのメタデータブロックが CoW されます。"通常の"ファイルシステムでは、ファイルの一部を上書きした場合、置換先のデータに直接上書きがなされます。CoW ファイルシステムでは、新しいデータはディスクの空き容量に書き込まれて、それから、新しいデータを参照するようにファイルのメタデータが変更されます。元のデータはどこからも参照されなくなって始めて削除されます。
CoW にはアドバンテージがありますが、大きなファイルに小さなランダム書き込みを行うときのパフォーマンスについてはあまり良い影響を与えません。たとえ"コピー"を行わないときでもファイルを断片化させるからです。データベースファイルや仮想マシンイメージについては CoW を無効化することが推奨されます。
CoW を無効にする方法の一つは "nodatacow" オプションを使ってマウントすることです。しかしながら、これではファイルシステム全体で CoW を無効にすることになります。
ファイルやディレクトリ単体で CoW を無効化するには、次のコマンドを使って下さい:
$ chattr +C </dir/file>
以上のコマンドで CoW が無効化されるのはファイルの参照が一つしかない操作の場合に限られます。複数の参照がある場合 (例: cp --reflink=always
を使用したりファイルシステムのスナップショットが存在する場合)、CoW は依然として実行されます。
同じように、ファイルのコピー時に CoW を強制してスペースを節約するには次を使って下さい (デフォルトでは cp
を使った場合、実際にデータがコピーされます):
$ cp --reflink source dest
dest ファイルが変更されると、元から変更されたブロックだけがディスクに書き込まれます。cp を 'cp --reflink=auto' にするエイリアスを作ってもいいかもしれません。
マルチデバイスファイルシステムと RAID 機能
Using Btrfs with Multiple Devices の提案も見て下さい。
マルチデバイスファイルシステム
btrfs ファイルシステムを作成する際に、mkfs.btrfs したい分だけのパーティション・デバイスを指定することができます。ファイルシステムは指定された全てのデバイスにわたって作成されます。このように "pool" することによって、複数のパーティションやデバイスを一つの大きな btrfs ファイルシステムにできるのです。
また、既に存在している btrfs ファイルシステムからデバイスを追加・削除することも可能です(用心が必要ですが)。
(btrfs ボリュームとも呼ばれる) マルチデバイス btrfs ファイルシステムは btrfs device scan
を実行するまで認識されません。btrfs mkinitcpio フックがこれを行います。
RAID 機能
マルチデバイスファイルシステムを作成するとき、ファイルシステムに追加したデバイス全体で RAID0, RAID1, RAID10, RAID5, RAID6 を使うように指定することもできます。RAID レベルはデータとメタデータで別個に適用することができます。デフォルトでは、メタデータはシングルボリュームやマルチディスクの RAID1 で複製されます。
btrfs は raid0, raid1, raid10 のブロックペアで動作します:
raid0 - 2つのデバイスに分散されるブロックペア
raid1 - 2つのデバイスに書き込まれるブロックペア
マウント中に btrfs balance
コマンドを使って RAID レベルを変更することができます:
# btrfs balance start -mconvert=RAIDレベル -dconvert=RAIDレベル マウントポイント
ディスクが2つある場合、md-raid (mdadm) で定義する raid レベルと一致します。ディスクが3つ以上の場合は、md-raid とは全く異なるものになります。
例えば:
- md による raid1 の3つの 1TB ディスクを使って、1TB の空き容量で、2つのディスクを失ってもデータが消失しないようにすることが出来ます。
- data=raid1 の Btrfs ボリュームの3つの 1TB ディスクを使って、満杯になるまでほぼ 1.5TB のデータを保存することができます。ディスクが1つなくなってもデータは消失しません。
Btrfs はディスクに分散してブロックペアを配置するのにラウンドロビン方式を使っています。Linux 3.0 から,ブロックペアを分散する際に大きなディスクを優先するように quasi-round-robin 方式が使われています。これによって複数のディスクからディスクセットが出来ているときに raid0 や raid1 でほとんど (もしくは全て) の領域を効率的に利用することが可能になっています。例えば、1台の 1TB のディスクと2台の 500GB のディスクからなるセットで data=raid1 を使用すると 1TB のディスクには全てのブロックのコピーが、500GB のそれぞれのディスクにはブロックが交互に (ラウンドロビンで) 配置されます。完全な利用効率が実現されます。1TB のディスクと 750GB のディスク、500GB のディスクからなるセットでも同じことが行われますが、ファイルシステムは 750GB のディスクの 250GB が利用できないことを報告します。いつでも全ての領域を活用できるようにするには (最後に上げた例でも)、data=single を使って下さい (data=single は raid コントローラによって定義される JBOD と同じです)。詳しくは BTRFS FAQ を参照。
サブボリューム
btrfs の機能のひとつにサブボリュームがあります。サブボリュームは基本的にファイルとディレクトリを保持している名前の付いた b 木です。root ツリーのツリーの中に inode を持ち、root 以外の所有者やグループも設定できます。サブボリュームは任意でブロックを割り当てることもできます。ブロックとファイルエクステントの全ては参照カウントでありスナップショットを可能にしています。仮想マシンの動的な容量拡張に似て、必要な時に必要な分だけのデバイス上の容量を使います。また、サブボリュームを異なったマウントオプションを使ってマウントすることでセキュリティの柔軟性を持たせることもできます。
サブボリュームを作成する
サブボリュームを作成するには:
# btrfs subvolume create /path/to/subvolume
サブボリュームを一覧する
現在のサブボリュームのリストを表示するには:
# btrfs subvolume list -p .
サブボリュームをマウントする
サブボリュームは subvol=/path/to/subvolume
や subvolid=objectid
マウントフラグを使うことでファイルシステムのパーティションと同じようにマウントできます。例えば、subvol_root
という名前のサブボリュームが存在したら /
にマウントすることができます。ファイルシステムのトップレベルにサブボリュームを作成して適切なマウントポイントにマウントすることで、伝統的なファイルシステムのパーティションと同じように使うことができ、スナップショットを使用してファイルシステムを前の状態に簡単に戻すことが可能です。
Snapper#推奨ファイルシステムレイアウト, Btrfs SysadminGuide#Managing Snapshots, Btrfs SysadminGuide#Layout などにサブボリュームを使用するファイルシステムレイアウトの例が存在します。
マウントオプション
subvol=
でサブボリュームをマウントする際、複数のマウントオプションが利用できます。例えば、圧縮やコピーオンライト (CoW) に関するマウントオプションが使えます。
詳しくは Btrfs Wiki Mount options や Btrfs Wiki Gotchas を見てください。様々なマウントオプションを使うことで Btrfs の特性は大きく変わります。活発に開発されているファイルシステムであるため、リグレッションも考慮してください。参照セクションには複数のベンチマークへのリンクが存在します。
デフォルトのサブボリュームを設定する
subvol=
マウントオプションが指定されていない場合、デフォルトのサブボリュームがマウントされます。
# btrfs subvolume set-default subvolume-id /.
サンプル:
# btrfs subvolume list .
ID 258 gen 9512 top level 5 path root_subvolume ID 259 gen 9512 top level 258 path home ID 260 gen 9512 top level 258 path var ID 261 gen 9512 top level 258 path usr
# btrfs subvolume set-default 258 .
リセット:
# btrfs subvolume set-default 0 .
スナップショット
詳しくは Btrfs Wiki SysadminGuide#Snapshots を見て下さい。
スナップショットを作成するには:
# btrfs subvolume snapshot source [dest/]name
スナップショットは再帰的ではありません、つまりサブボリューム内にある全てのサブボリュームはスナップショットでは空のディレクトリになります。
送信/受信
サブボリュームは 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 はオンラインデフラグをサポートしています。root フォルダのメタデータをデフラグするには、次を実行してください:
# btrfs filesystem defragment /
上のコマンドはファイルシステム全体のデフラグを行いません。詳しくは、btrfs wiki のこのページを見て下さい。
ファイルシステム全体をデフラグするには、次を実行してください:
# btrfs filesystem defragment -r -v /
圧縮
Btrfs は透過圧縮をサポートしています、これはパーティション上の全てのファイルが自動的に圧縮されることを意味します。このことはファイルの容量を減らすだけでなく、特に lzo アルゴリズム を使っている場合は パフォーマンスを向上させる こともできます。
圧縮は compress=zlib
か compress=lzo
マウントオプションを使って有効にします。マウントオプションが追加された後に作成・変更されたファイルだけに圧縮が適用されます。ただし、btrfs filesystem defragment -calg
コマンドを使うことで既存のファイルに圧縮を適用することも簡単にできます (例えば ext3/4 から変換した後)。alg
は zlib
または lzo
のどちらかに置き換えてください。lzo
を使ってファイルシステム全体を再圧縮するには、次のコマンドを実行してください:
# btrfs filesystem defragment -r -v -clzo /
空の Btrfs パーティションに Arch をインストールする際に、ドライブの準備をした後 compress
オプションを設定してください。他のターミナルに切り替えて (Ctrl+Alt+number
)、次のコマンドを実行してください:
# mount -o remount,compress=lzo /mnt/target
インストールが完了した後に、/etc/fstab
の root ファイルシステムのマウントオプションに compress=lzo
を加えて下さい。
チェックポイントインターバル
Linux 3.12 から、チェックポイントインターバルをデフォルトの30秒から変えることができるようになっています。/etc/fstab
の btrfs パーティションに commit
マウントフラグを追加してください。
LABEL=arch64 / btrfs defaults,noatime,compress=lzo,commit=120 0 0
パーティショニング
Btrfs はデータストレージデバイス全体を占領して MBR や GPT パーティショニングスキームを置き換えることができます。サブボリュームを使ってパーティションを模すことが可能です。ディスクを一つしか使っていない場合、このアプローチにはいくつか制限があります:
- マウントポイントによって異なるファイルシステムを使うことはできません
- Btrfs はスワップファイルをサポートしていないのでスワップ領域を使うことができません。スワップパーティションも作れません。ハイバネーションイメージはスワップ領域に保存されるので、ハイバネーション/レジュームも使えません
- UEFI を使って起動できません
既存のパーティションテーブルを Btrfs で上書きするには、次のコマンドを実行してください:
# mkfs.btrfs /dev/sdX
/dev/sdaX
を指定するとパーティションスキーム全体を置き換える代わりに既存のパーティションがフォーマットされます。
MBR のデータストレージデバイスと同じ方法でブートローダーをインストールしてください。例えば GRUB なら:
# grub-install --recheck /dev/sdX
Scrub
Btrfs の scrub はオンラインのファイルシステムチェックツールです。ファイルシステム上の全てのデータとメタデータを読み込んで、チェックサムと RAID ストレージの重複コピーを使用してデータに破損がないか確認して修復を行います。
# btrfs scrub start / # btrfs scrub status /
systemd サービス
btrfs-progs パッケージには特定のマウントポイントをひと月毎にスクラブする btrfs-scrub@.timer
ユニットが付属しています。エンコードしたパスを指定してタイマーを有効化してください。例えば /
なら btrfs-scrub@-.timer
を、/home
なら btrfs-scrub@home.timer
を使います。
btrfs-scrub@.service
を起動することで手動でスクラブを実行することもできます (同じくエンコードしたパスを指定してください)。btrfs scrub
コマンドを手動で実行するのとは違って systemd サービスを使うことで journal にログが記録されます。
Balance
balance はファイルシステム上の全てのデータをアロケータに再度流し込みます。デバイスが追加されたり削除された場合にファイルシステム上のデータを再配置するために実行します。balance はデバイスが故障した場合に、冗長な RAID レベルのコピーを再生成します。
btrfs-progs-3.12 からバランシングはバックグラウンドプロセスになりました - 詳しくは man 8 btrfs-balance
を見て下さい。
# btrfs balance start / # btrfs balance status /
SSD TRIM
discard
オプションを使ってマウントした場合、Btrfs ファイルシステムは TRIM コマンドをサポートしている SSD ドライブの空きブロックを自動的に開放します。
SATA 3.1 よりも古い場合、TRIM コマンドは同期的で、コマンドが実行されている間は全ての I/O がブロックされます。ファイルシステムの同期などによって、プチフリーズが発生する可能性があります。このような場合、discard
を使用する代わりに定期的な trim を有効にすることができます:
# systemctl enable fstrim.timer
SATA バージョンを確認するには次を実行:
# smartctl --info /dev/sdX
詳しくはソリッドステートドライブ#TRIM を参照。
重複排除
コピーオンライトを使用した場合、Btrfs は実際にはデータをコピーしないでファイルやサブボリュームをコピーできます。ファイルに変更が加えられたときに新しい本当のコピーが作成されます。重複排除はさらに共通部分が存在するデータブロックを認識して、コピーオンライトと同じようにエクステントにまとめてしまいます。
Btrfs パーティションの重複排除に使用するツールについては 上流の Wiki エントリ を見てください。duperemove, bedupAUR, btrfs-dedup などが存在します。rmlint あるいは jdupesAUR などを使うことでファイルベースでデータの重複排除を行うこともできます。
Btrfs の開発者はインバンド (同期的・インライン) 重複排除に取り組んでおり、新しいデータがファイルシステムに書き込まれたときに重複排除が実行されます。現在のところ実験的な機能としてツリー外で開発されています。新しい機能をテストしてみたい場合は カーネルの wiki ページ を参照してください。
ヒントとテクニック
チェックサムのハードウェアアクセラレーション
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 でスナップショットを起動
rootflags=subvol=
引数を使ってメニューエントリを手動で作成することができます。/etc/fstab
の subvol=
マウントオプションでも起動したいスナップショットを正しく指定する必要があります。
また、grub-btrfs や grub-btrfs-gitAUR を使うことで GRUB のメニューに Btrfs のスナップショットを自動的に (GRUB 設定ファイルを作成するときに) 作成することも可能です。
systemd-nspawn で Btrfs サブボリュームを使う
Systemd-nspawn#Btrfs のサブボリュームをコンテナのルートとして使うや Systemd-nspawn#コンテナの一時的な Btrfs スナップショットを使うを見てください。
トラブルシューティング
一般的なトラブルシューティングについては Btrfs Problem FAQ を見て下さい。
GRUB
パーティションオフセット
GRUB は Btrfs パーティションを起動することができますが、そのモジュールは ext4 などよりも大きく、grub-install によって作成される core.img
が MBR と最初のパーティションの間に収まらない可能性があります。GPT を使うか、最初のパーティションの前に数 MB の空きスペースを作ることでこの問題を解決できます。
root が見つからない
RAID セットアップから起動した時にエラー error no such device: root
が表示される場合、/usr/share/grub/grub-mkconfig_lib
を編集して echo " search --no-floppy --fs-uuid --set=root ${hints} ${fs_uuid}"
からクォートを削除してください。grub の設定を再生成すればエラーを出さずに起動できるはずです。
BTRFS: open_ctree failed
2014年11月現在、mkinitcpio.conf
で btrfs
フックを使用してマルチデバイスの Btrfs を使っている場合に以下のエラーが発生するというバグが systemd か mkinitcpio のどちらかに存在します:
BTRFS: open_ctree failed mount: wrong fs type, bad option, bad superblock on /dev/sdb2, missing codepage or helper program, or other error In some cases useful info is found in syslog - try dmesg|tail or so. You are now being dropped into an emergency shell.
/etc/mkinitcpio.conf
の HOOKS
行から btrfs
を削除して代わりに MODULES
行に btrfs
を追加することで解決します。修正を施したら mkinitcpio -p linux
で initramfs を再生成して (必要ならプリセットを調整します) 再起動してください。
詳細は フォーラムスレッド や FS#42884 を見て下さい。
デバイスが存在しない raid アレイをマウントしようとしたときも同じエラーが表示されます。その場合は /etc/fstab
に degraded
マウントオプションを追加してください。ルートパーティションがアレイ上にある場合、カーネルパラメータに rootflags=degraded
を追加してください。
btrfs check
btrfs check コマンドを使うことでアンマウントされた Btrfs ファイルシステムをチェックしたり修復することが可能です。ただし、この修復ツールはまだ開発中であり、特定のファイルシステムエラーは修復することができません。
詳しくは Btrfsck を参照。
参照
- 公式サイト
- パフォーマンス関連
- その他
- Funtoo Wiki Btrfs Fun
- Avi Miller presenting Btrfs at SCALE 10x, January 2012.
- Summary of Chris Mason's talk from LFCS 2012
- Btrfs: stop providing a bmap operation to avoid swapfile corruptions 2009-01-21
- Doing Fast Incremental Backups With Btrfs Send and Receive