Slide 1

Slide 1 text

syncコマンドのデータ同期 完了待ちやエラー検出 Aug. 25th, 2024 Satoru Takeuchi X: satoru_takeuchi 1

Slide 2

Slide 2 text

はじめに ● syncコマンドはページキャッシュをディスクに同期する ○ 📝: 過去動画「その20 ページキャッシュの概念 」 ● Linuxについて、以下2つの疑問に回答 ○ 「syncはデータ同期処理を開始するだけで完了を待たずに終了する」「 syncは3回」などと聞いたこ とがあるが、実際のところはどうなのか ○ 同期中のディスクI/Oでエラーが起きたら検出できるのか ● syncコマンドはcoreutilsパッケージが提供するものとする 2

Slide 3

Slide 3 text

答えから先に ● 「syncはデータ同期処理を開始するだけで完了を待たずに終了する」「syncは3回」 などと聞いたことがあるが、実際のところはどうなのか ○ 仕様上は保証されないが実装上は完了待ちをしている ● 同期中のディスクI/Oでエラーが起きたら検出できるのか ○ コマンドライン引数を付ければできる 3

Slide 4

Slide 4 text

syncはデータ同期の完了を待つか ● syncコマンドの仕様 ○ man 1 syncより抜粋 ○ Persistence guarantees vary per system. See the system calls below for more details. ● syncコマンドの中で呼び出すsync()関数の仕様 ○ POSIX: 同期の完了を保証しない ■ man 3p syncより抜粋: ■ The writing, although scheduled, is not necessarily complete upon return from sync(). ○ Linux: 同期の完了を保証しない ■ man 2 syncより抜粋: ■ may return before the actual writing is done. ● ただし、実装上はsync()終了前に同期が完了している ○ man 2 syncより抜粋: ○ However Linux waits for I/O completions, 4

Slide 5

Slide 5 text

syncはエラー検出できるか ● デフォルトではエラー検出できない ○ そもそもsync()関数に戻り値が無い ○ 実装上も、同期処理の成否にかかわらず、終了したら復帰するだけ ● `-f`オプションを付ければエラー検出可能 ○ sync -f <あるファイルシステム上に存在するファイル >を実行すると、当該ファイルシステム上の データを全て同期して、成功なら 0を、失敗なら0以外を返す ○ 内部的にはsync()の代わりに上記のことをする syncfs()システムコールを呼び出している ● 興味のある人はソースを参照 ○ https://github.com/coreutils/coreutils/blob/master/src/sync.c 5

Slide 6

Slide 6 text

まとめ ● syncコマンドは仕様上コマンド終了時のデータ同期を保証しないが、実装上は同期 してから終了する ● -fオプションを使えば同期中のエラー発生有無を検出できる ○ ただしファイルシステム単位で同期する必要がある 6