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

From ArchWiki
Jump to: navigation, search
m
Line 6: Line 6:
 
{{Article summary heading|関連項目}}
 
{{Article summary heading|関連項目}}
 
{{Article summary wiki|Installing on Btrfs root}}
 
{{Article summary wiki|Installing on Btrfs root}}
 +
{{Article summary wiki|Btrfs - Tips and tricks}}
 
{{Article summary end}}
 
{{Article summary end}}
  
Btrfs は Linux 用の新しいコピーオンライト (COW) のファイルシステムであり、先進的な機能を実装することを目指しつつ、障害耐性を持ち簡単に管理することにフォーカスしています。Btrfs は Oracle, Red Hat, Fujitsu, Intel, SUSE やその他多くの人々によって共同で開発されており GPL でライセンスされ誰でも貢献できるように開かれています。
+
Btrfs (B-tree File System, "Butter FS", "Better FS") は Linux 用の全く新しいコピーオンライト (COW) のファイルシステムです。先進的な機能を実装することを目指しつつ、障害耐性を持ち簡単に管理できることに焦点が置かれています。Btrfs は Oracle, Red Hat, Fujitsu, Intel, SUSE やその他多くの人々によって共同で開発されており GPL でライセンスされているので誰でも貢献できるように開かれています。
 
+
== 最近の開発状況とニュースのリンク ==
+
*[http://www.phoronix.com/scan.php?page=news_item&px=MTA0ODU Avi Miller presenting BTRFS] at SCALE 10x.  Jan/2012.
+
*[http://www.phoronix.com/scan.php?page=news_item&px=MTA4Mzc Summary of Chris Mason's talk from LFCS 2012]
+
*2012-03-28 時点で、{{Pkg|btrfs-progs}} は btrfs ファイルシステムのエラーを修正するツールである btrfsck を含んでいます。
+
*Oracle がこのバージョンの btrfs-progs をパッケージ化していて Oracle Linux 6 やバックポート版を 5 でリリースしています。
+
*Arch Linux は core/btrfs-progs として提供しています (バージョン 0.19.20120328-1 から)。
+
  
 
== インストール ==
 
== インストール ==
  
Btrfs のサポートは {{pkg|linux}} (モジュールとして)パッケージに含まれています。ユーザースペースのユーティリティは {{pkg|btrfs-progs}} で利用可能です。
+
Btrfs はデフォルトのカーネルに含まれており、ツール ({{pkg|btrfs-progs}}) は [core] リポジトリから入手できます。[[GRUB (日本語)|GRUB 2]], [[mkinitcpio (日本語)|mkinitcpio]], [[Syslinux (日本語)|Syslinux]] には Btrfs のサポートがあるので追加の設定は必要ありません。
  
マルチデバイスのサポート (btrfs の RAID 機能) や、起動の初期段階での '''btrfs ボリューム''' を使うには、(mkinitcpio パッケージによって提供される) ''btrfs'' mkinitcpio フックを有効にして、root btrfs ボリュームなどを使えるようにする必要があります。
+
== ファイルシステムの作成 ==
しかし、抜き身の btrfs パーティションを使うだけならば、このフックは必要ありません。
+
  
より多くのオプションや機能を使うために、[[Arch User Repository (日本語)|AUR]] から {{AUR|mkinitcpio-btrfs}} をインストールすることも''可能です''。このパッケージでは自動ロールバック機能が欲しい人のために ''btrfs_advanced'' という mkinitcpio フックがインストールされます。
+
Btrfs ファイルシステムは新規作成することも既存のファイルシステムから変換することも可能です。
  
== Btrfs パーティションを作成する ==
+
=== 新しいファイルシステムを作成する ===
{{Warning|[[GRUB|Grub 2]] は btrfs パーティションをブートできますが、モジュールは ext4 よりも大きくなります。つまり grub-install によって作られる core.img ファイルは MBR と最初のパーティションの間に収まらないかもしれません。GPT を使うか最初のパーティションの前に1,2MBの追加の空きスペースを作ることでこれを解決できます。}}
+
  
=== Btrfs のための新しいパーティションをフォーマットする ===
+
パーティションをフォーマットするには次を実行してください:
  
  # mkfs.btrfs [options] dev [dev ...]
+
  # mkfs.btrfs /dev/<partition>
  
複数のデバイスを選択することで RAID を作ることができます。サポートしている RAID レベルには RAID 0, RAID 1, RAID 10 があります。デフォルトでは、メタデータがミラーされデータは省かれます。
+
{{Note|Btrfs v0.20-rc1-253-g7854c8b 現在、デフォルトのブロックサイズは 4k です。}}
  
=== Ext3/4 を Btrfs に変換する ===
+
大きいブロックサイズをデータ・メタデータに使うには、下の例のように -l スイッチを使って leafsize の値を指定して下さい (例: 16k ブロック):
{{Warning|[[GRUB Legacy]] は root として btrfs を起動できません。[[GRUB]] か [[Syslinux]] をインストールする必要があります。このガイドではユーザーがこのことを既に知っていると仮定しています。}}
+
  
# ライブ CD を起動します (例: Arch)
+
# mkfs.btrfs -l 16k /dev/<partition>
# {{ic|btrfs-convert <root-partition>}} を実行します
+
# 変換するパーティションをマウントし {{ic|/etc/fstab}} を編集してパーティションタイプにより {{ic|auto}} か {{ic|btrfs}} を指定します。また、btrfs では起動毎にファイルシステムをチェックする必要がないので {{ic|fs_passno}} パラメータ (最後のフィールド) を {{ic|0}} に設定するべきです。
+
# システムに Chroot して GRUB エントリをリビルドします (よくわからない場合は [[Install from Existing Linux]] や [[GRUB]] を見て下さい)。
+
  
<tt>btrfs-convert</tt> した後、全てが問題ないか確認してください。変更を適用するには、保存されたイメージを削除し、イメージがあるサブボリュームを削除し、スペースを回復するためにドライブを調整してください。例えば、<tt>/home</tt> を btrfs に変換した後:
+
複数のデバイスを入力して RAID を作成することもできます。サポートされている RAID レベルは RAID 0, RAID 1, RAID 10 などです。デフォルトではメタデータはミラーされデータはストライピングされます。
  
  rm /home/ext2_saved/*
+
  # mkfs.btrfs [options] /dev/<part1> /dev/<part2>
  btrfs subvolume delete /home/ext2_saved
+
 
 +
=== Ext3/4 から変換 ===
 +
 
 +
インストール CD から起動して、次を実行することで変換できます:
 +
 
 +
# btrfs-convert /dev/<partition>
 +
 
 +
パーティションをマウントして、ファイルを確認して変換をテストしてください。{{ic|/etc/fstab}} を適切に変更する必要があります ('''type''' を btrfs に '''fs_passno''' [the last field] を 0 にしてください、Btrfs は起動時にファイルシステムのチェックを行いません)。また、パーティションの UUID も変わるので注意してください。UUID を使っている場合は fstab をそれに合わせて更新してください。システムに {{ic|chroot}} して GRUB メニューリストを再生成してください ([[Install from Existing Linux]] と [[GRUB (日本語)|GRUB]] を参照)。
 +
 
 +
最後に、保存したイメージを削除し、イメージがあるサブボリュームを削除し、スペースをドライブが回収するようにしてください。
 +
 
 +
# rm /ext2_saved/*
 +
  # btrfs subvolume delete /ext2_saved
 +
 
 +
== 制限 ==
 +
 
 +
試行する前に知っておくべき制限事項が存在します。
  
 
=== 暗号化 ===
 
=== 暗号化 ===
 +
 
Btrfs にはビルトインの暗号化サポートはありません(将来実装される予定です)が、<code>mkfs.btrfs</code> をする前にパーティションを暗号化することができます。[[Dm-crypt with LUKS]] を見て下さい。
 
Btrfs にはビルトインの暗号化サポートはありません(将来実装される予定です)が、<code>mkfs.btrfs</code> をする前にパーティションを暗号化することができます。[[Dm-crypt with LUKS]] を見て下さい。
  
 
(既に btrfs ファイルシステムを作成してしまっている場合、[[EncFS]] や [[TrueCrypt]] などを使うことができます。ただし btrfs の機能のいくつかが使えなくなるかもしれません。)
 
(既に btrfs ファイルシステムを作成してしまっている場合、[[EncFS]] や [[TrueCrypt]] などを使うことができます。ただし btrfs の機能のいくつかが使えなくなるかもしれません。)
  
== Btrfs の機能 ==
+
=== スワップファイル ===
 +
 
 +
Btrfs はスワップファイルをサポートしていません。これはスワップファイルに必要な機能が Btrfs に存在しないためです。<sup>[https://btrfs.wiki.kernel.org/index.php/FAQ#Does_btrfs_support_swap_files.3F link]</sup> ループデバイスにスワップファイルをマウントすることは可能ですがハイバネートには使えません。systemd のサービスファイルが利用可能です {{AUR|systemd-loop-swapfile}}。
 +
 
 +
=== GRUB2 と core.img ===
 +
 
 +
[[GRUB (日本語)|Grub 2]] は Btrfs パーティションを起動することができますが、そのモジュールは ext4 などよりも大きく、grub-install によって作成される core.img がMBR と最初のパーティションの間に収まらない可能性があります。GPT を使うか、最初のパーティションの前に数 MB の空きスペースを作ることでこの問題を解決できます。
 +
 
 +
RAID セットアップから起動した時にエラー {{ic|1=error no such device: root}} が表示される場合、{{ic|/usr/share/grub/grub-mkconfig_lib}} を編集して {{ic|1=echo "  search --no-floppy --fs-uuid --set=root ${hints} ${fs_uuid}"}} からクォートを削除してください。grub の設定を再生成すればエラーを出さずに起動できるはずです。
 +
 
 +
== 機能 ==
 +
 
 +
様々な機能が備わっていて、それぞれ設定が可能です。
  
 
=== コピーオンライト (CoW) ===
 
=== コピーオンライト (CoW) ===
 +
 +
ファイルシステムにどのデータを書き込むかは BTRFS とシステム全体の設定によって決められます。BTRFS のデフォルトでは30秒のチェックポイントインターバルでファイルシステムに新しいデータが送られます。Btrfs v0.20-rc1-253-g7854c8b 現在、[http://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg26090.html patched version of fs/btrfs/disk-io.c] をリコンパイルしない限りこの設定を変えることはできません。01-Aug-2013 に、David Sterba はこの値を変更できるようにする [http://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg26116.html パッチ] を送っています。
 +
 +
システム全体の設定もインターバルに影響を与えます。それには /proc/sys/vm/* 以下のファイルも含まれており、この wiki では扱っていません。Documentation/sysctl/vm.txt にこれらのファイルに関するカーネルドキュメントがあります。
 +
 
CoW にはアドバンテージがありますが、random write が少ない大きなファイルを扱うときのパフォーマンスについてはあまり良い影響を与えません。データベースファイルや仮想マシンメージについては CoW を無効化することが推奨されます。
 
CoW にはアドバンテージがありますが、random write が少ない大きなファイルを扱うときのパフォーマンスについてはあまり良い影響を与えません。データベースファイルや仮想マシンメージについては CoW を無効化することが推奨されます。
 
"nodatacow" オプションを使ってマウントすることで全てのブロックデバイスで CoW を無効にできます。しかしながら、これではファイルシステム全体で CoW を無効にすることにはなりません。
 
"nodatacow" オプションを使ってマウントすることで全てのブロックデバイスで CoW を無効にできます。しかしながら、これではファイルシステム全体で CoW を無効にすることにはなりません。
 +
 
ファイルやディレクトリ単体で CoW を無効化するには、次のコマンドを使って下さい:
 
ファイルやディレクトリ単体で CoW を無効化するには、次のコマンドを使って下さい:
  # chattr +C [file/directory path]
+
 
chattr man ページより: btrfs では、新しい、または空のファイルには 'C' フラグがセットされます。既にデータブロックを持つファイルにフラグが設定してある場合、ファイルに対応したブロックが完全に安定状態の時にフラグの定義が消されます。ディレクトリに 'C' フラグがセットされている場合、そのディレクトリ自体には影響がなく、ディレクトリに作成された新しいファイルに No_COW 属性が付けられます。
+
  # chattr +C </dir/file>
 +
 
 +
chattr man ページより: btrfs では、新しい、または空のファイルには 'C' フラグがセットされます。既にデータブロックを持つファイルにフラグが設定してある場合、ファイルに対応したブロックが完全に安定状態の時にフラグの定義が消されます。ディレクトリに 'C' フラグがセットされている場合、そのディレクトリ自体には影響がなく、ディレクトリに作成された新しいファイルに No_COW 属性が付けられます。
 +
 
 +
同じように、ファイルのコピー時に CoW を強制してスペースを節約するには次を使って下さい:
 +
 
 +
# cp --reflink source dest
 +
 
 +
dest ファイルが変更されると、元から変更されたブロックだけがディスクに書き込まれます。cp を 'cp --reflink=auto' にするエイリアスを作ってもいいかもしれません。
  
 
=== マルチデバイスファイルシステムと RAID 機能 ===
 
=== マルチデバイスファイルシステムと RAID 機能 ===
 +
 
====マルチデバイスファイルシステム====
 
====マルチデバイスファイルシステム====
''btrfs'' ファイルシステムを作成する際に、''mkfs.btrfs'' したい分だけのパーティション・デバイスを指定することができます。ファイルシステムは指定された全てのデバイスにわたって作成されます。このように'''"'''マージ'''"'''することによって、複数のパーティションやデバイスを大きな ''btrfs'' ファイルシステムにできるのです。
+
 
 +
''btrfs'' ファイルシステムを作成する際に、''mkfs.btrfs'' したい分だけのパーティション・デバイスを指定することができます。ファイルシステムは指定された全てのデバイスにわたって作成されます。このように '''"'''pool'''"''' することによって、複数のパーティションやデバイスを大きな ''btrfs'' ファイルシステムにできるのです。
  
 
また、既に存在している btrfs ファイルシステムからデバイスを追加・削除することも可能です(用心が必要ですが)。
 
また、既に存在している btrfs ファイルシステムからデバイスを追加・削除することも可能です(用心が必要ですが)。
Line 73: Line 106:
  
 
====RAID 機能====
 
====RAID 機能====
マルチデバイスファイルシステムを作成するとき、ファイルシステムに追加したデバイス全体で RAID0, RAID1, RAID10 を使うように指定することもできます。
+
 
 +
マルチデバイスファイルシステムを作成するとき、ファイルシステムに追加したデバイス全体で RAID0, RAID1, RAID10 を使うように指定することもできます。RAID レベルはデータとメタデータで別個に適用することができます。デフォルトでは、メタデータはシングルボリュームやマルチディスクの RAID1 で複製されます。
 +
 
 +
btrfs works in block-pairs for raid0, raid1, and raid10. This means:
 +
 
 +
raid0 - block-pair stripped across 2 devices<br>
 +
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:<br>
 +
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 [https://btrfs.wiki.kernel.org/index.php/FAQ#How_much_space_do_I_get_with_unequal_devices_in_RAID-1_mode.3F the BTRFS FAQ] for more info.
  
 
=== サブボリューム ===
 
=== サブボリューム ===
 +
 
btrfs の機能のひとつにサブボリュームがあります。サブボリュームは基本的にファイルとディレクトリを保持している名前の付いた b 木です。root ツリーのツリーの中に inode を持ち、root 以外の所有者やグループも設定できます。サブボリュームは任意でブロックを割り当てることもできます。ブロックとファイルエクステントの全ては参照カウントでありスナップショットを可能にしています。仮想マシンの動的な容量拡張に似て、必要な時に必要な分だけのデバイス上の容量を使います。また、サブボリュームを異なったマウントオプションを使ってマウントすることでセキュリティの柔軟性を持たせることもできます。
 
btrfs の機能のひとつにサブボリュームがあります。サブボリュームは基本的にファイルとディレクトリを保持している名前の付いた b 木です。root ツリーのツリーの中に inode を持ち、root 以外の所有者やグループも設定できます。サブボリュームは任意でブロックを割り当てることもできます。ブロックとファイルエクステントの全ては参照カウントでありスナップショットを可能にしています。仮想マシンの動的な容量拡張に似て、必要な時に必要な分だけのデバイス上の容量を使います。また、サブボリュームを異なったマウントオプションを使ってマウントすることでセキュリティの柔軟性を持たせることもできます。
  
Line 88: Line 136:
 
これでシステムロールバックも可能になります。
 
これでシステムロールバックも可能になります。
  
root パーティションで使う場合、{{ic|/etc/mkinitcpio.conf}} で {{ic|btrfs}} を HOOKS に加えるだけでなく '''crc32c''' (または Intel のマシン用の '''crc32c-intel''') をモジュールに加えるのが推奨されます。
+
root パーティションで使う場合、{{ic|/etc/mkinitcpio.conf}} のモジュールに '''crc32c''' (または Intel のマシン用の '''crc32c-intel''') を加えるのが推奨されます。
  
 
=== スナップショット ===
 
=== スナップショット ===
Line 99: Line 147:
  
 
=== デフラグメンテーション ===
 
=== デフラグメンテーション ===
 +
 
Btrfs はオンラインデフラグをサポートしています。root フォルダのメタデータをデフラグするには、次を実行してください:
 
Btrfs はオンラインデフラグをサポートしています。root フォルダのメタデータをデフラグするには、次を実行してください:
 
  # btrfs filesystem defragment /
 
  # btrfs filesystem defragment /
Line 106: Line 155:
  
 
=== 圧縮 ===
 
=== 圧縮 ===
Btrfs は透過圧縮をサポートしています、これはパーティション上の全てのファイルが自動的に圧縮されることを意味します。このことはファイルの容量を減らすだけでなく、特に [http://www.phoronix.com/scan.php?page=article&item=btrfs_lzo_2638&num=1 lzo アルゴリズム]を使っている場合は[http://www.phoronix.com/scan.php?page=article&item=btrfs_compress_2635&num=1 パフォーマンスを向上させる]こともできます。圧縮は {{ic|1=compress=gzip}} か {{ic|1=compress=lzo}} マウントオプションを使って有効にします。マウントオプションが追加された後に作成・変更されたファイルだけに圧縮が適用されるので、圧縮の効果を完全に享受するにはインストール中に有効にして下さい。[[Beginners' Guide (日本語)#ドライブの準備|ドライブの準備]]をした後、他のターミナルに切り替えて ({{ic|Ctrl+Alt+number}})、次のコマンドを実行してください:
+
 
 +
Btrfs は透過圧縮をサポートしています、これはパーティション上の全てのファイルが自動的に圧縮されることを意味します。このことはファイルの容量を減らすだけでなく、特に [http://www.phoronix.com/scan.php?page=article&item=btrfs_lzo_2638&num=1 lzo アルゴリズム]を使っている場合は [http://www.phoronix.com/scan.php?page=article&item=btrfs_compress_2635&num=1 パフォーマンスを向上させる] こともできます。圧縮は {{ic|1=compress=gzip}} か {{ic|1=compress=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.
 +
 
 +
[[Beginners' Guide (日本語)#ドライブの準備|ドライブの準備]]をした後、他のターミナルに切り替えて ({{ic|Ctrl+Alt+number}})、次のコマンドを実行してください:
 
  # mount -o remount,compress=lzo /dev/sdXY /mnt/target
 
  # mount -o remount,compress=lzo /dev/sdXY /mnt/target
  
 
インストールが完了した後に、{{ic|/etc/[[fstab (日本語)|fstab]]}} の root ファイルシステムのマウントオプションに {{ic|1=compress=lzo}} を加えて下さい。
 
インストールが完了した後に、{{ic|/etc/[[fstab (日本語)|fstab]]}} の root ファイルシステムのマウントオプションに {{ic|1=compress=lzo}} を加えて下さい。
 +
 +
=== チェックポイントインターバル ===
 +
Linux 3.12 から、チェックポイントインターバルをデフォルトの30秒から変えることができるようになっています。{{ic|/etc/fstab}} の btrfs パーティションに '''commit''' マウントフラグを追加してください。
 +
 +
LABEL=arch64 / btrfs defaults,noatime,ssd,compress=lzo,commit=120 0 0
 +
 +
=== パーティショニング ===
 +
 +
Btrfs はデータストレージデバイス全体を占領して [[Master Boot Record (日本語)|MBR]] や [[GUID Partition Table (日本語)|GPT]] パーティショニングスキームを置き換えることができます。[[#サブボリューム|サブボリューム]]を使ってパーティションを模すことが可能です。ディスクを一つしか使っていない場合、このアプローチにはいくつか制限があります:
 +
 +
* [[fstab (日本語)|マウントポイント]]によって異なる[[File_Systems (日本語)|ファイルシステム]]を使うことはできません
 +
* Btrfs は[[Swap (日本語)#スワップファイル|スワップファイル]]をサポートしていないので[[Swap (日本語)|スワップ領域]]を使うことができません。[[Swap (日本語)#スワップパーティション|スワップパーティション]]も作れません
 +
* [[Unified Extensible Firmware Interface (日本語)|UEFI]] を使って起動できません
 +
 +
既存のパーティションテーブルを Btrfs で上書きするには、次のコマンドを実行してください:
 +
# mkfs.btrfs /dev/sdX
 +
{{ic|/dev/sdaX}} を指定するとパーティションスキーム全体を置き換える代わりに既存のパーティションがフォーマットされます。
 +
 +
[[Master Boot Record (日本語)|MBR]] のデータストレージデバイスと同じ方法で[[Bootloaders|ブートローダ]]をインストールしてください。例えば [[GRUB (日本語)#Install_to_440-byte_MBR_boot_code_region|GRUB]] なら:
 +
# grub-install --recheck /dev/sdX
  
 
== 資料 ==
 
== 資料 ==
Line 115: Line 189:
 
* [https://btrfs.wiki.kernel.org/index.php/Problem_FAQ BTRFS Problem FAQ] - 公式 FAQ
 
* [https://btrfs.wiki.kernel.org/index.php/Problem_FAQ BTRFS Problem FAQ] - 公式 FAQ
 
* [http://www.funtoo.org/wiki/BTRFS_Fun Funtoo Btrfs wiki entry] - Very well-written article
 
* [http://www.funtoo.org/wiki/BTRFS_Fun Funtoo Btrfs wiki entry] - Very well-written article
 +
* [http://www.phoronix.com/scan.php?page=news_item&px=MTA0ODU Avi Miller presenting BTRFS] at SCALE 10x.  Jan/2012.
 +
* [http://www.phoronix.com/scan.php?page=news_item&px=MTA4Mzc Summary of Chris Mason's talk from LFCS 2012]
 +
* On 2012-03-28, {{Pkg|btrfs-progs}} includes btrfsck, a tool that can fix errors on btrfs filesystems.
 +
* Oracle has packaged this version of btrfs-progs and released it to their customers of Oracle Linux 6 and backported to 5.
 +
* {{AUR|mkinitcpio-btrfs}}: for roll-back abilities (currently unmaintained).

Revision as of 15:47, 7 November 2013

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 にはアドバンテージがありますが、random write が少ない大きなファイルを扱うときのパフォーマンスについてはあまり良い影響を与えません。データベースファイルや仮想マシンメージについては CoW を無効化することが推奨されます。 "nodatacow" オプションを使ってマウントすることで全てのブロックデバイスで CoW を無効にできます。しかしながら、これではファイルシステム全体で CoW を無効にすることにはなりません。

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

# chattr +C </dir/file>

chattr の man ページより: btrfs では、新しい、または空のファイルには 'C' フラグがセットされます。既にデータブロックを持つファイルにフラグが設定してある場合、ファイルに対応したブロックが完全に安定状態の時にフラグの定義が消されます。ディレクトリに 'C' フラグがセットされている場合、そのディレクトリ自体には影響がなく、ディレクトリに作成された新しいファイルに No_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

資料