3 Btrfsファイル・システムの管理

警告:

Oracle Linux 7は現在延長サポート中です。詳細は、Oracle Linux拡張サポートおよびOracleオープン・ソース・サポート・ポリシーを参照してください。

できるだけ早くアプリケーションとデータをOracle Linux 8またはOracle Linux 9に移行してください。

この章では、Oracle LinuxでBtrfsファイル・システムを管理するためのタスクについて説明します。

 Btrfsファイル・システムについて

btrfsファイル・システムは、大規模ストレージ・サブシステムの拡大するスケーラビリティ要件を満たすように設計されています。btrfsファイル・システムではその実装にBツリーを使用しているため、その名前は、正確な頭字語ではありませんが、そのデータ構造の名前に由来します。Bツリーは、ツリーがどれほど大きく成長しても、ファイル・システムおよびデータベースによってデータの大規模ブロックに効率的にアクセスして更新できるツリー状のデータ構造です。

btrfsファイル・システムでは、次の重要な機能が提供されます。
  • コピーオンライト機能によって、読取りと書込みの両方が可能なスナップショットを作成し、ファイル・システムを以前の状態にロールバックできます(ext3またはext4ファイル・システムから変換した後でも同様です)。

  • チェックサム機能によって、データ整合性が保証されます。

  • 透過的な圧縮によって、ディスク領域が節約されます。

  • 透過的なデフラグメンテーションによって、パフォーマンスが改善します。

  • 統合論理ボリューム管理によって、RAID 0、RAID 1またはRAID 10構成を実装し、ストレージ容量を動的に追加および削除できます。

ノート:

Brtfsファイル・システムがサポートされていない環境にスワップ・ファイルを構成します。

btrfsファイル・システムの詳細は、https://btrfs.wiki.kernel.org/index.php/Main_Pageを参照してください。

Btrfsファイル・システムの変更

次の表に、btrfsコマンドを使用してデバイスを追加または削除し、各デバイス全体にわたりファイル・システム・データおよびメタデータのレイアウトをリバランスする方法を示します。
コマンド 説明

btrfs device adddevicemountpoint

指定されたマウント・ポイントにマウントされているファイル・システムにデバイスを追加します。次に例を示します。

btrfs device add /dev/sdd /myfs

btrfs device deletedevicemountpoint

マウントされているファイル・システムからデバイスを削除します。次に例を示します。

btrfs device delete /dev/sde /myfs

btrfs device delete missingmountpoint

縮退モードでマウントされているファイル・システムから障害デバイスを削除します。次に例を示します。

btrfs device remove missing /myfs

縮退モードでファイル・システムをマウントするには、mountコマンドに-o degradedオプションを指定します。

RAID構成では、デバイスの数が必要な最小数を下回る場合、障害デバイスを削除する前に置換デバイスを追加する必要があります。

btrfs filesystem balancemountpoint

デバイスを追加または削除した後に、使用可能なデバイス全体にファイル・システム・データおよびメタデータを再分散します。

Btrfsファイル・システムの圧縮とデフラグ

btrfsファイル・システムを圧縮してその有効な容量を増加し、それをデフラグしてI/Oパフォーマンスを向上できます。

btrfsファイル・システムの圧縮を有効にするには、次のmountオプションのいずれかを指定します。
mountオプション 説明

compress=lzo

LZO圧縮を使用。

compress=zlib

zlib圧縮を使用。

LZOは圧縮率に優れており、zlibは圧縮速度に優れています。

btrfsファイル・システムは、それをデフラグすると同時に圧縮することもできます。

btrfsファイル・システムをデフラグするには、次のコマンドを使用します。
sudo btrfs filesystem defragment filesystem_name
btrfsファイル・システムをデフラグして同時に圧縮するには:
sudo btrfs filesystem defragment -c filesystem_name
btrfsファイル・システム内の個別のファイル・システム・オブジェクト(ディレクトリやファイルなど)をデフラグし、オプションで圧縮することもできます。
# btrfs filesystem defragment [-c] file_name ...

ノート:

自動デフラグメンテーションを設定するには、ファイル・システムのマウント時にautodefragオプションを指定します。ただし、大規模なデータベースや仮想マシンのイメージを対象とする自動デフラグメンテーションは、推奨されません。

コピーオンライトのコピーが含まれるファイルまたはサブボリュームをデフラグすると、ファイルとそのコピー間のリンクが破損します。たとえば、スナップショットが含まれるサブボリュームをデフラグすると、スナップショットがサブボリュームのコピーオンライト・イメージではなくなるため、サブボリュームとそのスナップショットによるディスク使用率が増加します。

Btrfsファイル・システムのサイズ調整

btrfsコマンドを使用して、マウントされたbtrfsファイル・システムのサイズを増加するか(基礎となるデバイスにその変更を格納する領域が存在する場合)、そのサイズを減少できます(ファイル・システムに使用可能な空き領域が十分に存在する場合)。コマンドは、基礎となるデバイスのレイアウトやサイズには影響しません。

たとえば、/mybtrfs1のサイズを2GB増加するには、次のようにします。
sudo btrfs filesystem resize +2g /mybtrfs1
/mybtrfs2のサイズを4GB減少するには、次のようにします。
sudo btrfs filesystem resize -4g /mybtrfs2
/mybtrfs3のサイズを20GBに設定するには、次のようにします。
sudo btrfs filesystem resize 20g /mybtrfs3

サブボリュームとスナップショットの作成

btrfsファイル・システムの最上位レベルは、ディレクトリやファイルを含む名前付きのBツリー構造で構成されたサブボリュームであり、これにはさらにディレクトリやファイルを含むそれ自体が名前付きのBツリーであるbtrfsサブボリュームが含まれることがあります。サブボリュームを作成するには、サブボリュームを作成するbtrfsファイル・システム内の位置にディレクトリを変更し、次のコマンドを入力します。

sudo btrfs subvolume create subvolume_name

スナップショットは、スナップショットの取得時に親のサブボリュームの内容を記録するサブボリュームの一種です。btrfsファイル・システムのスナップショットを取得し、それに書込みを行わないと、そのスナップショットは元のファイル・システムの状態を記録し、バックアップを作成できる安定したイメージになります。スナップショットを書込み可能にすると、それを元のファイル・システムの代替バージョンとして使用できます。btrfsファイル・システムのコピーオンライト機能では、スナップショットを迅速に作成でき、当初はほとんどディスク領域を消費せずに済みます。

ノート:

サブボリュームのスナップショットの取得は、再帰的プロセスではありません。サブボリュームのスナップショットを作成すると、サブボリュームに含まれるサブボリュームまたはスナップショットは、すべてスナップショット内の同じ名前の空のディレクトリにマップされます。

次の表に、一般的なスナップショット操作を実行する方法を示します。
コマンド 説明

btrfs subvolume snapshotpathnamepathname/snapshot_path

pathnameによって指定された親のサブボリュームまたはスナップショットのスナップショットsnapshot_pathを作成します。次に例を示します。

btrfs subvolume snapshot /mybtrfs /mybtrfs/snapshot1

btrfs subvolume listpathname

pathnameによって指定されたサブボリュームまたはスナップショットのサブボリュームまたはスナップショットをリストします。次に例を示します。

btrfs subvolume list /mybtrfs

ノート:

このコマンドを使用して、サブボリュームまたはスナップショットのIDを特定できます。

btrfs subvolume set-defaultIDpathname

デフォルトで、親のサブボリュームのかわりにそのIDによって指定されたスナップショットまたはサブボリュームをマウントします。次に例を示します。

btrfs subvolume set-default 4 /mybtrfs

btrfs subvolume get-defaultpathname

指定されたサブボリュームでマウントされているデフォルトのサブボリュームのIDを表示します。次に例を示します。

btrfs subvolume get-default /mybtrfs

btrfsサブボリュームは、ディスク・デバイスのようにマウントできます。親のサブボリュームのかわりにスナップショットをマウントすると、ファイル・システムの状態をスナップショット取得時の状態に効率的にロールバックできます。set-defaultを使用してデフォルトのサブボリュームを変更していなければ、デフォルトで、オペレーティング・システムによって0のIDを持つ親のbtrfsボリュームがマウントされます。新しいデフォルトのサブボリュームを設定すると、かわりにそのサブボリュームが将来的にマウントされます。デフォルト設定をオーバーライドするには、次のmountオプションのいずれかを指定します。
mountオプション 説明

subvolid=snapshot-ID

デフォルトのサブボリュームのかわりに、そのサブボリュームIDで指定されたサブボリュームまたはスナップショットをマウントします。

subvol=pathname/snapshot_path

デフォルトのサブボリュームのかわりに、そのパス名で指定されたサブボリュームまたはスナップショットをマウントします。

ノート:

サブボリュームまたはスナップショットは、btrfsファイル・システムのルートに存在する必要があります。

スナップショットをマウントしてファイル・システムをロールバックした場合、スナップショット自体のスナップショットを取得してその状態を記録できます。

サブボリュームまたはスナップショットが必要なくなった場合、次のコマンドを使用して削除します。
sudo btrfs subvolume delete subvolume_path

ノート:

サブボリュームを削除すると、Bツリー階層でそれより下位にあるすべてのサブボリュームも削除されます。そのため、0のIDを持つbtrfsファイル・システムの最上位のサブボリュームは、削除できません。

snapperコマンドを使用してbtrfsスナップショットを作成および管理する方法の詳細は、Btrfsサブボリュームでのsnapperの使用を参照してください。

Btrfsサブボリュームでのsnapperの使用

snapperユーティリティを使用して、btrfsサブボリュームのスナップショットを作成および管理できます。

snapper構成をマウントされている既存のbtrfsサブボリュームに設定するには:

sudo snapper -c config_name create-config -f btrfs fs_name

ここで、config_nameは構成の名前であり、fs_nameはマウントされているbtrfsサブボリュームのパスです。コマンドによってconfig_name/etc/sysconfig/snapperに追加され、構成ファイル/etc/snapper/configs/config_name が作成され、スナップショットに.snapshotsサブボリュームが設定されます。

たとえば、次のコマンドはbtrfsルート・ファイル・システムにsnapper構成を設定します。

sudo snapper -c root create-config -f btrfs /

デフォルトでは、snapperはサブボリュームの.snapshotサブディレクトリにスナップショットを作成するcron.hourlyジョブ、および古いスナップショットをクリーンアップするcron.dailyジョブを設定します。構成ファイルを編集すると、この動作を無効化または変更できます。詳細は、snapper-configs(5)マニュアル・ページを参照してください。

snapperを使用して作成できるスナップショットは3種類あります。

post

ポスト・スナップショットを使用して、変更後のサブボリュームの状態を記録します。ポスト・スナップショットは常に、変更直前に実行するプリ・スナップショットと対になっています。

pre

プリ・スナップショットを使用して、変更前のサブボリュームの状態を記録します。プリ・スナップショットは常に、変更直前に実行するポスト・スナップショットと対になっています。

single

単一のスナップショットは、サブボリュームの状態の記録に使用できますが、サブボリュームのその他のスナップショットと関連性はありません。

たとえば、次のコマンドでは、サブボリュームのプリ・スナップショットおよびポスト・スナップショットを作成します。

sudo snapper -c config_name create -t pre -p N
... Modify the subvolume's contents...
sudo snapper -c config_name create -t post --pre-num N -p N'

-pオプションをsnapperに指定するとスナップショット数が表示されるため、ポスト・スナップショットを作成する場合、またはプリ・スナップショットとポスト・スナップショットのコンテンツを比較する場合に参照できます。

プリ・スナップショットとポスト・スナップショットの間に追加、削除、または変更したファイルおよびディレクトリを表示するには、statusサブコマンドを使用します。

sudo snapper -c config_name status N .. N'

プリ・スナップショットとポスト・スナップショットの間のファイル内容の差異を表示するには、diffサブコマンドを使用します。

sudo snapper -c config_name diff N .. N'

サブボリュームにあるスナップショットをリストするには:

sudo snapper -c config_name list

スナップショットを削除するには、その番号をdeleteサブコマンドに指定します。

sudo snapper -c config_name delete N''

サブボリューム内の、ポスト・スナップショットN'に含まれる変更をプリ・スナップショットNに戻すには:

sudo snapper -c config_name undochange N..N'

詳細は、snapper(8)マニュアル・ページを参照してください。

仮想マシン・イメージおよびLinuxコンテナのクローニング

btrfsファイル・システムを使用して、仮想マシン・イメージおよびLinuxコンテナ用の記憶域を提供できます。ファイルを迅速にクローニングしてディレクトリ構造のスナップショットを作成する機能があるため、btrfsはこの目的の候補として理想的です。btrfsのスナップショット機能を使用してLinuxコンテナを実装する方法の詳細は、Oracle Linux 7: LXCの操作のLinuxコンテナを参照してください。

送信/受信機能の使用

ノート:

送信/受信機能を使用するには、UEK R3を使用してシステムをブートする必要があります。

送信操作では、2つのサブボリュームを比較し、一方のサブボリューム(parentサブボリューム)をもう一方のサブボリューム(sentサブボリューム)にどのように変換するかを記述します。通常は、出力をファイルに保存して後で使用するか、出力を受信操作に送ってすぐに使用します。

最も簡単な形式の送信操作は、サブボリュームの完全な記述です。

sudo btrfs send [-v] [-f] [sent_file] ... subvol

-vオプションに複数のインスタンスを指定し、増加するデバッグ出力を表示できます。-fオプションを使用すると、出力をファイルに保存できます。以下の使用例では、これらの2つのオプションが暗黙的に含まれています。

次の形式の送信操作は、1つのサブボリュームをもう1つのサブボリュームにどのように変換するかに関する完全な記述です。

sudo btrfs send -p parent_subvol sent_subvol

受信操作中に、親ボリュームのスナップショット(クローン・ソースと呼ばれる)など、サブボリュームを使用でき、そこから一部のデータをリカバリできる場合、クローン・ソースを指定して出力ファイルのサイズを縮小できます。

sudo btrfs send [-p parent_subvol] -c clone_src [-c clone_src] ... subvol

複数のクローン・ソースがある場合、-cオプションを複数回指定できます。親サブボリュームが指定されていない場合、btrfsはクローン・ソースから適切な親を選択します。

受信操作を使用して、送信されたサブボリュームを、指定したパスに再生成します。

sudo btrfs receive [-f sent_file] mountpoint

送受信を使用して増分バックアップを実装する方法

サブボリュームの増分バックアップおよびリストア・プロセスを設定するには、次の手順を使用することをお薦めします。

  1. サブボリュームの読取り専用スナップショットを作成し、バックアップの初期参照ポイントとして使用します。

    sudo btrfs subvolume snapshot -r /vol /vol/backup_0
  2. syncを実行し、スナップショットがディスクに書き込まれたことを確認します。

    sudo sync
  3. btrfsファイル・システムに、スナップショットを受信するためのバックアップ領域として、サブボリュームまたはディレクトリを作成します(たとえば、/backupvol)。

  4. スナップショットを/backupvolに送信します。

    sudo btrfs send /vol/backup_0 | btrfs receive /backupvol

    このコマンドでは、サブボリューム/backupvol/backup_0が作成されます。

    参照バックアップが作成されたら、増分バックアップを必要に応じて作成できます。

  5. 増分バックアップを作成するには:

    1. サブボリュームの新しいスナップショットを作成します。

      sudo btrfs subvolume snapshot -r /vol /vol/backup_1
    2. syncを実行し、スナップショットがディスクに書き込まれたことを確認します。

      sudo sync
    3. 参照バックアップと新しいバックアップの相違のみをバックアップ領域に送信します。

      sudo btrfs send -p /vol/backup_0 /vol/backup_1 | btrfs receive /backupvol

      このコマンドでは、サブボリューム/backupvol/backup_1が作成されます。

割当てグループの使用

ノート:

割当てグループ機能を使用するには、UEK R3を使用してシステムをブートする必要があります。

割当てを有効にするには、サブボリュームを作成する前に、新しく作成したbtrfsファイル・システムに対して次のコマンドを使用する必要があります。

sudo btrfs quota enable volume

サブボリュームに割当てグループ制限を割り当てるには、次のコマンドを使用します。

sudo btrfs qgroup limit size /volume/subvolume

次に例を示します。

sudo btrfs qgroup limit 1g /myvol/subvol1
sudo btrfs qgroup limit 512m /myvol/subvol2

サブボリュームの割当て使用量を確認するには、btrfs qgroup show pathコマンドを使用します。

稼働中のファイル・システムでのデバイスの置換え

ノート:

デバイス置換え機能を使用するには、UEK R3を使用してシステムをブートする必要があります。

稼働中のファイル・システムでデバイスを置き換えることができます。ファイル・システムのマウントを解除したり、ファイル・システムを使用しているタスクを停止したりする必要はありません。置換えが実行されている間にシステムがクラッシュしたり電源を失ったりした場合、システムがファイル・システムを次にマウントするときに操作が再開されます。

マウントされたbtrfsファイル・システム上でデバイスを置き換えるには、次のコマンドを使用します。

sudo btrfs replace start source_dev target_dev [-r] mountpoint

source_devおよびtarget_devには、置換されるデバイス(ソース・デバイス)および置換するデバイス(ターゲット・デバイス)を指定します。mountpointには、ソース・デバイスを使用しているファイル・システムを指定します。ターゲット・デバイスは、ソース・デバイスと同じサイズまたはソース・デバイスよりも大きいサイズである必要があります。ソース・デバイスが使用できなくなっている場合や、-rオプションを指定した場合は、他のデバイス(使用可能な別のミラーなど)から取得した冗長データを使用してデータを再構築します。操作が完了すると、ソース・デバイスはファイル・システムから削除されます。

btrfs replace status mountpointコマンドおよびbtrfs replace cancel mountpointコマンドを使用して、置換操作の進捗を確認したり操作を取り消すことができます。

ファイルのスナップショットの作成

cpコマンドに--reflinkオプションを使用して、btrfsファイル・システムの同じサブボリューム内にファイルの軽量コピーを作成できます。コピーオンライト・メカニズムによって、ディスク領域が節約され、コピー操作がほとんど瞬時に行われます。btrfsファイル・システムでは、ファイルのデータの完全なコピーを作成したり、ファイルのinodeを指し示すリンクを作成することなく、既存のファイルと同じディスク・ブロックを共有する新しいinodeが作成されます。結果となるファイルは、元のファイルのコピーのように見えますが、元のデータ・ブロックは複製されません。後でファイルの1つに書込みを行う場合、他のファイルの内容を維持するため、btrfsファイル・システムによって書込みの前にブロックのコピーが作成されます。

たとえば、次のコマンドによってファイルfooのスナップショットbarが作成されます。
sudo cp -reflink foo bar

Btrfs rootファイル・システムについて

Oracle Linux 7のインストールでは、btrfs rootファイル・システムを作成できます。マウントされているrootファイル・システムは、インストールの最後に取得されたrootファイル・システムの(installという名前の)スナップショットです。rootファイル・システムのサブボリュームの親のIDを検出するには、次のコマンドを使用します。
sudo btrfs subvolume list /
ID 258 top level 5 path install 

この例では、インストール・rootファイル・システムのサブボリュームのIDは5です。IDが258のサブボリューム(install)が、現在/としてマウントされています。図3-1に、ファイル・システムのレイアウトを示します。

図3-1 インストール後のrootファイル・システムのレイアウト


この図は、インストール後の状態としてrootファイル・システムを含む最上位レベルのサブボリューム(ID 5)と、現在アクティブなrootファイル・システムを含むサブボリュームinstall (ID 258)が存在するサンプルrootファイル・システムのレイアウトを示しています。

IDが5の最上位レベルのサブボリュームは、インストールの最後にrootファイル・システムの内容を記録します。IDが258のデフォルトのサブボリューム(install)は、アクティブなrootファイル・システムとして現在マウントされています。

mountコマンドで、rootファイル・システムとして現在マウントされているデバイスを表示できます。
sudo mount
/dev/mapper/vg_btrfs-lv_root on / type btrfs (rw)
...
インストール・rootファイル・システム・ボリュームをマウントするには、次のコマンドを使用します。
sudo mkdir /instroot
sudo mount -o subvolid=5 /dev/mapper/vg-btrfs-lv-root /instroot
/instrootの内容をリストすると、次のように、インストールrootファイル・システムのボリュームと、installスナップショットの両方の内容を参照できます。
ls /instroot
bin   cgroup  etc   install  lib64  misc  net  proc  sbin     srv  tmp  var
boot  dev     home  lib      media  mnt   opt  root  selinux  sys  usr
次の例に示すとおり、//instroot/installの内容は同一であり、/instroot/installに作成されたファイル(foo)は/でも表示されます。
touch /instroot/install/foo
ls /
bin   cgroup  etc  home      lib    media  mnt  opt   root  selinux  sys  usr 
boot  dev     foo  instroot  lib64  misc   net  proc  sbin  srv      tmp  var
ls /instroot/install
bin   cgroup  etc  home      lib    media  mnt  opt   root  selinux  sys  usr 
boot  dev     foo  instroot  lib64  misc   net  proc  sbin  srv      tmp  var
rm -f /foo
ls /
bin   cgroup  etc   instroot  lib64  misc  net  proc  sbin     srv  tmp  var
boot  dev     home  lib       media  mnt   opt  root  selinux  sys  usr
# ls /instroot/install
bin   cgroup  etc   instroot  lib64  misc  net  proc  sbin     srv  tmp  var
boot  dev     home  lib       media  mnt   opt  root  selinux  sys  usr

rootファイル・システムのスナップショットの作成

現在のrootファイル・システムのスナップショットを取得するには:
  1. 適切なマウント・ポイントにrootファイル・システムの最上位レベルをマウントします。
    sudo mount -o subvolid=5 /dev/mapper/vg-btrfs-lv-root /mnt
  2. ディレクトリをマウント・ポイントに変更してスナップショットを取得します。この例では、rootファイル・システムとしてinstallサブボリュームが現在マウントされています。
    cd /mnt
    sudo btrfs subvolume snapshot install root_snapshot_1
    Create a snapshot of 'install' in './root_snapshot_1'
  3. ディレクトリを/に変更してファイル・システムの最上位レベルをアンマウントします。
    # cd /
    # umount /mnt
    サブボリュームのリストに、新規作成されたスナップショットが含まれるようになります。
    sudo btrfs subvolume list /
    ID 258 top level 5 path install
    ID 260 top level 5 path root_snapshot_1

rootファイル・システムとしての代替スナップショットのマウント

システムの変更をロールバックする場合、次のようにデフォルトのサブボリュームとしてそのIDを指定し、rootファイル・システムとしてスナップショットをマウントできます。
sudo btrfs subvolume set-default 260 /
システムを再起動して変更を有効にします。

rootファイル・システムのスナップショットの削除

スナップショットを削除するには:
  1. 次のようにファイル・システムの最上位レベルをマウントします。
    sudo mount -o subvolid=5 /dev/mapper/vg-btrfs-lv-root /mnt
  2. ディレクトリをマウント・ポイントに変更してスナップショットを削除します。
    cd /mnt
    sudo btrfs subvolume delete install
    Delete subvolume '/mnt/install'
  3. ディレクトリを/に変更してファイル・システムの最上位レベルをアンマウントします。
    cd /
    sudo umount /mnt
    サブボリュームのリストに、installが含まれなくなります。
    sudo btrfs subvolume list /
    =ID 260 top level 5 path root_snapshot_1