Btrfs は、Linux 用のオープンソースの汎用ファイル システムです。この名前は、B ツリーを使用して内部ファイル システム構造を格納することに由来します。ファイルシステムには、「Butter F S」や「B-tree F S」など、さまざまな名前が使用されています。 Btrfs の開発は 2007 年に Oracle で開始され、現在、多くの企業 (Red Hat、Fujitsu、Intel、SUSE など) が開発作業に貢献しています。 Btrfs はメインラインの Linux カーネルに含まれています。
Btrfs スナップショット
Btrfs サブボリュームは、スナップショットとクローンを作成して、追加の B ツリーを作成できます。スナップショットは、ある時点で作成されたサブボリュームのコピーとして開始されます。スナップショットを書き込み可能にして、元のサブボリュームの進化したクローンとして使用できます。または、スナップショットをサブボリュームの安定したイメージとして使用して、バックアップや他のシステムへの移行を行うことができます。スナップショットはすばやく作成でき、最初はほとんどディスク容量を消費しません。
サブボリュームの書き込み可能/読み取り可能スナップショットを作成するには、btrfs subvolume snapshot コマンドを使用します。次の例では、SV1 サブボリュームのスナップショットを作成します:
# btrfs subvolume snapshot /btrfs/SV1 /btrfs/SV1/SV1-snap Create a snapshot of '/btrfs/SV1' in '/btrfs/SV1/SV1-snap'
btrfs サブボリューム スナップショットを使用 -r 読み取り専用スナップショットを作成するオプション:
# btrfs subvolume snapshot -r /btrfs/SV1 /btrfs/SV1-rosnap Create a readonly snapshot of '/btrfs/SV1' in '/btrfs/SV1-rosnap'
ls コマンドを使用すると、スナップショットは通常のディレクトリとして表示されます。スナップショットは、btrfs subvolume list コマンドの出力にも表示されます。
# btrfs subvolume list /btrfs ID 257 gen 10 top level 5 path SV1 ID 258 gen 9 top level 257 path SV1/SV1-snap ID 259 gen 10 top level 5 path SV1-rosnap
ファイルのスナップショットを撮る
「cp –reflink」を使用できます 」 コマンドを使用して、ファイルのスナップショットを取得します。このオプションを使用すると、ファイル システムは既存の i ノードを指す新しいリンクを作成しませんが、代わりに元のコピーと同じディスク ブロックを共有する新しい i ノードを作成します。新しいファイルは元のファイルのコピーのように見えますが、データ ブロックは複製されていません。これにより、コピーをほぼ瞬時に行うことができ、ディスク容量も節約できます。ファイルのコンテンツが時間の経過とともに分岐するにつれて、必要なストレージの量が増えます。制限の 1 つは、この操作は同じファイル システムの境界内および同じサブボリューム内でのみ機能することです。
次の例では、cp –reflink コマンドを使用してファイルをコピーします。使用されたスペースは、コピー操作の前後に与えられます。使用されるスペースは増加しないことに注意してください。
# df -hP /btrfs Filesystem Size Used Avail Use% Mounted on /dev/sda 10G 23M 8.0G 1% /btrfs
# cp --reflink /btrfs/SV1/vmlinuz-3.10.0-693.17.1.el7.x86_64 /btrfs/SV1/copy_of_vmlinuz
# df -h /btrfs Filesystem Size Used Avail Use% Mounted on /dev/sda 10G 23M 8.0G 1% /btrfs
サブボリュームまたはスナップショットのマウント
デフォルトでは、Linux は ID が 0 の親 Btrfs ボリュームをマウントします。この例では、サブボリュームとスナップショットを作成する前に、次のマウント コマンドが発行されました。
# mount /dev/sdb /btrfs
サブボリューム SV1 は /btrfs に作成されました。 ls コマンドはサブボリュームを表示します:
# ls -l /btrfs total 0 drwxr-xr-x. 1 root root 84 Mar 29 11:01 SV1
次の例では、ファイルを SV1 にコピーし、SV1 のスナップショットを作成して、サブボリュームとスナップショットの両方に同じファイルが含まれていることを確認します:
# cp -p /boot/vmlinuz-3.10.0-693.17.1.el7.x86_64 /btrfs/SV1
# btrfs sub snapshot /btrfs/SV1 /btrfs/SV1-snap Create a snapshot of '/btrfs/SV1' in '/btrfs/SV1-snap'
# ls /btrfs/SV1* /btrfs/SV1: vmlinuz-3.10.0-693.17.1.el7.x86_64 /btrfs/SV1-snap: vmlinuz-3.10.0-693.17.1.el7.x86_64
/btrfs をアンマウントして再マウントすると、親の Btrfs ボリュームがデフォルトでマウントされます:
# ls /btrfs/ SV1 SV1-snap # umount /btrfs # mount /dev/sda /btrfs/ # ls /btrfs/ SV1 SV1-snap
ただし、btrfs サブボリュームまたはスナップショットをディスク デバイスのようにマウントすることはできます。親サブボリュームの代わりにスナップショットをマウントすると、ファイル システムの状態が、スナップショットが作成された時点に効果的にロールバックされます。次の例では、コンテンツが SV1-snap とは異なるようにファイルを SV1 にコピーします:
# cp testfile /btrfs/SV1
# ls -l /btrfs/SV1* /btrfs/SV1: total 5760 -rw-r--r--. 1 root root 19 Mar 29 11:44 testfile -rwxr-xr-x. 1 root root 5890720 Jan 25 20:26 vmlinuz-3.10.0-693.17.1.el7.x86_64 /btrfs/SV1-snap: total 5756 -rwxr-xr-x. 1 root root 5890720 Jan 25 20:26 vmlinuz-3.10.0-693.17.1.el7.x86_64
サブボリュームまたはスナップショットをマウントするには、まず、マウントするサブボリュームの ID 番号を決定する必要があります。 ID 番号を表示するには、btrfs subvolume list コマンドを使用します。次の例では、ルート サブボリュームの ID は 257 です:
# btrfs sub list /btrfs ID 257 gen 12 top level 5 path SV1 ID 258 gen 9 top level 5 path SV1-snap
btrfs「subvolume set-default」を使用します 」 コマンドを使用して、ファイル システムのデフォルトのサブボリュームを設定します。たとえば、ID が 257 の SV1 Btrfs サブボリュームをマウントするには:
# btrfs subvolume set-default 257 /btrfs
次に、Btrfs ファイル システムをアンマウントして再マウントする必要があります。ルート レベルには SV1 サブボリュームの内容が含まれ、ルート サブボリュームは表示されなくなります。
# ls -l /btrfs total 5760 -rw-r--r--. 1 root root 19 Mar 29 11:44 testfile -rwxr-xr-x. 1 root root 5890720 Jan 25 20:26 vmlinuz-3.10.0-693.17.1.el7.x86_64
「-o subvolid」を使用することもできます ルート サブボリューム、サブボリューム、またはスナップショットをマウントするには、mount コマンドに ” オプションを追加します。たとえば、ルート サブボリュームをマウントするには:
# umount /btrfs # mount -o subvolid=5 /dev/sda /btrfs
# ls -l /btrfs total 0 drwxr-xr-x. 1 root root 84 Mar 29 11:44 SV1 drwxr-xr-x. 1 root root 68 Mar 29 11:17 SV1-snapBtrfs ファイル システムを作成してマウントする方法 (例で説明)
Btrfs ボリューム/ファイル システムのサイズを変更/拡張する方法