NTFS ファイルシステムに保存されているファイルを読み込んでいるときに、そのファイルを読み込んでいる間にそのファイルを移動/名前変更しようとすると、できなくなります。EXT3 などの UNIX ファイルシステムでこれを試すと、成功し、読み取りを行うプロセスは影響を受けません。ファイルを rm することもでき、読み取りプロセスは影響を受けません。これはどのように作動しますか?この動作が UNIX ファイルシステムではサポートされているのに、NTFS ではサポートされていない理由を誰か説明してもらえますか? ハードリンクと inode に関係していると漠然と感じていますが、良い説明をいただければ幸いです。
2 に答える
Unix ファイルシステムは、参照カウントと 2 層アーキテクチャを使用してファイルを検索します。
ファイル名は、情報ノードまたはインデックス ノードのinodeと呼ばれるものを参照します。inode には、ファイルの内容 (ファイルへのポインター) と、ファイルの種類 (通常、ディレクトリ、デバイスなど) や所有者などのメタデータが格納されます。
複数のファイル名で同じ inode を参照できます。それらはハードリンクと呼ばれます。さらに、ファイル記述子(fd) は inode を参照します。fd は、プロセスがファイルを開くときに取得するオブジェクトのタイプです。
Unix ファイルシステム内のファイルは、そのファイルへの最後の参照がなくなったとき、つまりファイルを参照する名前 (ハード リンク) または fd がなくなったときにのみ消えます。したがって、rm
実際にはファイルを削除しません。ファイルへの参照を削除します。
このファイルシステムのセットアップは混乱を招き、問題を引き起こすこともありますが (特に NFS の場合)、多くのアプリケーションでロックが必要ないという利点があります。多くの Unix プログラムは、一時ファイルを開いてすぐに削除することで、この状況を有利に利用しています。それらが終了するとすぐに、たとえクラッシュしたとしても、一時ファイルはなくなります。
UNIX では、ファイル名は単に実際のファイル (inode) へのリンクです。ファイルを開くと、実際のファイルへの (一時的な) リンクも作成されます。ファイルへのすべてのリンクが消えると (rm と close())、そのファイルは削除されます。
NTFS では、論理的にファイル名はファイルです。ファイル名からファイルのメタ情報への間接層はありません。それらは同じオブジェクトです。それを開くと、それは使用中であり、削除できません.UNIX上の実際のファイル(inode)が使用中に削除できないのと同じです.
Unix: ファイル名 ➜ FileInfo ➜ ファイル データ
NTFS:ファイル名 + ファイル情報 ➜ ファイル データ