btrfsサブボリュームを削除すると、どのくらいのスペースが解放されますか?


11

Btrfsディスク上の1つ(または複数)のサブボリュームを(実際には削除せずに)削除すると、どのくらいの領域を解放できるかを計算する方法はありますか?「現在あなたのために計算を行うコードない」ことは知っていますが、どうやってそれを行うのでしょうか?

なぜこんなに遅いと彼らが言っているのかしら。私の経験では、実際にサブボリュームを削除することと空き領域について質問することの両方が非常に高速ですが、なぜ同じことを行うと、仮想的に非常に遅くなるのですか?


2
btrfs.wiki.kernel.org/index.php/Btrfs_mailing_listは、btrfs(または他のカーネルコンポーネント)の内部動作について質問するのに適した場所かもしれないことを知っていただければ幸いです。答えが出たらこちらにも投稿してください。私自身もその答えに興味があります。
Adam Ryczkowski、2014

1
「実際には、サブボリュームを実際に削除し、空き容量について尋ねるのは、私の経験では非常に速い」とあなたは言います。あなたがサブボリュームを削除すると、それは本当にだけだマーキング、それは(あなたがそれを行うときに、メッセージの意味を「は、コミット」何ではありません)時間を取得したときに、削除のためにそのサブボリュームを、それだけで、実際にこれらのブロックを解放しますので、何も、削除はないではありません必然的に非常に高速です。
etskinner 2017

回答:


3

btrfs quotaand 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番目の数値で表されます。サブボリュームを削除する場合、これは実際に解放されるスペースです。

複数のサブボリュームを削除した場合にどれだけのスペースが解放されるかを知りたい場合は、前述のレベルを使用できます。qgroupshierachyに編成上位レベルに及びグループ(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フラグを追加しましparentqgroups。)

ここで、の行qgroup 1/0は、削除する両方のサブボリュームが参照しているスペースの量を示し、さらに重要なことに、それらによって排他的に割り当てられているスペースの量を示しています。これは、両方のサブボリュームを削除した場合に解放されるスペースの量です。

なぜこんなに遅いと彼らが言っているのかしら。

これは、スナップショットとともにbtrfsのコピーオンライトの性質によるものです。btrfsでスナップショットを作成する場合(通常)、スナップショットを含む新しく作成されたサブボリュームのすべての実際のデータは、スナップショットのソースと共有されます。ソースでファイルが変更または置換された場合のみ、別のコンテンツ(エクステント)を指します。これにより、他のサブボリュームと共有されるすべてのスペースを考慮する必要があるため、サブボリュームが削除された場合に実際に解放されるスペースの量を評価することは非常に困難になります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.