# Btrfs (日本語)

関連記事

- ファイルシステム
- Btrfs - Tips and tricks
- Mkinitcpio-btrfs

Wikipedia:ja: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 でライセンスされていて誰でも貢献できるように開かれています。

Warning:

- Btrfs は未だに実験的であると考えられてます。詳しくは Btrfs Wiki の Stability status や Is Btrfs stable、Getting started などを見て下さい。
- 制限について注意してください。

## インストール

Btrfs はデフォルトのカーネルに含まれており、ツール (btrfs-progs) は公式リポジトリから入手できます。GRUB, mkinitcpio, Syslinux には Btrfs のサポートがあるので追加の設定は必要ありません。

### 追加のパッケージ

- btrfs-progs には Btrfs ファイルシステムのエラーを修正できるツール btrfsck が含まれています。
- mkinitcpio-btrfs はロールバック機能を有効にします。
- btrfs-progs-git はナイトリービルドです。

Tip: Btrfs を効率的に動かす提案が Btrfs Wiki Getting Started に載っています。

## Btrfs の一般的な管理

### 新しいファイルシステムを作成する

Btrfs ファイルシステムは新規作成することも既存のファイルシステムから変換することも可能です。

パーティションをフォーマットするには次を実行してください:

    # mkfs.btrfs -L mylabel /dev/partition

Note: 2013年11月のこのコミット以降、Btrfs のデフォルトのブロックサイズは 16KB になっています。

大きいブロックサイズをデータ・メタデータに使うには、下の例のように `-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 メニューリストを再生成してください (Install from Existing Linux や GRUB を参照)。

保存したイメージを削除し、イメージがあるサブボリュームを削除して、最後に Balance を行いファイルシステムがスペースを回収するようにしてください。

    # rm /ext2_saved/*
    # btrfs subvolume delete /ext2_saved

### マウントオプション

Btrfs Wiki Mount options を参照してください。

ファイルシステムの作成中に行うことが出来る設定に加えて、Btrfs の様々なマウントオプションは性能特性を劇的に変えることができます。

Warning: 特定のマウントオプションはセーフティ機能を無効にします。電源が落ちた時にファイルシステムが完全に破損する危険性が高まるので注意してください (上のリンクを参照)。

活発に開発されているファイルシステムのため、変化やリグレッションが想定されます。ベンチマークは"参照"セクションのリンクを見て下さい。

btrfs パーティションを `/etc/fstab` に追加する場合 `btrfs` フックを mkinitcpio に追加する必要があります。

#### サンプル

Note: SSD で `autodefrag` を使用することに関する疑問は Btrfs Wiki Gotchas, Btrfs Wiki Mount options, Phoronix 3.11 Benchmarking を見て下さい。

- Linux 3.12
  - SSD の Btrfs で出来る限りパフォーマンスを引き出したい場合。

        rw,noatime,compress=lzo,ssd,discard,space_cache,autodefrag,inode_cache

  - HDD の Btrfs で出来る限り容量を削減したい場合。

        rw,relatime,compress-force=zlib,autodefrag

### 使用済み・空き容量を表示する

`/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 に存在しないためです。link ループデバイスにスワップファイルをマウントすることは可能ですがハイバネートには使えません。systemd のサービスファイルが利用可能です systemd-loop-swapfile。

### 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 の設定を再生成すればエラーを出さずに起動できるはずです。

## 機能

様々な機能が備わっていて、それぞれ設定が可能です。

### コピーオンライト (CoW)

ファイルシステムにどのデータを書き込むかは BTRFS とシステム全体の設定によって決められます。BTRFS のデフォルトでは30秒のチェックポイントインターバルでファイルシステムに新しいデータが送られます。この間隔は後述のマウントオプションで調整可能です。

システム全体の設定もインターバルに影響を与えます。それには /proc/sys/vm/* 以下のファイルも含まれており、この wiki では扱っていません。Documentation/sysctl/vm.txt にこれらのファイルに関するカーネルドキュメントがあります。

CoW にはアドバンテージがありますが、大きなファイルに小さなランダム書き込みを行うときのパフォーマンスについてはあまり良い影響を与えません。データベースファイルや仮想マシンイメージについては CoW を無効化することが推奨されます。 CoW を無効にする方法の一つは "nodatacow" オプションを使ってマウントすることです。しかしながら、これではファイルシステム全体で CoW を無効にすることになります。

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

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

    $ chattr +C </dir/file>

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

    $ mv /path/to/dir /path/to/dir_old
    $ mkdir /path/to/dir
    $ chattr +C /path/to/dir
    $ cp /path/to/dir_old/* /path/to/dir
    $ rm -rf /path/to/dir_old

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

同じように、ファイルのコピー時に CoW を強制してスペースを節約するには次を使って下さい:

    $ cp --reflink source dest

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

### マルチデバイスファイルシステムと RAID 機能

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

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つのデバイスに書き込まれるブロックペア

ディスクが2つある場合、md-raid (mdadm) で定義する raid レベルと一致します。ディスクが3つ以上の場合は、md-raid とは全く異なるものになります。

例えば:

- md による raid1 の3つの 1TB ディスクを使って、1TB の空き容量で、2つのディスクを失ってもデータが消失しないようにすることが出来ます。
- data=raid1 の Btrfs ボリュームの3つの 1TB ディスクを使って、満杯になるまでほぼ 1.5TB のデータを保存することができます。ディスクが1つなくなってもデータは消失しません。

Btrfs uses a round-robin scheme to decide how block-pairs are spread among disks. As of Linux 3.0, a quasi-round-robin scheme is used which prefers larger disks when distributing block pairs. This allows raid0 and raid1 to take advantage of most (and sometimes all) space in a disk set made of multiple disks. For example, a set consisting of a 1TB disk and 2 500GB disks with data=raid1 will place a copy of every block on the 1TB disk and alternate (round-robin) placing blocks on each of the 500GB disks. Full space utilization will be made. A set made from a 1TB disk, a 750GB disk, and a 500GB disk will work the same, but the filesystem will report full with 250GB unusable on the 750GB disk. To always take advantage of the full space (even in the last example), use data=single. (data=single is akin to JBOD defined by some raid controllers) See the BTRFS FAQ for more info.

### サブボリューム

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

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

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

    # btrfs subvolume create subvolume-name

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

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

    # btrfs subvolume list -p .

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

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

`subvol=` マウントオプションが指定されていない場合、デフォルトのサブボリュームがマウントされます。

    # btrfs subvolume set-default subvolume-id /.

サンプル:

    # btrfs subvolume list .

    ID 258 gen 9512 top level 5 path root_subvolume
    ID 259 gen 9512 top level 258 path home
    ID 260 gen 9512 top level 258 path var
    ID 261 gen 9512 top level 258 path usr

    # btrfs subvolume set-default 258 .

リセット:

    # btrfs subvolume set-default 0 .

#### スナップショット

詳しくは Btrfs Wiki SysadminGuide#Snapshots を見て下さい。

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

    # btrfs subvolume snapshot source [dest/]name

スナップショットは再帰的ではありません、つまりサブボリューム内にある全てのサブボリュームはスナップショットでは空のディレクトリになります。

### デフラグメンテーション

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

    # btrfs filesystem defragment /

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

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

    # btrfs filesystem defragment -r -v /

Note: このコマンドはファイルデータだけをデフラグします。ファイルシステムの全てのディレクトリのディレクトリメタデータをデフラグするには、次のコマンドを実行してください:

    # find / -xdev -type d -print -exec btrfs filesystem defragment '{}' \;

### 圧縮

Btrfs は透過圧縮をサポートしています、これはパーティション上の全てのファイルが自動的に圧縮されることを意味します。このことはファイルの容量を減らすだけでなく、特に lzo アルゴリズム を使っている場合は パフォーマンスを向上させる こともできます。

圧縮は `compress=gzip` か `compress=lzo` マウントオプションを使って有効にします。マウントオプションが追加された後に作成・変更されたファイルだけに圧縮が適用されます。ただし、`btrfs filesystem defragment -calg` コマンドを使うことで既存のファイルに圧縮を適用することも簡単にできます (例えば ext3/4 から変換した後)。`alg` は `zlib` または `lzo` のどちらかに置き換えてください。`lzo` を使ってファイルシステム全体を再圧縮するには、次のコマンドを実行してください:

    # btrfs filesystem defragment -r -v -clzo /

Tip: `compress` マウントオプションを使わずファイルごとに圧縮を有効にすることも可能です。ファイルに `chattr +c` を適用するだけです。ディレクトリに適用した場合、新しいファイルは自動的に圧縮されます。

空の Btrfs パーティションに Arch をインストールする際に、ドライブの準備をした後 `compress` オプションを設定してください。他のターミナルに切り替えて (`Ctrl+Alt+number`)、次のコマンドを実行してください:

    # mount -o remount,compress=lzo /dev/sdXY /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

Warning: `btrfs filesystem set-default` コマンドを使ってデフォルトのサブボリュームをトップレベル (ID 0) 以外に変更すると GRUB を破壊するおそれがあります。リセットするには #デフォルトのサブボリュームを設定する を見て下さい。

### Scrub

Btrfs Wiki Glossary を参照してください。

    # btrfs scrub start /
    # btrfs scrub status /

Warning: scrub プロセスが動作しているとシステムはサスペンドできません、詳しくは このスレッド を見て下さい。

### Balance

Btrfs Wiki Glossary を参照してください。

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

    # btrfs filesystem balance start /
    # btrfs filesystem balance status /

## 参照

- 公式サイト
  - Btrfs Wiki
  - Btrfs Wiki Glossary
- 公式 FAQ
  - Btrfs Wiki FAQ
  - Btrfs Wiki Problem FAQ
- Btrfs のプルリクエスト
  - 3.14
  - 3.13
  - 3.12
  - 3.11
- パフォーマンス関連
  - Btrfs on raw disks?
  - Varying leafsize and nodesize in Btrfs
  - Btrfs support for efficient SSD operation (data blocks alignment)
  - Is Btrfs optimized for SSDs?
  - Phoronix によるマウントオプションのベンチマーク
    - Linux 3.11
    - Linux 3.9
    - Linux 3.7
    - Linux 3.2
  - Lzo vs. zLib
- その他
  - 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

Category:

- File systems (日本語)