Btrfs/ja

Btrfs は、ファイルシステムです. ]]Btrfs は Oracle、Red Hat、富士通、Intel、SUSE、STRATOなどによって共同で開発されており、GPL の条件下でライセンスされて広く貢献を受け入れています.

特徴
Ext4 が安全確実で、広い領域をもつ巨大なファイルシステムも扱えるのにもかかわらず、なぜ Btrfs に切り替えるのでしょうか. たしかに Btrfs は未だ試験的なものと思われており、安定性の向上途上です. しかし、Linux システムのデフォルトのファイルシステムとなる時が近づきつつあります. Linux のディストリビューションのなかには、最新のリリースにおいて既に Btrfs に切り替え始めたものもあります. Btrfs は、ZFS にも備わっている一般的な先進機能に対応しています. こうした機能は、 BSD 系ディストリビューションや NAS 機器において ZFS の人気が高くなっている理由でもあります.


 * コピーオンライト (CoW) とスナップショット - "ホット" なファイルシステムや仮想マシン (VM) からでさえも、増分バックアップを容易にします.
 * ファイルレベルチェックサム - ファイル毎のメタデータがチェックサムを含み、エラーの検出と修復に使用されます.
 * 圧縮 - ファイルは動的に圧縮・展開され、読み込み性能を向上させます.
 * 自動デフラグメンテーション - ファイルシステムは使用中に、バックグラウンドスレッドによって調整されます.
 * サブボリューム - 複数のファイルシステムは、それぞれのパーティションの中に入れて使う代わりに、単一の容量プールを共有できます.
 * RAID - Btrfs は固有の RAID 実装を持っており、RAID を行うのに LVM あるいは は必要ではありません. 現時点では RAID 0、1、10 がサポートされています；RAID 5 と 6 は不安定と見られています.
 * パーティションは任意です - Btrfs はパーティションに入れて使うことができる一方で、生デバイス を直接使用する能力も持っています.
 * データ重複排除 - 限定的なデータ重複排除サポートを持っています；しかしながら、重複排除は将来的に Btrfs の標準的機能となる予定です. これにより、Btrfs はバイナリ差分によってファイル比較を行うことで、容量を節約できます.

Down the road, new clustered filesystems will readily take advantage of Btrfs with its copy on write and other advanced features for their object stores. Ceph is one example of a clustered filesystem that looks very promising, and can take advantage of Btrfs.

カーネル
Btrfs に対応するには、つぎのカーネルオプションを有効にしてください:

Emerge
パッケージには、 Btrfs を扱うために必要なユーティリティが入っています.

使い方
Btrfs の長いコマンドをタイプすることはすぐに手間になるでしょう. それぞれのコマンド（最初の コマンド以外）はとても短い命令に短縮できます. この方法は、コマンドラインから作業するときにタイプする文字数を減らすのに役立ちます.

例えば、 にあるファイルシステムをデフラグするには、長いコマンドは次のようになります:

Shorten each of the longer commands after the command by reducing them to their unique, shortest prefix. In this context, unique means that no other commands will match the command at the command's shortest length. The shortened version of the above command is:

で始まる コマンドは他にありません；  が唯一です. コマンドの下で、 サブコマンドも同様です.

作成
パーティションを Btrfs で作成するには:

上の例の、 をフォーマットしたいパーティション番号で、  をフォーマットしたいディスクレターで置き換えてください. 例えば、システムの 1 番目のディスクの 3 番目のパーティションを Btrfs でフォーマッしたい場合には、次を実行してください:

マウント
ファイルシステムを作成したら、さまざまな方法でマウント可能です:


 * - 手動マウント.
 * - にマウントポイントを定義することで、システム起動時に自動でマウントされます.
 * Removable media - 必要に応じた自動マウント（USB ドライブに便利です）.
 * AutoFS - ファイルシステムアクセス時に自動マウント.

ext* ベースファイルシステムから変換する
ユーティリティを使用して、ext2、ext3、ext4 ファイルシステムを Btrfs に変換することができます.

次の手順はアンマウントされたファイルシステムの変換のみサポートしています. ルートパーティションを変換するためには、システムレスキューディスク（SystemRescueCD は上手く働きます）で起動してから、ルートパーティションに対して変換コマンドを実行してください.

まず、マウントポイントを確実にアンマウントしてください:

適切な ツールを使用してファイルシステムの整合性を確認してください. 次の例ではファイルシステムは ext4 としています:

を使用して、ext* フォーマットされたデバイスを Btrfs フォーマットされたデバイスに変換してください:

デバイスがフォーマットされたら、忘れずに を編集して、ファイルシステムのカラムを ext4 から Btrfs に変更してください:

デフラグ
Btrfs の機能のひとつに、オンラインでのデフラグメンテーションがあります. ルート Btrfs ファイルシステムをデフラグするには、次を実行してください:

圧縮
Btrfs は zlib、lzo、ztsd (v5.1.0) 圧縮アルゴリズムを使用した透過的圧縮をサポートしています.

ファイルの属性を設定することで特定のファイルのみ圧縮することも可能です:

マウントオプションは、新しく作成されたファイルをすべて圧縮するように、デフォルトの振る舞いを設定します. ファイルシステム全体を再圧縮するには、次のコマンドを実行してください:

CPU とディスク性能によっては、lzo 圧縮を使うと全体のスループットが向上するかもしれません.

lzo の代わりに zlib または zstd 圧縮アルゴリズムを使用することもできます. zlib は遅いですが高い圧縮率を持ち、zstd は両者の間でいい比率となっています.

To force zlib compression across the whole filesystem:

圧縮レベル
Since kernel version 4.15.0, zlib compression can now be set by levels 1-9. Since kernel version 5.1.0 zstd can be set to levels 1-15. For example, to set zlib to maximum compression at mount time:

Or to set minimal compression:

Or adjust compression by remounting:

The compression level should be visible in or by checking the most recent  output using the following command:

Compression ratio and disk usage
The usual userspace tools for determining used and free space like and  may provide inaccurate results on a Btrfs partition due to inherent design differences in the way files are written compared to, for example, ext2/3/4.

It is therefore advised to use the du/df alternatives provided by the btrfs userspace tool. In addition to that, The tool found in the sys-fs/compsize package can be helpful in providing additional information regarding compression ratios and the disk usage of compressed files. The following are example uses of these tools for a btrfs partition mounted under.

RAID
Btrfs can be used with multiple block devices in order to create RAIDs. Using Btrfs to create filesystems that span multiple devices is much easier than creating using since there is no initialization time needed for creation.

BTRFS handles data and metadata separately. This is an important factor to keep in mind when using a multi-device filesystem. It is possible to use separate profiles for data and metadata block groups. For example, metadata could be configured across multiple devices in RAID1, while data could be configured to RAID5. This is profile possible when using three or more block devices, since RAID5 requires a minimum of 3 block devices.

This type of profile offers the benefit of redundancy for metadata on each device and striping for data across devices, which increases read speeds. The drawback of this profile is more space than necessary is used for metadata, and write speeds are reduced for data blocks, since RAID5 uses a parity bit.

Creation
デバイス全体に対して RAID を形成するのに最も簡単な方法は:

Conversion
Converting between RAID profiles is possible with the balance sub-command. For example, say three block devices are presently configured for RAID1 and mounted at. It is possible to convert the data in this profile from RAID1 to RAID5 with using the following command:

Conversion can be performed while the filesystem is online and in use. Possible RAID modes in btrfs include RAID0, RAID1, RAID5, RAID6, and RAID10. See the upstream BTRFS wiki for more information.

By device path
Block devices (disks) can be removed from multi-device filesystems using the btrfs device remove subcommand:

By device ID
Use the usage subcommand to determine the device IDs:

Next use the device ID to remove the device, in this case will be removed:

サブボリューム
As mentioned above in the features list, Btrfs can create subvolumes. Subvolumes can be used to better organize and manage data. They become especially powerful when combined with snapshots. Important distinctions must be made between Btrfs subvolumes and subvolumes created by Logical Volume Management (LVM). Btrfs subvolumes are not block level devices, they are POSIX file namespaces. They can be created at any location in the filesystem and will act like any other directory on the system with one caveat: subvolumes can be mounted and unmounted. Subvolumes are nestable (subvolumes can be created inside other subvolumes), and easily created or removed.

作成
To create a subvolume, issue the following command inside a Btrfs filesystem's name space:

Replace  with the desired destination and subvolume name. For example, if a Btrfs filesystem exists at, a subvolume could be created inside it using the following command:

一覧
To see the subvolume(s) that have been created, use the  command followed by a Btrfs filesystem location. If the current directory is somewhere inside a Btrfs filesystem, the following command will display the subvolume(s) that exist on the filesystem:

If a Btrfs filesystem with subvolumes exists at the mount point created in the example command above, the output from the list command will look similar to the following:

削除
Subvolumes can be properly removed by using the  command followed by the path to the subvolume. All available subvolume paths in a Btrfs filesystem can be seen using the list command above.

As above, replace  with the actual path to the subvolume to be removed. To delete the subvolume used in the examples above, the following command would be issued:

スナップショット
Snapshots are subvolumes that share data and metadata with other subvolumes. This is made possible by Btrfs' Copy on Write (CoW) ability. Snapshots can be used for several purposes, one of which is to create backups of file system structures at specific points in time.

ルートのファイルシステムが Btrfs であるときには、  コマンドを用いてスナップショットの作成が可能です:

The following small shell script can be added to a timed cron job to create a timestamped snapshot backup of a Btrfs formatted root filesystem. The timestamps can be adjusted to whatever is preferred by the user.

Mounting
A subvolume can be mounted in a location different from where it was created, or users can choose to not mount them at all. For example, a user could create a Btrfs filesystem in and create  and  subvolumes. The subvolumes could then be mounted at and, with the original top level subvolume left unmounted. This results in a configuration where the subvolumes' relative path from the top level subvolume is different from their actual path.

To mount a subvolume, perform the following command, where  is the relative path of the subvolume from the top level subvolume, obtainable through the   command:

Similarly, one can update the filesystem tab to mount their Btrfs subvolumes like so:

Using with VM disk images
When using Btrfs with virtual machine disk images, it is best to disable copy-on-write on the disk images in order to speed up IO performance. This can only be performed on files that are newly created. It also possible to disable CoW on all files created within a certain directory. For example, using the command:

Clear the free space cache
マウントオプションを指定してファイルシステムをマウントすることで、Btrfs 内の空きのキャッシュ領域を開放することが可能です. 例えば:

Btrfs hogging memory (disk cache)
When utilizing some of Btrfs' special abilities (like making many  copies or creating high amounts of snapshots), a lot of memory can be consumed and not freed fast enough by the kernel's inode cache. This issue can go undiscovered since memory dedicated to the disk cache might not be clearly visible in traditional system monitoring utilities. The utility (available as part of the  package) was specifically created to determine how much memory kernel objects are consuming:

If the inode cache is consuming too much memory, the kernel can be manually instructed to drop the cache by echoing an integer value to the file.

To be safe, and to help the kernel determine the maximum amount of freeable memory, be sure to run a before running the  commands below:

Most of the time Btrfs users will probably want to to reclaim just the slab objects (dentries and btrfs_inodes):

To clear the entire disk cache (slab objects and the page cache) use instead:

More information on kernel slabs can be found in this dedoimedo blog entry.

Mounting Btrfs fails, returning mount: unknown filesystem type 'btrfs'
The original solution by Tim on Stack Exchange inspired the following solution: build the kernel manually instead of using genkernel:

Btrfs root doesn't boot
Genkernel's initramfs as created with the command below doesn't load btrfs:

Compile support for btrfs in the kernel rather than as a module or Dracut to generate the initramfs.

参考

 * Btrfs snapshots - Script that creates snapshots when files have changed
 * Btrfs/System Root Guide - Use the Btrfs filesystem as a collection of subvolumes including one as a system root.
 * Btrfs native system root guide - An alternative guide on using a subvolume in a Btrfs filesystem as the system's root.
 * Btrbk - A backup tool for btrfs subvolumes, taking advantage of btrfs specific capabilities to create atomic snapshots and transfer them incrementally to specified backup locations.
 * Samba shadow copies - Using Samba to expose Shadow Copies as 'Previous Versions' to Windows clients.
 * Samba shadow copies - Using Samba to expose Shadow Copies as 'Previous Versions' to Windows clients.

外部の情報

 * https://wiki.debian.org/Btrfs - Debian wiki 内の記事
 * https://wiki.archlinux.org/index.php/Btrfs - ArchWiki 内の記事
 * http://www.funtoo.org/BTRFS_Fun - Funtoo wiki 内の BTRFS Fun 記事
 * http://marc.merlins.org/perso/btrfs/post_2014-05-04_Fixing-Btrfs-Filesystem-Full-Problems.html - いくつかの状況における、Btrfs ファイルシステムのニッチな問題を修復するためのヒントと小技.