mv
fs(ext4)がアトミックかどうかを確認するにはどうすればよいですか?
OSはRed Hat Enterprise Linux Serverリリース6.8です。
一般的に、これを確認するにはどうすればよいですか?私は周りを見回しましたが、私のOSが標準のPOSIXであるかどうかはわかりませんでした。
mv
fs(ext4)がアトミックかどうかを確認するにはどうすればよいですか?
OSはRed Hat Enterprise Linux Serverリリース6.8です。
一般的に、これを確認するにはどうすればよいですか?私は周りを見回しましたが、私のOSが標準のPOSIXであるかどうかはわかりませんでした。
回答:
興味深いことに、答えは「場合によります」のようです。
明確にするために、mv
指定されているに
mv
ユーティリティはと同等の操作を実行しなければならないrename()
機能を
リネーム機能仕様の状態:
この
rename()
関数は、ISO C標準で定義されているものと同等の通常のファイルです。ここに含めると、その定義が展開され、ディレクトリ上のアクションが含まれ、新しいパラメーターが既存のファイルに名前を付けるときの動作が指定されます。その仕様では、関数のアクションがアトミックであることが必要です。
しかし、最新のISO C仕様のためのrename()
状態:
7.21.4.2
rename
関数あらすじ
#include <stdio.h> int rename(const char *old, const char *new);
説明
この
rename
関数は、が指す文字列を名前とするファイルを、が指す文字列old
によって指定される名前で認識できるようにしnew
ます。指定されたファイルにold
は、その名前でアクセスできなくなりました。関数new
が呼び出される前に、が指す文字列で指定されたファイルが存在するrename
場合、動作は実装定義です。戻り値
この
rename
関数は、操作が成功した場合はゼロを返し、失敗した場合はゼロ以外を返します。この場合、ファイルが以前に存在していた場合でも、元の名前で認識されます。
驚くべきことに、原子性の明示的な要件はないことに注意してください。公開されている最新のC標準のどこかで必要になる可能性がありますが、それを見つけることができませんでした。誰かがそのような要件を見つけることができるなら、編集とコメントは大歓迎です。
参照してください。名前の変更()アトミックですか?
あたり、Linuxのmanページ:
newpath
すでに存在する場合は、アトミックに置き換えられるため、アクセスしようとする別のプロセスnewpath
がそれを見つけられなくなることはありません。ただし、名前が変更されるファイルoldpath
とその両方をnewpath
参照するウィンドウが表示される可能性があります。
Linuxのmanページでは、ファイルの置き換えはアトミックになると主張されています。
ただし、原子性をテストおよび検証することは非常に難しい場合があります。「mvがアトミックかどうかを確認するにはどうすればよいですか」の使用における意味が明確ではありません。アトミックな要件/仕様/ドキュメントが必要ですか、それとも実際にテストする必要がありますか?
また、上記では、2つのオペランドファイル名が同じファイルシステムにあると想定しています。それmv
を強制するユーティリティの標準的な制限は見つかりません。
rename
原子性について何かを言うのは奇妙です。
/
、ext4 fsと/tmp
別のext4 fsがある場合、一方から他方へアトミックにmv することはできません。
mv
rename
システムコールに基づいており、rename()
アトミックです。マンページを見ることができますrename(2)
。
「rename()はアトミックか」で答えを見つけることができます stackoverflow。
どのようなfsを使いましたか?
システムコールとそれらの原子性をチェックすることに加えて、おそらくinotify-tools
それはテストとして役立ちますが、それが原子性の保証された証明であるかどうかはわかりません。
2つのシェルを開きます。それらのいずれかで移動のターゲットディレクトリを監視します。
inotifywait -m target/
他のディレクトリにファイルを移動します。
mv foobar target/
inotifywait
一つだけの行を表示する必要があります。
target/ MOVED_TO foobar
次のような複数行のメッセージを生成するls target/
and への応答と比較すると、アトミックtouch target/a
なようです。
# the response to ls target/
target/ OPEN,ISDIR
target/ ACCESS,ISDIR
target/ CLOSE_NOWRITE,CLOSE,ISDIR
PS
少なくとも、ファイルの非同期マルチプロセス連携はinotify
(実質的にアトミック)で安全であることを示しています。どのような場合でもinotify
、操作後に最後のシグナルを与えた後でのみ応答します。たとえば、プロデューサー/コンシューマーのセットアップは、を使用して簡単かつ安全に実装できますinotify
。
strace
か?