Linuxのsyncコマンドとは?データ消失を防ぐディスク書き込みの仕組みを解説


この記事の監修:宮崎智広(Linux教育歴15年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips > Linuxのsyncコマンドとは?データ消失を防ぐディスク書き込みの仕組みを解説
「USBメモリを抜いたらデータが壊れていた」「サーバーの電源が突然落ちて、直前の書き込みが消えた」そんな経験はないでしょうか。

Linuxではパフォーマンスを高めるために、ファイルへの書き込みをすぐにはディスクに反映せず、メモリ上のキャッシュ(ページキャッシュ)に一時的に保持しています。この仕組みのおかげで高速に動作する一方、キャッシュの内容がディスクに書き込まれる前に電源が落ちると、データが失われるリスクがあります。

この記事では、メモリ上のキャッシュを確実にディスクへ書き込むsyncコマンドの使い方を、基本から実務での活用場面まで詳しく解説します。

【この記事でわかること】

・syncはメモリ上の未書き込みデータをディスクに反映する
・USBメモリの取り外し前にsyncで安全にデータを保護できる
・特定のファイルやファイルシステムだけを同期することも可能
・「sync; sync; sync」の慣習が不要になった理由も解説


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

なぜsyncコマンドが必要なのか(ページキャッシュの仕組み)

syncコマンドを理解するには、まずLinuxの「ページキャッシュ」の仕組みを知っておく必要があります。

Linuxカーネルは、ファイルの読み書きを高速化するために、ディスクの内容をメモリ上にキャッシュしています。これをページキャッシュと呼びます。アプリケーションがファイルに書き込みを行うと、データはまずこのページキャッシュに書き込まれ、「完了」としてアプリケーションに返されます。

この時点では、データはまだメモリ上にあるだけで、実際のディスクには書き込まれていません。ディスクに書き込まれていないキャッシュ上のデータを「ダーティページ(dirty pages)」と呼びます。

カーネルはバックグラウンドで定期的にダーティページをディスクに書き出しています。この間隔は以下のカーネルパラメータで制御されています。

# ダーティページの書き出し間隔を確認する(単位: 1/100秒) [root@Server ~]# cat /proc/sys/vm/dirty_writeback_centisecs 500

デフォルト値の500は5秒を意味します。つまり、5秒ごとにカーネルがダーティページをディスクへ書き出します。

また、ダーティページがどのくらい古くなったら書き出し対象になるかを決めるパラメータもあります。

# ダーティページの有効期限を確認する(単位: 1/100秒) [root@Server ~]# cat /proc/sys/vm/dirty_expire_centisecs 3000

デフォルト値の3000は30秒です。書き込みから30秒以上経過したダーティページが、次の書き出しサイクルでディスクに反映されます。

つまり、最悪の場合、ファイルに書き込んでから実際にディスクに反映されるまで数十秒のタイムラグが生じます。この間にサーバーの電源が突然落ちたり、USBメモリを引き抜いたりすると、データが失われてしまうのです。

syncコマンドは、このダーティページを「今すぐ」ディスクに書き込むよう指示するコマンドです。

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

1. syncコマンドの実行

最もシンプルな使い方は、引数なしでsyncを実行することです。すべてのファイルシステムのダーティページがディスクに書き出されます。

# すべてのファイルシステムのキャッシュをディスクに書き込む [root@Server ~]# sync

コマンドを実行すると何も表示されずにプロンプトが戻りますが、これで正常です。現在のLinuxではsyncは同期的に動作するため、プロンプトが戻った時点でデータはすべてディスクに書き込み済みです。

一般ユーザーでも実行できます。

# 一般ユーザーでも実行可能 [user01@Server ~]$ sync

2. 特定のファイルシステムを同期する

サーバーに複数のファイルシステムがマウントされている場合、特定のファイルシステムだけを同期したいことがあります。sync -f(--file-system)オプションを使えば、指定したファイルが含まれるファイルシステムだけを同期できます。

# /mnt/usb にマウントされたファイルシステムだけを同期する [root@Server ~]# sync -f /mnt/usb/somefile.txt

この方法は、USBメモリや外付けディスクなど特定のデバイスだけを安全に同期したい場面で便利です。全ファイルシステムのsyncを待たずに済むため、処理時間も短くなります。

3. 特定のファイルを同期する(sync --data-only)

coreutils 8.24以降では、syncコマンドに直接ファイル名を指定できるようになりました。

# 特定のファイルだけを同期する [root@Server ~]# sync /var/log/app/important.log

さらに--data-onlyオプションを付けると、ファイルのデータ部分だけを同期し、メタデータ(タイムスタンプ、パーミッションなど)の書き込みを省略できます。

# ファイルのデータだけを同期する(メタデータは省略) [root@Server ~]# sync --data-only /var/log/app/important.log

メタデータの書き込みはI/Oコストが高いため、データの整合性だけが重要でメタデータの即時反映が不要な場合に有効です。

なお、ご利用の環境で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

umountコマンドは内部的にsyncを呼び出すため、umountが正常に完了すればデータは書き込み済みです。ただし、umount前に明示的にsyncを実行しておくと、umount自体の処理時間が短くなり、busyエラーも発生しにくくなります。

シャットダウン・リブート前の手動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

ddのオプションにconv=fsyncを指定すると、dd自身が書き込み完了時にfsyncを呼び出すため、別途syncを実行する必要がなくなります。

# conv=fsyncでdd完了時に自動的にディスクへ書き込む [root@Server ~]# dd if=rhel-9.4-x86_64-dvd.iso of=/dev/sdb bs=4M conv=fsync status=progress

大容量のイメージを書き込む場合はconv=fsyncの方が確実です。ddの出力完了を待ってからsyncを実行する方法だと、syncの処理に長い時間がかかることがあります。conv=fsyncであれば書き込みの進捗に合わせてディスクへ反映されるため、最後の待ち時間が大幅に短縮されます。

シェルスクリプトでの書き込み保証

業務で使うシェルスクリプトの中で、ファイル書き込み後にデータの永続化を保証したい場面があります。例えば、バックアップスクリプトでコピー完了後に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 ファイル名
データのみ同期(メタデータ省略)sync -d ファイル名
ファイルシステム単位で同期sync -f ファイル名
バージョン確認sync --version

トラブルシュート・よくある疑問

「syncを実行しても応答が返ってこない」場合

syncコマンドを実行したまま長時間プロンプトが戻らない場合は、大量のダーティページが溜まっている可能性があります。特に、大容量ファイルの書き込み直後や、I/O負荷の高いサーバーで発生しやすい現象です。

現在のダーティページの量は以下のコマンドで確認できます。

# ダーティページの量を確認する [root@Server ~]# grep -i dirty /proc/meminfo Dirty: 123456 kB Writeback: 0 kB

Dirtyの値が大きい場合は、その分のデータをディスクに書き込む必要があるため、syncの完了まで時間がかかります。ディスクI/Oの状況はiostatコマンドで確認できます。

# ディスクI/Oの状況をリアルタイムで確認する [root@Server ~]# iostat -x 1 3

デバイスの%utilが100%に近い場合は、ディスクがフル稼働しているため完了を待つしかありません。もしハードウェア障害が疑われる場合は、dmesgでエラーメッセージを確認してください。

「sync; sync; sync」と3回実行する慣習について

古いUnixの管理者の間では「syncは3回実行する」という慣習がありました。これは歴史的な理由によるものです。

初期のUnixでは、syncコマンドは非同期で動作していました。syncを実行してもカーネルに「書き出してくれ」とリクエストを出すだけで、実際の書き出し完了を待たずにプロンプトが返っていたのです。そのため、念のために複数回実行して、書き出しが確実に開始されるようにしていました。

# 古いUnixでの慣習(現代のLinuxでは不要) [root@Server ~]# sync; sync; sync

現代のLinux(カーネル2.6以降)では、syncは同期的に動作します。つまり、syncコマンドのプロンプトが戻った時点で、すべてのダーティページのディスクへの書き込みが完了しています。そのため、syncを複数回実行する必要はありません。1回で十分です。

syncとfsyncの違い

syncコマンドと似た仕組みにfsyncがあります。両者の違いを理解しておきましょう。
項目syncfsync
対象すべてのファイルシステム(引数なし時)指定した1つのファイル
呼び出し方コマンドラインから実行プログラムからシステムコールで呼び出す
用途管理者がシステム全体を同期アプリが個別ファイルの永続化を保証
粒度粗い(全体またはFS単位)細かい(ファイル単位)
syncコマンドにファイル名を指定した場合(sync ファイル名)は、内部的にfsyncシステムコールを使用しています。コマンドラインからの操作であればsyncコマンド、プログラム内からの制御であればfsyncシステムコールという使い分けが一般的です。

本記事のまとめ

syncコマンドの使い方と仕組みについて解説しました。要点を以下の表にまとめます。
項目内容
syncコマンドの役割メモリ上のページキャッシュ(ダーティページ)をディスクに書き込む
基本的な使い方引数なしでsyncを実行するだけ
特定ファイルの同期sync ファイル名(coreutils 8.24以降)
ファイルシステム単位の同期sync -f ファイル名
USBメモリの安全な取り外しsync実行後にumountしてから取り外す
ddとの併用dd if=イメージ of=デバイス conv=fsync
3回実行の慣習現代のLinuxでは不要(同期的に動作するため1回で十分)
syncコマンドはシンプルなコマンドですが、その裏にはLinuxのページキャッシュという重要な仕組みがあります。USBメモリの取り外し、ディスクイメージの書き込み、シェルスクリプトでのデータ保護など、データを確実にディスクへ反映させたい場面ではsyncコマンドを活用してください。

syncの仕組みを理解した次は、サーバー構築の「型」を身につけませんか?

コマンド一つひとつの意味を理解して使いこなせるようになると、サーバー管理の安心感が格段に変わります。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

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


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

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

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

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

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

宮崎 智広

この記事を書いた人

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

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

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