「シャットダウン前に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 が有効
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
なぜ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なら正常に完了
2. 特定のファイルシステムを同期する(sync --file-system)
# /homeパーティションだけを同期する # sync --file-system /home # マウントポイントを指定する例 # sync --file-system /mnt/usb
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が減少していることを確認
・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 |
通常のシャットダウンや日常的なファイル操作では自動的に処理されますが、USBドライブ操作やバックアップスクリプト終了後の確実なデータ保全には積極的に活用してください。
Linuxのディスク管理を体系的に学びませんか?
syncコマンドが理解できると、Linuxのファイルシステムとメモリ管理の仕組みが見えてきます。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます