Btrfsディスク上の1つ(または複数)のサブボリュームを(実際には削除せずに)削除すると、どのくらいの領域を解放できるかを計算する方法はありますか?「現在あなたのために計算を行うコードはない」ことは知っていますが、どうやってそれを行うのでしょうか?
なぜこんなに遅いと彼らが言っているのかしら。私の経験では、実際にサブボリュームを削除することと空き領域について質問することの両方が非常に高速ですが、なぜ同じことを行うと、仮想的に非常に遅くなるのですか?
Btrfsディスク上の1つ(または複数)のサブボリュームを(実際には削除せずに)削除すると、どのくらいの領域を解放できるかを計算する方法はありますか?「現在あなたのために計算を行うコードはない」ことは知っていますが、どうやってそれを行うのでしょうか?
なぜこんなに遅いと彼らが言っているのかしら。私の経験では、実際にサブボリュームを削除することと空き領域について質問することの両方が非常に高速ですが、なぜ同じことを行うと、仮想的に非常に遅くなるのですか?
回答:
btrfs quota
and btrfs qgroups
(quota groups)を見てください。
基本的にqgroups
は、要求したとおりに実行し、サブボリュームによって割り当てられたスペースの量を追跡します。ファイルシステムのqgroup
機能を有効にするには、以下を行うbtrfs
必要があります
# btrfs quota enable /path/to/btrfs/filesystem
ただし、これを行う前に、これによりデータの完全な再計算がトリガーされ、特に多くのサブボリュームを持つ大規模なファイルシステムでは時間がかかることを警告しqgroup
ます。このプロセスは、バックグラウンドで非同期的に実行されます。あなたは既にの状態を確認することができqgroups
て
# btrfs qgroup show /path/to/btrfs/filesystem
これにより、次のような出力が得られます。
WARNING: rescan is running, qgroup data may be incorrect
qgroupid rfer excl
-------- ---- ----
0/5 843.69GiB 61.91MiB
0/4881 811.06GiB 9.34GiB
0/7990 867.32GiB 329.91MiB
0/8400 867.17GiB 37.64MiB
(再スキャンがまだ実行されている限り、最初の行の警告が表示されます。)
Btrfsはqgroup
サブボリュームごとに自動的にを作成します。この場合、サブボリュームIDが4881、7990、および8400の3つのサブボリュームがありますqgroup
。スラッシュの前の部分はのレベルです。各サブボリュームqgroup
はレベル0にありqgroup
ます。さらに、常にID 5を持ち、btrfsファイルシステムのルートに対応する特別なレベル0があります。
qgroup
上記の各出力は、それによって参照されるスペースの量を示しています。つまり、対応するサブボリュームには、合計サイズが表示された数に等しいファイルが含まれています。
ただし、スナップショットとbtrfsサブボリュームのコピーオンライトの性質により、ファイルを共有する場合があります。これは、ファイルのコンテンツ(または実際にはエクステント)が複数のサブボリュームによって参照される可能性があることを意味します。これは、各サブボリュームによって排他的に割り当てられ、他のサブボリュームと共有されていないスペースの量を示す2番目の数値で表されます。サブボリュームを削除する場合、これは実際に解放されるスペースです。
複数のサブボリュームを削除した場合にどれだけのスペースが解放されるかを知りたい場合は、前述のレベルを使用できます。qgroups
さhierachyに編成上位レベルに及びグループ(0より高い)低いレベルの情報を集約。
したがって、サブボリューム4881および7990(上記の例)が削除された場合に解放されるスペースの量を確認するには、qgroup
レベル1に新しい(任意にID 0を使用しますが、ここで好きなものを選択できます)を作成します。
# btrfs qgroup create 1/0 /path/to/btrfs/filesystem
次に、新しく作成qgroup
した親qgroups
ボリュームを、削除するサブボリュームのに割り当てます。
# btrfs qgroup assign 0/4881 1/0 /path/to/btrfs/filesystem
# btrfs qgroup assign 0/7990 1/0 /path/to/btrfs/filesystem
これにより、しばらく時間がかかる可能性のあるクォータ情報の別の再スキャンがトリガーされます。それが完了し、今発行する場合
# btrfs qgroup show -p /path/to/btrfs/filesystem
次のような出力が得られます。
qgroupid rfer excl parent
-------- ---- ---- ------
0/5 1.38TiB 2.51GiB ---
0/4881 1.11TiB 10.86GiB 1/0
0/7990 1.23TiB 502.41MiB 1/0
0/8400 1.34TiB 1.69GiB 1/0
1/0 1.51TiB 132.23GiB ---
(の親子関係を示す出力に列を追加する-p
フラグを追加しましparent
たqgroups
。)
ここで、の行qgroup
1/0
は、削除する両方のサブボリュームが参照しているスペースの量を示し、さらに重要なことに、それらによって排他的に割り当てられているスペースの量を示しています。これは、両方のサブボリュームを削除した場合に解放されるスペースの量です。
なぜこんなに遅いと彼らが言っているのかしら。
これは、スナップショットとともにbtrfsのコピーオンライトの性質によるものです。btrfsでスナップショットを作成する場合(通常)、スナップショットを含む新しく作成されたサブボリュームのすべての実際のデータは、スナップショットのソースと共有されます。ソースでファイルが変更または置換された場合のみ、別のコンテンツ(エクステント)を指します。これにより、他のサブボリュームと共有されるすべてのスペースを考慮する必要があるため、サブボリュームが削除された場合に実際に解放されるスペースの量を評価することは非常に困難になります。