mv
私はext4パーティションからそれ自体でファイルをコピーする場合、ディレクトリエントリを更新し、inodeを同じままにすることで、一定時間内にすぐに実行できると信じています。
代わりに、完全な(30GB)ファイルがコピーされた後に元のファイルが削除されることがあります。
なぜこれが起こるのですか?
答え1
このmv
コマンドは内部的に呼び出され、単一のrename()
ファイルシステムのマウントポイント内で名前を変更すると、名前エントリのみが変更されます(同じディレクトリ内または1つのディレクトリから別のディレクトリに名前を移動します)。
ただし、場合によっては(「クロスデバイスリンクエラー」)が呼び出し元にrename()
返されます。この場合、ファイル(またはディレクトリツリー全体)を新しい場所にコピーし、場所のファイルを削除するように置き換えられます。 at /directory: それ以降の以前の位置。EXDEV
mv
rename()
戻りの最も一般的な理由EXDEV
は、呼び出しのソースディレクトリとターゲットディレクトリがrename()
異なるファイルシステムにあり、同じファイルシステムが異なるマウントポイントを持つ可能性があることです。プロジェクトクォータが使用中(ソースファイル/ディレクトリとターゲットディレクトリで "lsattr -p"を実行して確認)、ソース/ターゲットが異なるプロジェクトIDを使用している場合でもユーザースペースに置き換えEXDEV
られ、複製ターゲットmv
は次のことを行う必要があります。ファイル/ディレクトリツリーを作成し、新しい親エントリと一致するようにprojidを変更します。
ソースディレクトリとターゲットディレクトリの異なるプロジェクトIDがプロジェクトIDを直接更新するのではなくコピーをトリガーするのは、rename()
projidを変更する必要があるディレクトリツリー全体がある場合、カーネルでアトミックに変更するのは複雑すぎる可能性があるためです。この場合、更新するファイルが数千または数百万個ある可能性があります。つまり、projidの更新できるrename()
名前変更時に直接完了単一ファイルしかし、これはまだext4コードで実装されていません。
プロジェクトIDが関連していることがわかっている場合は、ソースファイル/ディレクトリツリーのプロジェクトIDをターゲットプロジェクトIDと一致するように「事前変更」して、大容量ファイルやディレクトリツリーの「代替コピー」を防ぐことができます。ソースとターゲットprojidを同じにするために「mv」を使用する前に、「chattr -R -p <target_projid>」を実行すると、戻りやコピートリガーなしでrename()
機能する必要があります。EXDEV