syncコマンドでディスクへの書き込みを確定する方法|dropキャッシュ・シャットダウン前の実行タイミング


この記事の監修:宮崎智広(Linux教育歴15年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxコマンドシステム管理コマンド > syncコマンドでディスクへの書き込みを確定する方法|dropキャッシュ・シャットダウン前の実行タイミング
「syncコマンドを実行しないとデータが失われるのか?」
「シャットダウン前にsyncを実行すべきか?shutdown -h nowで自動的にやってくれるのか?」
「dropキャッシュって何?メモリ解放とsyncは何が違う?」

syncコマンドは一見シンプルに見えますが、Linuxのディスク書き込みの仕組みを理解していないと、「使うべき場面」と「不要な場面」の判断が難しいコマンドです。

この記事では、syncコマンドの役割・使うべき場面・dropキャッシュとの違いを、Linuxのディスク書き込みの仕組みから解説します。
RHEL 9 / CentOS Stream 9 / Ubuntu 24.04 LTS で動作確認済みです。
【この記事でわかること】
・sync はメモリ上の未書き込みデータをディスクに強制書き出しするコマンド
・シャットダウン・リブート時は OS が自動的に sync を実行するため手動実行は原則不要
・echo 3 > /proc/sys/vm/drop_caches はメモリのページキャッシュを解放する(sync と役割が異なる)
・USB/外付けディスクのアンマウント前や、緊急シャットダウン前の手動 sync が有効

「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

なぜsyncが必要なのか——Linuxのディスク書き込みの仕組み

Linuxはディスクへの書き込み速度を最適化するため、「遅延書き込み(Write-back)」という仕組みを使っています。

遅延書き込みとは

アプリケーションがファイルにデータを書き込もうとしたとき、Linuxはすぐにディスクへ書き込まず、一旦メモリ上のバッファキャッシュに書き込みます。
その後、CPUやI/Oの状況を見ながら、適切なタイミングでディスクへの書き込みを行います。

この仕組みのメリットは以下のとおりです。

処理速度の向上:メモリへの書き込みはディスクより何桁も速い
I/Oの最適化:複数のデータをまとめてディスクに書き込むことで、I/O効率が上がる
ディスク寿命の延長:SSDなどは書き込み回数に寿命があるため、まとめて書くことで寿命を延ばせる

この「メモリ上にあってまだディスクに書かれていないデータ」を「dirty pages(ダーティページ)」と呼びます。

syncコマンドの役割

syncコマンドは、このダーティページを強制的にディスクに書き出すコマンドです。

オプションなし:すべてのダーティページをディスクに書き出す
--data-only:ファイルデータのみ書き出す(ファイルシステムのメタデータは除く)
--file-system:指定したファイルを含むファイルシステム全体を同期する

syncコマンドの基本的な使い方

1. 基本的なsync実行

# syncを実行する(出力は何も表示されない) # sync # echo $? 0 # 戻り値が0なら正常に完了

syncコマンドは正常に完了しても何も表示しません。$? で戻り値が 0 であることを確認してください。

2. 特定のファイルシステムを同期する(sync --file-system)

# /homeパーティションだけを同期する # sync --file-system /home # マウントポイントを指定する例 # sync --file-system /mnt/usb

大規模なサーバーで全体の sync に時間がかかる場合、特定のファイルシステムだけを同期するほうが効率的です。

3. 現在のダーティページの量を確認する

sync実行前後でダーティページがどう変わるか確認できます。

# ダーティページの量を確認する(kB単位) # cat /proc/meminfo | grep -i dirty Dirty: 2048 kB # まだディスクに書かれていないデータ Writeback: 0 kB # 現在ディスクに書き込み中のデータ # syncを実行する # sync # sync後に再確認 # cat /proc/meminfo | grep -i dirty Dirty: 0 kB # ダーティページが0になった Writeback: 0 kB

syncを使うべき場面・使わなくていい場面

syncが有効な場面

USBメモリや外付けHDDをアンマウントする前:umount コマンドは自動的にsyncを実行しますが、念のため手動でsyncを実行しておくと安心です
スクリプトで大量のファイルを書き込んだ後:バックアップスクリプトなどで大量のデータをコピーした後、完了を確認してからフラグファイルを作成する前に実行する
電源断が予想される環境でのシャットダウン前:UPSなしの環境で停電リスクがある場合、手動でsyncしてから shutdown を実行する
カーネルのデバッグ・クラッシュダンプ取得前:システムを意図的にクラッシュさせる前にデータを保全する

syncが不要な場面(誤解が多いケース)

通常のシャットダウン・リブート前:shutdown -h now や systemctl reboot は内部でsyncを自動実行するため、手動でsyncを実行する必要はありません
すべてのファイル書き込み後:通常のファイル操作(cp、mv、rm等)は、データの一貫性を保つよう設計されています。毎回syncする必要はありません
定期的なメンテナンス作業:cronでsyncを定期実行する運用を見かけますが、通常は不要です。むしろI/Oに負荷をかけます

# shutdown前のsyncは自動実行されるため不要 # shutdown -h now # ↑このコマンドの内部でsyncが自動実行される # 以下は不要(ただし実害もない) # sync && shutdown -h now

dropキャッシュとsyncの違い

syncと混同されやすいのが「dropキャッシュ」です。役割がまったく異なります。
操作 目的 コマンド
sync ダーティページをディスクに書き出す(データ保全) sync
drop_caches ページキャッシュ・dentryキャッシュをクリアする(メモリ解放) echo 3 > /proc/sys/vm/drop_caches

dropキャッシュの使い方

drop_cachesはメモリ上のキャッシュを解放してメモリ使用量を減らすために使います。
重要:dropキャッシュの前にsyncを実行してください。ダーティページを書き出してからキャッシュをクリアしないと、未書き込みデータが失われるリスクがあります。

# まずsyncでダーティページを書き出す # sync # 次にドロップキャッシュを実行する # echo 3 > /proc/sys/vm/drop_caches # 実行後のメモリ確認 # free -h total used free shared buff/cache available Mem: 16Gi 2.1Gi 12Gi 85Mi 1.8Gi 14Gi # buff/cacheが減少していることを確認

drop_cachesの値の意味は次のとおりです。

1:ページキャッシュのみクリア
2:dentryとinodeキャッシュのみクリア
3:ページキャッシュ + dentryキャッシュ + inodeキャッシュをすべてクリア

通常は `echo 3 > /proc/sys/vm/drop_caches` で問題ありません。

本番環境でのdropキャッシュは慎重に

本番環境でdropキャッシュを実行すると、キャッシュが再構築されるまでの間、ディスクI/Oが大幅に増加します。
データベースやWebサーバーが動いている状態で実行すると、一時的なパフォーマンス低下が発生します。
メモリ不足の緊急対応以外では、本番環境での実行は推奨しません。

実務Tips——syncを活用したスクリプト例

バックアップ完了後にsyncしてフラグファイルを作成する

#!/bin/bash # バックアップスクリプト例 BACKUP_DIR="/backup/$(date '+%Y%m%d')" SOURCE_DIR="/var/www/html" # バックアップ実行 rsync -avz "$SOURCE_DIR/" "$BACKUP_DIR/" # ディスクへの書き込みを完了させる sync # バックアップ完了フラグを作成 touch "${BACKUP_DIR}/BACKUP_COMPLETE" echo "バックアップ完了: $BACKUP_DIR"

USBドライブをマウント・コピー・アンマウントする安全な手順

# USBドライブをマウントする # mount /dev/sdb1 /mnt/usb # ファイルをコピーする # cp -r /var/log/important/ /mnt/usb/ # コピー完了を確認してからsyncを実行する # sync # アンマウントする(umountも内部でsyncを実行するが、二重確認として実行) # umount /mnt/usb

シャットダウン前のsync——本当に必要か

よくある誤解に「shutdown前に必ずsyncを実行すべき」というものがあります。

実際には、shutdown -h now(または systemctl poweroff)を実行すると、内部処理として以下が自動的に行われます。

1. 実行中のサービスを停止する
2. ファイルシステムをアンマウントする(この際にsyncが実行される)
3. システムをシャットダウンする

つまり、通常のシャットダウンではsyncの手動実行は不要です。

ただし、以下の場合は手動syncが有効です。

Killシグナルで強制終了する場合:`kill -9` などで強制的にプロセスを終了させた後
カーネルパニックや応答不能の場合:SysRqキーを使った緊急sync(echo s > /proc/sysrq-trigger)
電源ボタンで強制切断する直前:OSが正常なシャットダウンを行えない場合

# 緊急時のSysRqによるsync(システムがハングした場合) # Alt+SysRq+Sキー(コンソール操作) # または以下のコマンドで実行可能 # echo s > /proc/sysrq-trigger # SysRqが有効かどうか確認する # cat /proc/sys/kernel/sysrq 1 # 1なら有効

本記事のまとめ

やりたいこと コマンド
ダーティページをすべてディスクに書き出す sync
特定のファイルシステムだけ同期する sync --file-system /path
ダーティページの量を確認する cat /proc/meminfo | grep -i dirty
ページキャッシュを解放する(sync後に実行) echo 3 > /proc/sys/vm/drop_caches
緊急時のsync(SysRq経由) echo s > /proc/sysrq-trigger
syncコマンドは「いつでも実行すれば安全」という単純なコマンドではなく、「ディスク書き込みの遅延仕組み」を理解した上で、適切な場面で使うのが重要です。
通常のシャットダウンや日常的なファイル操作では自動的に処理されますが、USBドライブ操作やバックアップスクリプト終了後の確実なデータ保全には積極的に活用してください。

Linuxのディスク管理を体系的に学びませんか?

syncコマンドが理解できると、Linuxのファイルシステムとメモリ管理の仕組みが見えてきます。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。


無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録

宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として15年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。