開発運用

rsync でディレクトリ同期

rsync は、リモートシステムやローカルシステム間でファイルやディレクトリを効率的に同期するための非常に強力なコマンドラインツールです。特に、ネットワーク経由でデータを同期する際に、帯域幅の節約や効率的な更新が求められる場合に便利です。ここでは、rsync を使ってローカルのディレクトリをリモートサーバーと同期する方法について、詳細かつ包括的に説明します。

1. rsync の基本構文

rsync の基本的な構文は以下のようになります:

css
rsync [オプション] [ソース] [ターゲット]
  • オプション: rsync の動作を変更するオプション。例: -a (アーカイブモード), -z (圧縮), -v (詳細モード) など。
  • ソース: 同期元のファイルまたはディレクトリ。
  • ターゲット: 同期先のファイルまたはディレクトリ。リモートホストの指定も可能。

2. rsync の主なオプション

rsync には多くのオプションがあり、目的に応じて適切なものを選ぶことができます。代表的なオプションをいくつか紹介します。

  • -a (アーカイブモード): ファイルの所有権やパーミッション、シンボリックリンクなどを保持して同期します。
  • -v (詳細モード): 処理中のファイルを表示します。
  • -z (圧縮): 転送中にデータを圧縮して、帯域幅を節約します。
  • -r (再帰的): ディレクトリを再帰的にコピーします。
  • -u (更新): ソースのファイルがターゲットより新しい場合のみコピーします。
  • --delete: ターゲット側でソースに存在しないファイルを削除します。

3. ローカルとリモートシステム間での同期

3.1. ローカルディレクトリをリモートサーバーに同期する

ローカルのディレクトリをリモートサーバーに同期する基本的なコマンドは以下のようになります。

ruby
rsync -avz /path/to/local/dir/ username@remote_host:/path/to/remote/dir/
  • /path/to/local/dir/: ローカルの同期元ディレクトリ。
  • username@remote_host: リモートサーバーのユーザー名とホスト名。
  • /path/to/remote/dir/: リモートサーバー側の同期先ディレクトリ。

このコマンドは、ローカルディレクトリをリモートサーバーに転送し、アーカイブモードでファイルの権限やタイムスタンプなどを保持します。また、転送中にデータを圧縮してネットワーク帯域を節約します。

3.2. リモートサーバーからローカルディレクトリに同期する

逆に、リモートサーバーからローカルディレクトリにファイルを同期する場合、次のコマンドを使用します。

ruby
rsync -avz username@remote_host:/path/to/remote/dir/ /path/to/local/dir/

ここでは、リモートサーバーのディレクトリをローカルに転送します。基本的な構文は先ほどと同じですが、ソースとターゲットの順番が逆になります。

4. 差分同期

rsync の大きな特徴は、差分同期を行う点です。すでにターゲットディレクトリに存在するファイルで、変更がないものは再度転送されません。これにより、転送時間と帯域幅を節約できます。例えば、次のコマンドで新しいまたは変更されたファイルのみを同期できます。

ruby
rsync -avzu /path/to/local/dir/ username@remote_host:/path/to/remote/dir/

-u オプションを追加することで、ソースファイルがターゲットファイルより新しい場合のみ転送が行われるようになります。

5. 特定のファイルやディレクトリの除外

特定のファイルやディレクトリを同期から除外したい場合、--exclude オプションを使用します。例えば、*.log というログファイルを同期から除外するには以下のように記述します。

ruby
rsync -avz --exclude='*.log' /path/to/local/dir/ username@remote_host:/path/to/remote/dir/

複数のファイルやディレクトリを除外する場合、--exclude オプションを複数回指定することもできます。

6. 複数のホストへの同期

もし複数のリモートサーバーに対して同じデータを同期したい場合、複数の rsync コマンドを組み合わせて使うことができます。以下のように、2つのリモートサーバーに同じ内容を同期することが可能です。

ruby
rsync -avz /path/to/local/dir/ username@remote_host1:/path/to/remote/dir/ rsync -avz /path/to/local/dir/ username@remote_host2:/path/to/remote/dir/

また、スクリプトを使用して一度に複数のサーバーに同期する方法もあります。

7. rsynccron を使った定期的な同期

rsync を使って定期的にデータを同期するには、cron を使って自動化することができます。例えば、毎日深夜1時にローカルディレクトリをリモートサーバーと同期したい場合、次のように crontab に設定します。

ruby
0 1 * * * rsync -avz /path/to/local/dir/ username@remote_host:/path/to/remote/dir/

これにより、指定した時間に自動的に同期が実行されます。

8. 高度なオプション

  • -e ssh: リモート接続に ssh を使用する場合に指定します。rsync はデフォルトで rsh を使用しますが、ssh を使用する方が安全です。

    ruby
    rsync -avz -e ssh /path/to/local/dir/ username@remote_host:/path/to/remote/dir/
  • --progress: 転送の進行状況を表示します。大量のデータを転送している場合に便利です。

    ruby
    rsync -avz --progress /path/to/local/dir/ username@remote_host:/path/to/remote/dir/

9. rsync のパフォーマンス

rsync は非常に効率的ですが、転送するデータ量が多くなると、ネットワーク帯域やディスクのI/O速度がボトルネックになることがあります。このような場合、rsync のパフォーマンスを最大限に引き出すために以下の点を考慮することができます。

  • 転送を圧縮する (-z オプション) ことで帯域幅を節約。
  • --bwlimit オプションを使用して転送速度に制限をかける。
ruby
rsync -avz --bwlimit=1000 /path/to/local/dir/ username@remote_host:/path/to/remote/dir/

ここで、--bwlimit=1000 は転送速度を毎秒1MBに制限するオプションです。

10. 終わりに

rsync は非常に強力なツールで、ローカルとリモートの間で効率的にデータを同期するために役立ちます。基本的な使い方から高度なオプションまで多くの方法を駆使して、目的に応じた同期を実現できます。自動化や定期的なバックアップなど、さまざまなシナリオで活用できるため、システム管理者や開発者にとっては欠かせないツールの一つです。

Back to top button