Btrfs (日本語) - ArchWiki

# 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 を参照)。 root ファイルシステムを変換する場合は、chroot している間に `mkinitcpio -p linux` を実行して initramfs を再生成しないとシステムが起動しなくなります。

保存したイメージを削除し、イメージがあるサブボリュームを削除して、最後に 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.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 よりかは下回ります。

Note: カーネル 3.15 以上で `btrfs filesystem df` の出力にタイプ `unknown` のエントリが表示される場合、これは表示のバグです。このパッチ によって、このエントリは一種のバッファである GlobalReserve を意味しています。このエントリは RAID では `unknown, single` として表示され re-balance することができません。

他にも大まかに使用容量を読み出すコマンドとして `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]。ループデバイスにスワップファイルをマウントすることは可能ですがハイバネートには使えません。自動化するには公式リポジトリから systemd-swap パッケージをインストールしてください。

### Linux-rt カーネル

バージョン 3.14.12_rt9 から、Btrfs ファイルシステムで linux-rt カーネルを起動することはできなくなっています。これは rt パッチセットの開発が遅れているのが原因です。

## 機能

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

### コピーオンライト (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 -a /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 機能

Using Btrfs with Multiple Devices の提案も見て下さい。

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

btrfs ファイルシステムを作成する際に、mkfs.btrfs したい分だけのパーティション・デバイスを指定することができます。ファイルシステムは指定された全てのデバイスにわたって作成されます。このように "pool" することによって、複数のパーティションやデバイスを一つの大きな btrfs ファイルシステムにできるのです。

また、既に存在している btrfs ファイルシステムからデバイスを追加・削除することも可能です（用心が必要ですが）。

(btrfs ボリュームとも呼ばれる) マルチデバイス btrfs ファイルシステムは `btrfs device scan` を実行するまで認識されません。btrfs mkinitcpio フックがこれを行います。

#### RAID 機能

Warning: パリティ RAID (RAID 5 と RAID 6) はまだ不完全で、デバイスの故障からリカバリするときに問題を抱えています。テスト目的以外では使用しないほうが良いでしょう。

マルチデバイスファイルシステムを作成するとき、ファイルシステムに追加したデバイス全体で RAID0, RAID1, RAID10, RAID5, RAID6 を使うように指定することもできます。RAID レベルはデータとメタデータで別個に適用することができます。デフォルトでは、メタデータはシングルボリュームやマルチディスクの RAID1 で複製されます。

btrfs は raid0, raid1, raid10 のブロックペアで動作します:

raid0 - 2つのデバイスに分散されるブロックペア

raid1 - 2つのデバイスに書き込まれるブロックペア

マウント中に `btrfs balance` コマンドを使って RAID レベルを変更することができます:

    # btrfs balance -m convert=RAIDレベル -d convert=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 .

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

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 /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 プロセスが動作しているとシステムはサスペンドできません、詳しくは このスレッド を見て下さい。

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 /

## トラブルシューティング

### 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 を見て下さい。

## 参照

- 公式サイト
  - 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.14
    - 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
  - Doing Fast Incremental Backups With Btrfs Send and Receive

Category:

- File systems (日本語)