Difference between revisions of "Btrfs (日本語)"

From ArchWiki
Jump to: navigation, search
m
(コピーオンライト (CoW))
Line 78: Line 78:
 
システム全体の設定もインターバルに影響を与えます。それには /proc/sys/vm/* 以下のファイルも含まれており、この wiki では扱っていません。Documentation/sysctl/vm.txt にこれらのファイルに関するカーネルドキュメントがあります。
 
システム全体の設定もインターバルに影響を与えます。それには /proc/sys/vm/* 以下のファイルも含まれており、この wiki では扱っていません。Documentation/sysctl/vm.txt にこれらのファイルに関するカーネルドキュメントがあります。
  
CoW にはアドバンテージがありますが、random write が少ない大きなファイルを扱うときのパフォーマンスについてはあまり良い影響を与えません。データベースファイルや仮想マシンイメージについては CoW を無効化することが推奨されます。
+
CoW にはアドバンテージがありますが、大きなファイルに小さなランダム書き込みを行うときのパフォーマンスについてはあまり良い影響を与えません。データベースファイルや仮想マシンイメージについては CoW を無効化することが推奨されます。
"nodatacow" オプションを使ってマウントすることで全てのブロックデバイスで CoW を無効にできます。しかしながら、これではファイルシステム全体で CoW を無効にすることにはなりません。
+
CoW を無効にする方法の一つは "nodatacow" オプションを使ってマウントすることです。しかしながら、これではファイルシステム全体で CoW を無効にすることになります。
  
 
ファイルやディレクトリ単体で CoW を無効化するには、次のコマンドを使って下さい:
 
ファイルやディレクトリ単体で CoW を無効化するには、次のコマンドを使って下さい:
  
  # chattr +C </dir/file>
+
  $ chattr +C </dir/file>
  
chattr の man ページより: btrfs では、新しい、または空のファイルには 'C' フラグがセットされます。既にデータブロックを持つファイルにフラグが設定してある場合、ファイルに対応したブロックが完全に安定状態の時にフラグの定義が消されます。ディレクトリに 'C' フラグがセットされている場合、そのディレクトリ自体には影響がなく、ディレクトリに作成された新しいファイルに No_COW 属性が付けられます。
+
{{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
 +
作業中にファイルが使用されないように気を付けてください。また、 {{ic|mv}} や下で説明する {{ic|cp --reflink}} では CoW を無効にできないことに注意してください。
 +
}}
  
 
同じように、ファイルのコピー時に CoW を強制してスペースを節約するには次を使って下さい:
 
同じように、ファイルのコピー時に CoW を強制してスペースを節約するには次を使って下さい:
  
  # cp --reflink source dest
+
  $ cp --reflink source dest
  
 
dest ファイルが変更されると、元から変更されたブロックだけがディスクに書き込まれます。cp を 'cp --reflink=auto' にするエイリアスを作ってもいいかもしれません。
 
dest ファイルが変更されると、元から変更されたブロックだけがディスクに書き込まれます。cp を 'cp --reflink=auto' にするエイリアスを作ってもいいかもしれません。

Revision as of 07:16, 15 March 2014

Template:Article summary start Template:Article summary text Template:Article summary heading Template:Article summary wiki Template:Article summary wiki Template:Article summary end

Btrfs (B-tree File System, "Butter FS", "Better FS") は Linux 用の全く新しいコピーオンライト (COW) のファイルシステムです。先進的な機能を実装することを目指しつつ、障害耐性を持ち簡単に管理できることに焦点が置かれています。Btrfs は Oracle, Red Hat, Fujitsu, Intel, SUSE やその他多くの人々によって共同で開発されており GPL でライセンスされているので誰でも貢献できるように開かれています。

インストール

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

ファイルシステムの作成

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

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

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

# mkfs.btrfs /dev/<partition>
Note: Btrfs v0.20-rc1-253-g7854c8b 現在、デフォルトのブロックサイズは 4k です。

大きいブロックサイズをデータ・メタデータに使うには、下の例のように -l スイッチを使って leafsize の値を指定して下さい (例: 16k ブロック):

#  mkfs.btrfs -l 16k /dev/<partition>

複数のデバイスを入力して RAID を作成することもできます。サポートされている RAID レベルは RAID 0, RAID 1, RAID 10 などです。デフォルトではメタデータはミラーされデータはストライピングされます。

# 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 LinuxGRUB を参照)。

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

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

制限

試行する前に知っておくべき制限事項が存在します。

暗号化

Btrfs にはビルトインの暗号化サポートはありません(将来実装される予定です)が、mkfs.btrfs をする前にパーティションを暗号化することができます。Dm-crypt with LUKS を見て下さい。

(既に btrfs ファイルシステムを作成してしまっている場合、EncFSTrueCrypt などを使うことができます。ただし btrfs の機能のいくつかが使えなくなるかもしれません。)

スワップファイル

Btrfs はスワップファイルをサポートしていません。これはスワップファイルに必要な機能が Btrfs に存在しないためです。link ループデバイスにスワップファイルをマウントすることは可能ですがハイバネートには使えません。systemd のサービスファイルが利用可能です systemd-loop-swapfileAUR

GRUB2 と core.img

Grub 2 は Btrfs パーティションを起動することができますが、そのモジュールは ext4 などよりも大きく、grub-install によって作成される core.img がMBR と最初のパーティションの間に収まらない可能性があります。GPT を使うか、最初のパーティションの前に数 MB の空きスペースを作ることでこの問題を解決できます。

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秒のチェックポイントインターバルでファイルシステムに新しいデータが送られます。Btrfs v0.20-rc1-253-g7854c8b 現在、patched version of fs/btrfs/disk-io.c をリコンパイルしない限りこの設定を変えることはできません。01-Aug-2013 に、David Sterba はこの値を変更できるようにする パッチ を送っています。

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

CoW にはアドバンテージがありますが、大きなファイルに小さなランダム書き込みを行うときのパフォーマンスについてはあまり良い影響を与えません。データベースファイルや仮想マシンイメージについては CoW を無効化することが推奨されます。 CoW を無効にする方法の一つは "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 フックや /etc/rc.conf の USEBTRFS 変数を設定するときに使って下さい。

RAID 機能

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

btrfs works in block-pairs for raid0, raid1, and raid10. This means:

raid0 - block-pair stripped across 2 devices
raid1 - block-pair written to 2 devices

For 2 disk sets, this matches raid levels as defined in md-raid (mdadm). For 3+ disk-sets, the result is entirely different than md-raid.

For example:
3 1TB disks in an md based raid1 yields a /dev/md0 with 1TB free space and the ability to safely loose 2 disks without losing data. 3 1TB disks in a btrfs volume with data=raid1 will allow the storage of approximately 1.5TB of data before reporting full. Only 1 disk can safely be lost without losing data.

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 [<dest>/]

柔軟性を向上させるために、あなたのシステムを指定したサブボリュームにインストールするには、カーネルブートパラメータに以下を加えて下さい:

rootflags=subvol=<whatever you called the subvol>

これでシステムロールバックも可能になります。

root パーティションで使う場合、/etc/mkinitcpio.conf のモジュールに crc32c (または Intel のマシン用の crc32c-intel) を加えるのが推奨されます。

スナップショット

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

# btrfs subvolume snapshot <source> [<dest>/]<name>

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

デフラグメンテーション

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

# btrfs filesystem defragment /

上のコマンドはシステム全体のデフラグを行いません。詳しくは、btrfs wiki のこのページを見て下さい。 システム全体すべてをデフラグするには、次を実行してください:

# find / -xdev -type f -print -exec btrfs filesystem defrag '{}' \;

圧縮

Btrfs は透過圧縮をサポートしています、これはパーティション上の全てのファイルが自動的に圧縮されることを意味します。このことはファイルの容量を減らすだけでなく、特に lzo アルゴリズムを使っている場合は パフォーマンスを向上させる こともできます。圧縮は compress=gzipcompress=lzo マウントオプションを使って有効にします。マウントオプションが追加された後に作成・変更されたファイルだけに圧縮が適用されるので、圧縮の効果を完全に享受するにはインストール中に有効にして下さい。

However, it can quite easily be applied to a subvolume using the defragment -czlib (or whichever algorithm you so choose) command (the same command above could be used, by adding the -czlib and such, to recursively apply). Also keep in mind that for future files to be compressed, a simple 'chattr +c' should be applied to some directories, so as to automatically compress new files as they come.

ドライブの準備をした後、他のターミナルに切り替えて (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 はデータストレージデバイス全体を占領して MBRGPT パーティショニングスキームを置き換えることができます。サブボリュームを使ってパーティションを模すことが可能です。ディスクを一つしか使っていない場合、このアプローチにはいくつか制限があります:

既存のパーティションテーブルを Btrfs で上書きするには、次のコマンドを実行してください:

# mkfs.btrfs /dev/sdX

/dev/sdaX を指定するとパーティションスキーム全体を置き換える代わりに既存のパーティションがフォーマットされます。

MBR のデータストレージデバイスと同じ方法でブートローダをインストールしてください。例えば GRUB なら:

# grub-install --recheck /dev/sdX

資料