理系学生日記

おまえはいつまで学生気分なのか

sync sync sync ?

よく、非常に重要なディスク変更を伴う作業などで

$ sync
$ sync
$ sync

ってやれみたいな話を聞きますが、これって

$ sync
# 一息入れる

っていうのと何か違ったりするのかなみたいな疑問を未だに持っています。

sync の意味

そもそも sync(8) は、ディスクへの確実な書き込みを実行するためのコマンドです。
例えば write(2) は、一般にディスク書き込みは伴わず、あくまでカーネル内のバッファ変更のみが実施された状態で制御を戻します。従って、ここでシステムが異常終了した場合、あるいはディスク故障が発生した場合は、ユーザアプリとして書き込んだはずのデータが失われることになります。

sync(8)は、このカーネルのバッファ変更(dirty buffer)のみがなされた状態から、強制的にディスクに書き出すように促すためのコマンドです*1 *2。別に 3 回 sync を発行しなくとも、ちょっと待ってやれば良いんじゃないのかな。あるいは「待つ」ということを忘れてしまうヒューマンエラーを防ぐために、3 回 sync しろって教えているんでしょうか。

まぁ脚注に書いたような事情もあるので、Linux については 1 回で良いと思います。

*1:ただし現在の Linux は、sync(2) がディスク書き出しが実施されるまで制御を返さないことを保証しています

*2:ディスク側のバッファでキャッシュされ、実際の書き込みはさらに遅れる場合はもちろんある