3 Btrfsファイル・システムの管理
警告:
Oracle Linux 7は現在延長サポート中です。詳細は、Oracle Linux拡張サポートおよびOracleオープン・ソース・サポート・ポリシーを参照してください。
できるだけ早くアプリケーションとデータをOracle Linux 8またはOracle Linux 9に移行してください。
この章では、Oracle LinuxでBtrfsファイル・システムを管理するためのタスクについて説明します。
Btrfsファイル・システムについて
btrfsファイル・システムは、大規模ストレージ・サブシステムの拡大するスケーラビリティ要件を満たすように設計されています。btrfsファイル・システムではその実装にBツリーを使用しているため、その名前は、正確な頭字語ではありませんが、そのデータ構造の名前に由来します。Bツリーは、ツリーがどれほど大きく成長しても、ファイル・システムおよびデータベースによってデータの大規模ブロックに効率的にアクセスして更新できるツリー状のデータ構造です。
-
コピーオンライト機能によって、読取りと書込みの両方が可能なスナップショットを作成し、ファイル・システムを以前の状態にロールバックできます(
ext3
またはext4
ファイル・システムから変換した後でも同様です)。 -
チェックサム機能によって、データ整合性が保証されます。
-
透過的な圧縮によって、ディスク領域が節約されます。
-
透過的なデフラグメンテーションによって、パフォーマンスが改善します。
-
統合論理ボリューム管理によって、RAID 0、RAID 1またはRAID 10構成を実装し、ストレージ容量を動的に追加および削除できます。
ノート:
Brtfsファイル・システムがサポートされていない環境にスワップ・ファイルを構成します。
btrfsファイル・システムの詳細は、https://btrfs.wiki.kernel.org/index.php/Main_Pageを参照してください。
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パフォーマンスを向上できます。
mountオプション | 説明 |
---|---|
compress=lzo |
LZO圧縮を使用。 |
compress=zlib |
zlib圧縮を使用。 |
LZOは圧縮率に優れており、zlibは圧縮速度に優れています。
btrfsファイル・システムは、それをデフラグすると同時に圧縮することもできます。
sudo btrfs filesystem defragment filesystem_name
sudo btrfs filesystem defragment -c filesystem_name
# 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 |
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
送受信を使用して増分バックアップを実装する方法
サブボリュームの増分バックアップおよびリストア・プロセスを設定するには、次の手順を使用することをお薦めします。
-
サブボリュームの読取り専用スナップショットを作成し、バックアップの初期参照ポイントとして使用します。
sudo btrfs subvolume snapshot -r /vol /vol/backup_0
-
syncを実行し、スナップショットがディスクに書き込まれたことを確認します。
sudo sync
-
btrfsファイル・システムに、スナップショットを受信するためのバックアップ領域として、サブボリュームまたはディレクトリを作成します(たとえば、
/backupvol
)。 -
スナップショットを
/backupvol
に送信します。sudo btrfs send /vol/backup_0 | btrfs receive /backupvol
このコマンドでは、サブボリューム
/backupvol/backup_0
が作成されます。参照バックアップが作成されたら、増分バックアップを必要に応じて作成できます。
-
増分バックアップを作成するには:
-
サブボリュームの新しいスナップショットを作成します。
sudo btrfs subvolume snapshot -r /vol /vol/backup_1
-
syncを実行し、スナップショットがディスクに書き込まれたことを確認します。
sudo sync
-
参照バックアップと新しいバックアップの相違のみをバックアップ領域に送信します。
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ファイル・システムについて
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ファイル・システムのレイアウト

IDが5の最上位レベルのサブボリュームは、インストールの最後にrootファイル・システムの内容を記録します。IDが258のデフォルトのサブボリューム(install
)は、アクティブなrootファイル・システムとして現在マウントされています。
sudo mount
/dev/mapper/vg_btrfs-lv_root on / type btrfs (rw) ...
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ファイル・システムの最上位レベルをマウントします。
sudo mount -o subvolid=5 /dev/mapper/vg-btrfs-lv-root /mnt
-
ディレクトリをマウント・ポイントに変更してスナップショットを取得します。この例では、rootファイル・システムとして
install
サブボリュームが現在マウントされています。cd /mnt sudo btrfs subvolume snapshot install root_snapshot_1
Create a snapshot of 'install' in './root_snapshot_1'
-
ディレクトリを
/
に変更してファイル・システムの最上位レベルをアンマウントします。# cd / # umount /mnt
サブボリュームのリストに、新規作成されたスナップショットが含まれるようになります。sudo btrfs subvolume list /
ID 258 top level 5 path install ID 260 top level 5 path root_snapshot_1
rootファイル・システムとしての代替スナップショットのマウント
sudo btrfs subvolume set-default 260 /システムを再起動して変更を有効にします。
rootファイル・システムのスナップショットの削除
-
次のようにファイル・システムの最上位レベルをマウントします。
sudo mount -o subvolid=5 /dev/mapper/vg-btrfs-lv-root /mnt
-
ディレクトリをマウント・ポイントに変更してスナップショットを削除します。
cd /mnt sudo btrfs subvolume delete install
Delete subvolume '/mnt/install'
-
ディレクトリを
/
に変更してファイル・システムの最上位レベルをアンマウントします。cd / sudo umount /mnt
サブボリュームのリストに、install
が含まれなくなります。sudo btrfs subvolume list /
=ID 260 top level 5 path root_snapshot_1