誤って、2つのext4ファイルシステム間の一部のファイルに対して32のプロセス(仮想マシンのコアごとに1つのプロセス)を開始しましたが、そのうちの1つだけがmv
成功しましたmv
。
for i in `seq 1 32`; do
mv /path/to/ext4-1/pattern* /path/to/ext4-2/ &
done
複数のプロセスが同じファイルをmvしようとすると、正確に何が起こりますか?
ベストアンサー1
mv
これは同じファイルシステム内のすべてのファイルに対してアトミックですが、ファイルシステム内ではより複雑な作業です(通常のファイルのみを移動し、ターゲットが最初に存在しないと仮定)。
- ターゲットファイルがある場合は削除します。
- 読みたいソースファイルを開きます。一部の実装では、前の手順の前にこれを実行できます。
- ターゲットファイルを生成します。現在存在する場合、一部の実装ではこれを切り捨てることができます。一部の実装では、前の手順の前にこれを実行できます。
- ソースファイルから一部のデータを読み込み、ターゲットファイルに書き込みます。
- ソースファイルのメタデータをターゲットファイルにコピーします。一部の実装では、次のステップの後にタスクの一部または全部を実行できます。
- ソースファイルとターゲットファイルを閉じます。
- ソースファイルを削除します。
ほとんどの場合、両方のmv
プロセスが同時に同じファイルを移動しようとすると、両方ともデータがコピーされます。開始された最初のインスタンスはファイルを生成し、2番目のインスタンスはファイルを削除し、新しいインスタンスを作成します。しかし、運が悪いと、データが失われる可能性があります。。たとえば、
- 例1コピーを実行し、両方のファイルを閉じます(手順1〜6)。
- この時点で、インスタンス2はこのファイルに到達してターゲットを削除します(ステップ1)、ソースファイルを開く前にプリエンプトされます。
- 例1ソースファイルを削除し続けます(手順7)。
- 例2ステップ2に進みますが、ファイルはもう存在しません。
ファイルがターゲットに存在する場合、正しい内容があると思います。しかし、私たちが見たように、ファイルは消える可能性があります。