web-dev-qa-db-ja.com

同じファイルシステムにマウント--bindは、同じファイルシステムと同じようにファイルを移動します

mount --bind/a/bを使用し、mv /a/bigfile /b/を使用すると、多くのタイプが必要になります(Originファイルが大きい場合)。これは実際にファイルをコピーし、単純にファイルシステムのファイルテーブルを更新するのではなく、Originから削除します。

mount --bindの仕組みと理由を理解しています。他の人が指摘したように、 ここ または ここ にはいくつかの良い説明があります。

mount --bindが同じファイルシステムにあることをmountに伝えて、このような操作(移動)が実際にファイルシステムのファイルテーブルを更新することによって行われるようにする方法はありますか?

私はこの問題を解決してそれを理解しないように求めています:多分私が気づいていないすでに利用可能なカーネルパッチ、または私がまだ見つけていない欠落しているパラメータ(など)。

理由:現在のセットアップでは、mount --bindのみをサポートするサービス(nextcloud)があります。シンボリックリンクを使用できません。たとえば、nextcloudの各アカウント内に共有フォルダーが必要な場合は、bindを使用する必要があります。ファイルシステム/カーネルレベルで作成された場合、nextcloudで動作するソリューションを受け入れることができます。これは、現在のセットアップに、sshなどの他の方法でこれらのファイルへのアクセスも含まれているためです。つまり、例のように、任意のコマンドまたはアプリケーションを使用してファイルを移動できるようにしたいと考えています。

5
Noeljunior

どうやら man page rename(2) はこれについて言及しています:

EXDEVoldpathnewpathは同じではありませんマウントされたファイルシステム。 (Linuxでは、ファイルシステムを複数のポイントでマウントすることができますが、rename()は、同じファイルシステムが両方にマウントされている場合でも、異なるマウントポイントでは機能しません。

正しく思い出せば、バインドマウントは同じファイルシステムを複数回マウントすることと同じです。つまり、バインド後に「ソース」と「ターゲット」が存在しなくなります。

数か月前の同じ主題に関する別の質問に対する別の answer もあります。カーネル開発者との議論へのポインタがあります。それで賛成投票してください。

8
ilkkachu

代わりにrsyncを使用すると、mvで問題が解決するはずです。次のコマンドを使用してみてください

rsync -avP /a/bigfile /b/bigfile

問題は、mount --bindの視点がカーネル内にあり、mvのようなより高いレベルのプログラムから隠されているためです。 mvとは異なり、rsyncはファイルの変更された部分のみを移動します。

mount --bindについて説明します バインドマウントとは

0
Abhik Bose