Btrfs
- Btrfs (B-tree File System: 読み方は "バター FS", "ベター FS", "B木 FS", "ビーティーアール FS" など) は Linux 向けの実験的なコピーオンライトのファイルシステムで GPL でライセンスされています。Oracle Corporation によって2007年から開発が開始されました。
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 が含まれています。
- mkinitcpio-btrfsAUR はロールバック機能を有効にします。
- btrfs-progs-gitAUR はナイトリービルドです。
Btrfs の一般的な管理
新しいファイルシステムを作成する
Btrfs ファイルシステムは新規作成することも既存のファイルシステムから変換することも可能です。
パーティションをフォーマットするには次を実行してください:
# mkfs.btrfs -L mylabel /dev/partition
大きいブロックサイズをデータ・メタデータに使うには、下の例のように -l
スイッチを使って leafsize の値を指定して下さい (例: 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 を行いファイルシステムがスペースを回収するようにしてください。
# rm /ext2_saved/* # btrfs subvolume delete /ext2_saved
マウントオプション
Btrfs Wiki Mount options を参照してください。
ファイルシステムの作成中に行うことが出来る設定に加えて、Btrfs の様々なマウントオプションは性能特性を劇的に変えることができます。
活発に開発されているファイルシステムのため、変化やリグレッションが想定されます。ベンチマークは"参照"セクションのリンクを見て下さい。
btrfs パーティションを /etc/fstab
に追加する場合 btrfs
フックを mkinitcpio に追加する必要があります。
サンプル
- Linux 3.15
- SSD の Btrfs で出来る限りパフォーマンスを引き出したい場合。
noatime,discard,ssd,autodefrag,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
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 Btrfs v0.20-rc1-358-g194aa4a-dirty
制限
試行する前に知っておくべき制限事項が存在します。
暗号化
Btrfs にはビルトインの暗号化サポートはありません(将来実装される予定です)が、mkfs.btrfs
をする前にパーティションを暗号化することができます。dm-crypt を見て下さい。
既に btrfs ファイルシステムを作成してしまっている場合、EncFS や TrueCrypt などを使うことができます。ただし btrfs のいくつかの機能が使えなくなるかもしれません。
スワップファイル
Btrfs はスワップファイルをサポートしていません。これはスワップファイルに必要な機能が Btrfs に存在しないためです [1]。スワップファイルをサポートするパッチは既に存在するので [2]、将来のカーネルリリースで恐らくサポートされるようになるでしょう。代わりの方法として、ループデバイスにスワップファイルをマウントすることは可能ですがハイバネートには使えません。自動化するには公式リポジトリから systemd-swap パッケージをインストールしてください。
Linux-rt カーネル
バージョン 3.14.12_rt9 から、Btrfs ファイルシステムで linux-rt カーネルを起動することはできなくなっています。これは rt パッチセットの開発が遅れているのが原因です。
機能
様々な機能が備わっていて、それぞれ設定が可能です。
コミット間隔の設定
ファイルシステムにどのデータを書き込むかは 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 --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 subvolume-name
サブボリュームを一覧する
現在のサブボリュームのリストを表示するには:
# btrfs subvolume list -p .
デフォルトのサブボリュームを設定する
subvol=
マウントオプションが指定されていない場合、デフォルトのサブボリュームがマウントされます。
# btrfs subvolume set-default subvolume-id /.
サンプル:
# btrfs subvolume list .
ID 258 gen 9512 top level 5 path root_subvolume ID 259 gen 9512 top level 258 path home ID 260 gen 9512 top level 258 path var ID 261 gen 9512 top level 258 path usr
# btrfs subvolume set-default 258 .
リセット:
# btrfs subvolume set-default 0 .
スナップショット
詳しくは Btrfs Wiki SysadminGuide#Snapshots を見て下さい。
スナップショットを作成するには:
# btrfs subvolume snapshot source [dest/]name
スナップショットは再帰的ではありません、つまりサブボリューム内にある全てのサブボリュームはスナップショットでは空のディレクトリになります。
デフラグメンテーション
Btrfs はオンラインデフラグをサポートしています。root フォルダのメタデータをデフラグするには、次を実行してください:
# btrfs filesystem defragment /
上のコマンドはファイルシステム全体のデフラグを行いません。詳しくは、btrfs wiki のこのページを見て下さい。
ファイルシステム全体をデフラグするには、次を実行してください:
# btrfs filesystem defragment -r -v /
圧縮
Btrfs は透過圧縮をサポートしています、これはパーティション上の全てのファイルが自動的に圧縮されることを意味します。このことはファイルの容量を減らすだけでなく、特に lzo アルゴリズム を使っている場合は パフォーマンスを向上させる こともできます。
圧縮は compress=gzip
か 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,ssd,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 Wiki Glossary を参照してください。
# btrfs scrub start / # btrfs scrub status /
scrub を systemd のサービスとして実行する場合は、Type=forking
を使用します。もしくは、btrfs scrub start に "-B" フラグを追加することでフォアグラウンドで実行することができデフォルトの Type 値が使われます。
Balance
上流の FAQ ページを参照してください。
btrfs-progs-3.12 からバランシングはバックグラウンドプロセスになりました - 詳しくは man 8 btrfs-balance
を見て下さい。
# btrfs balance start / # btrfs balance status /
トラブルシューティング
一般的なトラブルシューティングについては Btrfs Problem FAQ を見て下さい。
GRUB
パーティションオフセット
Grub 2 は 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 を見て下さい。
参照
- 公式サイト
- 公式 FAQ
- Btrfs のプルリクエスト
- パフォーマンス関連
- その他
- 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