書き込み中のファイルの名前を変更する

書き込み中のファイルの名前を変更する

これは安全だと考えられるのか疑問に思っています。リンクが残っている限りファイル ハンドルは正常に機能し、識別子は名前ではなく inode であることはわかっていますが、異なる FS 間でどのように機能するかはわかりません。

たとえば、ext4 ハードドライブから NTFS USB スティックにコピーしたり、FAT スティックから ext4 ドライブにコピーしたりします。

大量の大きなメディア ファイルをコピーして、コピーが完了する前に名前を変更しました。チェックサムは一致しています。常に安全なのか、逆方向にも機能するのか、知っておくべき癖やこれを避けるべき理由があるのだろうか、疑問に思います。

OS/ディストリビューションは、Linux カーネル 5.0.0-15 を搭載した Ubuntu です。

答え1

異なる FS 間でどのように動作するかはわかりません。

名前変更操作自体は、異なるファイル システム間では動作しません。つまり、テキスト エディターなどからファイルに書き込む場合と、別のファイル システム上のソース ファイルを使用してファイルに書き込む場合との間に違いはありませんcp

Linux では、renameシステム コールは、他のハード リンクやオープン ファイルの説明 (および記述子) を含む、ファイルへの他のリンクに対して透過的です。マニュアルページには明確に記載されています

オープンファイル記述子古いパスも影響を受けません。

(「Linux 上」と限定したのは、POSIX での参照が見つからなかったためです。これは POSIX スタイルのオペレーティング システム全体で共通だと思います。)

したがって、ファイル システム間でファイルをコピーする場合、cpソースを読み取り用に開き、ターゲットを書き込み用に開き、コピーを開始します。名前変更操作は、使用しているファイル記述子には影響しません。つまり、ソースやターゲットの名前を変更しても、影響はありませんcp

これを別の方法で考えると、ファイルを含むディレクトリ内のファイル名はディレクトリ エントリの一部であり、そのディレクトリ エントリは inode を指しています。開いているファイルの説明は、他のハード リンクと同様に、inode への別のポインタです。ファイル名を変更しても、他の既存のポインタには影響しません。

注意すべき点は、 などのツールはシステム コールで実行できるmvことに制限されないことです。複数のファイル システム間でファイルを実行すると、 は失敗します (または、操作が複数のファイル システム間で実行されていると認識して実行を試みません)。その後、手動でファイルの内容をコピーし、元のファイルを削除します。名前を変更するファイルが同時に変更されている場合、この方法では良い結果は得られません。renamemvrenamemvmv

関連情報