Linuxではパフォーマンスを高めるために、ファイルへの書き込みをすぐにはディスクに反映せず、メモリ上のキャッシュ(ページキャッシュ)に一時的に保持しています。この仕組みのおかげで高速に動作する一方、キャッシュの内容がディスクに書き込まれる前に電源が落ちると、データが失われるリスクがあります。
この記事では、メモリ上のキャッシュを確実にディスクへ書き込むsyncコマンドの使い方を、基本から実務での活用場面まで詳しく解説します。
【この記事でわかること】
・syncはメモリ上の未書き込みデータをディスクに反映する
・USBメモリの取り外し前にsyncで安全にデータを保護できる
・特定のファイルやファイルシステムだけを同期することも可能
・「sync; sync; sync」の慣習が不要になった理由も解説
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
なぜsyncコマンドが必要なのか(ページキャッシュの仕組み)
syncコマンドを理解するには、まずLinuxの「ページキャッシュ」の仕組みを知っておく必要があります。Linuxカーネルは、ファイルの読み書きを高速化するために、ディスクの内容をメモリ上にキャッシュしています。これをページキャッシュと呼びます。アプリケーションがファイルに書き込みを行うと、データはまずこのページキャッシュに書き込まれ、「完了」としてアプリケーションに返されます。
この時点では、データはまだメモリ上にあるだけで、実際のディスクには書き込まれていません。ディスクに書き込まれていないキャッシュ上のデータを「ダーティページ(dirty pages)」と呼びます。
カーネルはバックグラウンドで定期的にダーティページをディスクに書き出しています。この間隔は以下のカーネルパラメータで制御されています。
# ダーティページの書き出し間隔を確認する(単位: 1/100秒) [root@Server ~]# cat /proc/sys/vm/dirty_writeback_centisecs 500
また、ダーティページがどのくらい古くなったら書き出し対象になるかを決めるパラメータもあります。
# ダーティページの有効期限を確認する(単位: 1/100秒) [root@Server ~]# cat /proc/sys/vm/dirty_expire_centisecs 3000
つまり、最悪の場合、ファイルに書き込んでから実際にディスクに反映されるまで数十秒のタイムラグが生じます。この間にサーバーの電源が突然落ちたり、USBメモリを引き抜いたりすると、データが失われてしまうのです。
syncコマンドは、このダーティページを「今すぐ」ディスクに書き込むよう指示するコマンドです。
syncコマンドの基本的な使い方
1. syncコマンドの実行
最もシンプルな使い方は、引数なしでsyncを実行することです。すべてのファイルシステムのダーティページがディスクに書き出されます。# すべてのファイルシステムのキャッシュをディスクに書き込む [root@Server ~]# sync
一般ユーザーでも実行できます。
# 一般ユーザーでも実行可能 [user01@Server ~]$ sync
2. 特定のファイルシステムを同期する
サーバーに複数のファイルシステムがマウントされている場合、特定のファイルシステムだけを同期したいことがあります。sync -f(--file-system)オプションを使えば、指定したファイルが含まれるファイルシステムだけを同期できます。# /mnt/usb にマウントされたファイルシステムだけを同期する [root@Server ~]# sync -f /mnt/usb/somefile.txt
3. 特定のファイルを同期する(sync --data-only)
coreutils 8.24以降では、syncコマンドに直接ファイル名を指定できるようになりました。# 特定のファイルだけを同期する [root@Server ~]# sync /var/log/app/important.log
# ファイルのデータだけを同期する(メタデータは省略) [root@Server ~]# sync --data-only /var/log/app/important.log
なお、ご利用の環境でcoreutilsのバージョンを確認するには、以下を実行してください。
# coreutilsのバージョンを確認する [root@Server ~]# sync --version sync (GNU coreutils) 9.1 Copyright (C) 2022 Free Software Foundation, Inc.
syncコマンドの実務での活用場面
USBメモリ・外付けディスクの安全な取り外し
USBメモリや外付けHDDにファイルをコピーした後、すぐに取り外すとデータが壊れることがあります。これはコピー完了の表示が出ていても、実際にはページキャッシュに書き込まれただけで、USBデバイスへの物理的な書き込みが終わっていないためです。安全に取り外すには、以下の手順を実行してください。
# USBメモリにファイルをコピーした後の安全な取り外し手順 [root@Server ~]# cp -r /home/user01/backup /mnt/usb/ [root@Server ~]# sync -f /mnt/usb/backup [root@Server ~]# umount /mnt/usb
シャットダウン・リブート前の手動sync
shutdownやrebootコマンドは、内部でsyncを自動的に実行してからシステムを停止します。そのため通常はsyncを手動で実行する必要はありません。しかし、システムが不安定な状態でフリーズの兆候がある場合は、shutdownコマンドが正常に動作しない可能性があります。そのような状況では、先にsyncを手動で実行しておくと安心です。
# システムが不安定な場合、先にsyncを実行してからシャットダウン [root@Server ~]# sync [root@Server ~]# shutdown -h now
ddコマンドとの併用(ディスクイメージ書き込み)
ddコマンドでISOイメージをUSBメモリに書き込む場面は、サーバーエンジニアであれば頻繁にあるでしょう。ddの書き込みが完了してもページキャッシュに残っている可能性があるため、USBメモリを抜く前にsyncが必要です。# ISOイメージをUSBメモリに書き込み、syncで確実に反映する [root@Server ~]# dd if=rhel-9.4-x86_64-dvd.iso of=/dev/sdb bs=4M status=progress [root@Server ~]# sync
# conv=fsyncでdd完了時に自動的にディスクへ書き込む [root@Server ~]# dd if=rhel-9.4-x86_64-dvd.iso of=/dev/sdb bs=4M conv=fsync status=progress
シェルスクリプトでの書き込み保証
業務で使うシェルスクリプトの中で、ファイル書き込み後にデータの永続化を保証したい場面があります。例えば、バックアップスクリプトでコピー完了後にsyncを入れておくと、万が一直後にシステム障害が発生してもバックアップデータが保全されます。#!/bin/bash # バックアップスクリプトの例 BACKUP_DIR="/backup/60405" mkdir -p "" # データベースのダンプを取得 mysqldump -u root mydb > "\/mydb.sql" # ダンプファイルをディスクに確実に書き込む sync "\/mydb.sql" echo "バックアップ完了: \/mydb.sql"
syncコマンドのオプション一覧
syncコマンドで使用できるオプションを以下にまとめます。| やりたいこと | コマンド |
|---|---|
| 全ファイルシステムを同期 | sync |
| 特定ファイルを同期 | sync ファイル名 |
| データのみ同期(メタデータ省略) | sync -d ファイル名 |
| ファイルシステム単位で同期 | sync -f ファイル名 |
| バージョン確認 | sync --version |
トラブルシュート・よくある疑問
「syncを実行しても応答が返ってこない」場合
syncコマンドを実行したまま長時間プロンプトが戻らない場合は、大量のダーティページが溜まっている可能性があります。特に、大容量ファイルの書き込み直後や、I/O負荷の高いサーバーで発生しやすい現象です。現在のダーティページの量は以下のコマンドで確認できます。
# ダーティページの量を確認する [root@Server ~]# grep -i dirty /proc/meminfo Dirty: 123456 kB Writeback: 0 kB
# ディスクI/Oの状況をリアルタイムで確認する [root@Server ~]# iostat -x 1 3
「sync; sync; sync」と3回実行する慣習について
古いUnixの管理者の間では「syncは3回実行する」という慣習がありました。これは歴史的な理由によるものです。初期のUnixでは、syncコマンドは非同期で動作していました。syncを実行してもカーネルに「書き出してくれ」とリクエストを出すだけで、実際の書き出し完了を待たずにプロンプトが返っていたのです。そのため、念のために複数回実行して、書き出しが確実に開始されるようにしていました。
# 古いUnixでの慣習(現代のLinuxでは不要) [root@Server ~]# sync; sync; sync
syncとfsyncの違い
syncコマンドと似た仕組みにfsyncがあります。両者の違いを理解しておきましょう。| 項目 | sync | fsync |
|---|---|---|
| 対象 | すべてのファイルシステム(引数なし時) | 指定した1つのファイル |
| 呼び出し方 | コマンドラインから実行 | プログラムからシステムコールで呼び出す |
| 用途 | 管理者がシステム全体を同期 | アプリが個別ファイルの永続化を保証 |
| 粒度 | 粗い(全体またはFS単位) | 細かい(ファイル単位) |
本記事のまとめ
syncコマンドの使い方と仕組みについて解説しました。要点を以下の表にまとめます。| 項目 | 内容 |
|---|---|
| syncコマンドの役割 | メモリ上のページキャッシュ(ダーティページ)をディスクに書き込む |
| 基本的な使い方 | 引数なしでsyncを実行するだけ |
| 特定ファイルの同期 | sync ファイル名(coreutils 8.24以降) |
| ファイルシステム単位の同期 | sync -f ファイル名 |
| USBメモリの安全な取り外し | sync実行後にumountしてから取り外す |
| ddとの併用 | dd if=イメージ of=デバイス conv=fsync |
| 3回実行の慣習 | 現代のLinuxでは不要(同期的に動作するため1回で十分) |
syncの仕組みを理解した次は、サーバー構築の「型」を身につけませんか?
コマンド一つひとつの意味を理解して使いこなせるようになると、サーバー管理の安心感が格段に変わります。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
