web-dev-qa-db-ja.com

btrfsサブボリューム間でファイルを移動するのにコストがかかるのはなぜですか?

私の理解では、btrfsサブボリュームは同じファイルシステム「ストレージ」を共有しているため、異なるサブボリューム間でのファイルの移動は、異なるファイルシステム間での移動(コピー+削除)のようにコストのかかる操作であることに驚きました。

私は特に誰かがこの回避策を提案したときに驚いた:reflink-サブボリューム間でファイルをコピーしてから、元のファイルを削除する。これは安価な操作であると言われています(メタデータのみを移動する)。 COWを使用する場合、異なるサブボリュームがデータブロックを共有できるのに、データ移動の操作が簡単になるはずがないのはどうしてですか?

7
m.alessandrini

COWを使用する場合、異なるサブボリュームがデータブロックを共有できるのに、データ移動の操作が簡単になるはずがないのはどうしてですか?

mvは、名前変更システムコールを使用して移動を試みます。 btrfsのkernelrename implは、クロスサブボリュームの移動を検出し、これを明示的に禁止します(同じマウントポイントの下にある場合でも)。

/* we only allow rename subvolume link between subvolumes */
if (old_ino != BTRFS_FIRST_FREE_OBJECTID && root != dest)
    return -EXDEV;

これはおそらく、サブボリュームiノードアカウンティングとこれらの操作がたどるコードパスに関係しています。 reflink-copyは、実際には新しいサブボリュームで説明される新しいメタデータを作成しています(ただし、データ自体はCoWです)。理論的には、copy--reflinkの後にrmsourceが続くのと同様のことを行うことで、メタデータの名前を「移動」させることができるでしょう...単に誰もそれを行う努力をしていません。

5
Will Brown