ローカルとリモートディレクトリの同期にRsyncを使用する方法

導入

Rsyncは、「remote sync」の略で、リモートおよびローカルのファイル同期ツールです。ファイルの変更部分のみを移動してデータのコピー量を最小限に抑えるアルゴリズムを使用しています。

このチュートリアルでは、Rsyncを定義し、rsyncを使用する際の構文を検討し、リモートシステムとの同期にRsyncを使用する方法、および利用可能なその他のオプションについて説明します。

DigitalOcean App Platformを使用してGitHubからフロントエンドアプリケーションを展開します。DigitalOceanにアプリのスケーリングを任せましょう。

前提条件

rsyncを使用してローカルとリモートシステム間でファイルを同期する練習を行うには、ローカルコンピューターとリモートマシンとして機能する2台のマシンが必要です。これらの2台のマシンは、適切に構成されていれば、仮想プライベートサーバー、仮想マシン、コンテナ、または個人用コンピューターであっても構いません。

サーバーを使用してこのガイドに従う予定であれば、各サーバーに管理ユーザーを設定し、それぞれのサーバーにファイアウォールを構成することが賢明です。これらのサーバーをセットアップするには、初期サーバーセットアップガイドに従ってください。

このチュートリアルに従うためにどの種類のマシンを使用するかに関係なく、両方のマシンでSSHキーを作成している必要があります。その後、そのガイドのステップ2で説明されているように、それぞれのサーバーの公開キーを他のサーバーのauthorized_keysファイルにコピーしてください。

このガイドは、Ubuntu 20.04を実行しているマシンで検証されましたが、一般的にはrsyncがインストールされているLinuxベースのオペレーティングシステムを実行しているコンピューターで動作するはずです。

Rsyncの定義

Rsyncは非常に柔軟なネットワーク対応同期ツールです。LinuxやUnix系システムでの普及度が高く、システムスクリプトのツールとして人気がありますので、ほとんどのLinuxディストリビューションにデフォルトで含まれています。

Rsync構文の理解

rsyncの構文は、sshscp、およびcpなどの他のツールと類似しています。

まず、次のコマンドを実行してホームディレクトリに移動します:

  1. cd ~

次に、テストディレクトリを作成します:

  1. mkdir dir1

別のテストディレクトリを作成します:

  1. mkdir dir2

そして、いくつかのテストファイルを追加します:

  1. touch dir1/file{1..100}

これで、dir1という名前のディレクトリに100個の空のファイルがあります。ファイルをリストアップして確認します:

  1. ls dir1
Output
file1 file18 file27 file36 file45 file54 file63 file72 file81 file90 file10 file19 file28 file37 file46 file55 file64 file73 file82 file91 file100 file2 file29 file38 file47 file56 file65 file74 file83 file92 file11 file20 file3 file39 file48 file57 file66 file75 file84 file93 file12 file21 file30 file4 file49 file58 file67 file76 file85 file94 file13 file22 file31 file40 file5 file59 file68 file77 file86 file95 file14 file23 file32 file41 file50 file6 file69 file78 file87 file96 file15 file24 file33 file42 file51 file60 file7 file79 file88 file97 file16 file25 file34 file43 file52 file61 file70 file8 file89 file98 file17 file26 file35 file44 file53 file62 file71 file80 file9 file99

また、dir2という空のディレクトリもあります。同じシステム上のdir1の内容をdir2に同期するには、rsyncを実行し、-rフラグを使用します。このフラグは「再帰的」を意味し、ディレクトリの同期に必要です:

  1. rsync -r dir1/ dir2

別のオプションは-aフラグを使用することです。これは組み合わせフラグであり、「アーカイブ」を意味します。このフラグは再帰的に同期し、シンボリックリンク、特殊およびデバイスファイル、変更時刻、グループ、所有者、および権限を保持します。これは-rよりも一般的に使用され、推奨されるフラグです。前の例と同じコマンドを実行し、今回は-aフラグを使用します:

  1. rsync -a dir1/ dir2

前の2つのコマンドの構文には、最初の引数の末尾にスラッシュ(/)があり、ここで強調表示されています:

  1. rsync -a dir1/ dir2

この末尾のスラッシュはdir1の内容を示します。末尾のスラッシュがないと、dir1dir2内に含まれるように、ディレクトリも含めて配置されます。その結果、次のような階層が作成されます:

~/dir2/dir1/[files]

別のヒントは、rsyncコマンドを実行する前に引数を再確認することです。これを行うための方法を-nまたは--dry-runオプションを渡すことによってrsyncは提供します。適切な出力を得るために-vフラグ(「冗長表示」を意味する)も必要です。次のコマンドでは、anvフラグを組み合わせます:

  1. rsync -anv dir1/ dir2
Output
sending incremental file list ./ file1 file10 file100 file11 file12 file13 file14 file15 file16 file17 file18 . . .

次に、トレーリングスラッシュを削除して出力を比較します:

  1. rsync -anv dir1 dir2
Output
sending incremental file list dir1/ dir1/file1 dir1/file10 dir1/file100 dir1/file11 dir1/file12 dir1/file13 dir1/file14 dir1/file15 dir1/file16 dir1/file17 dir1/file18 . . .

この出力により、ディレクトリ自体が転送されたことが示されます。

リモートシステムとの同期にRsyncを使用する

リモートシステムと同期するには、ローカルとリモートのマシン間でSSHアクセスが構成されている必要があり、両方のシステムにrsyncがインストールされている必要があります。2つのマシン間でSSHアクセスが確認されたら、前のセクションのdir1フォルダをリモートマシンに同期するには、次の構文を使用します。この場合、実際のディレクトリを転送したいので、トレーリングスラッシュは省略します:

  1. rsync -a ~/dir1 username@remote_host:destination_directory

このプロセスは、プッシュ操作と呼ばれます。これは、ローカルシステムからリモートシステムにディレクトリを「プッシュ」するためです。対向の操作はプルであり、リモートディレクトリをローカルシステムに同期させるために使用されます。もしdir1ディレクトリがローカルシステムではなくリモートシステムにあった場合、構文は以下の通りです:

  1. rsync -a username@remote_host:/home/username/dir1 place_to_sync_on_local_machine

cpや類似のツールと同様に、ソースは常に最初の引数であり、宛先は常に2番目です。

他のRsyncオプションの使用

Rsyncは、ユーティリティのデフォルトの動作を変更するための多くのオプションを提供しています。これには、前のセクションで学んだフラグオプションが含まれます。

テキストファイルなど、すでに圧縮されていないファイルを転送する場合は、圧縮を追加してネットワーク転送量を減らすために-zオプションを使用できます:

  1. rsync -az source destination

-Pフラグも役立ちます。これは--progressフラグと--partialフラグを組み合わせています。最初のフラグは転送の進行状況バーを提供し、2番目のフラグは中断された転送を再開することを可能にします:

  1. rsync -azP source destination
Output
sending incremental file list created directory destination source/ source/file1 0 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=99/101) sourcefile10 0 100% 0.00kB/s 0:00:00 (xfr#2, to-chk=98/101) source/file100 0 100% 0.00kB/s 0:00:00 (xfr#3, to-chk=97/101) source/file11 0 100% 0.00kB/s 0:00:00 (xfr#4, to-chk=96/101) source/file12 0 100% 0.00kB/s 0:00:00 (xfr#5, to-chk=95/101) . . .

コマンドを再度実行すると、変更がないため、出力が短くなります。これは、変更時刻を使用して変更があったかどうかを判断するRsyncの機能を示しています:

  1. rsync -azP source destination
Output
sending incremental file list sent 818 bytes received 12 bytes 1660.00 bytes/sec total size is 0 speedup is 0.00

例えば、次のようなコマンドで一部のファイルの変更時刻を更新した場合を考えてみましょう:

  1. touch dir1/file{1..10}

その後、再度rsync-azPオプションで実行すると、出力でRsyncが知的に変更されたファイルのみを再コピーする方法がわかります。

  1. rsync -azP source destination
Output
sending incremental file list file1 0 100% 0.00kB/s 0:00:00 (xfer#1, to-check=99/101) file10 0 100% 0.00kB/s 0:00:00 (xfer#2, to-check=98/101) file2 0 100% 0.00kB/s 0:00:00 (xfer#3, to-check=87/101) file3 0 100% 0.00kB/s 0:00:00 (xfer#4, to-check=76/101) . . .

2つのディレクトリを真に同期させるためには、ソースから削除されたファイルを宛先ディレクトリから削除する必要があります。デフォルトでは、rsyncは宛先ディレクトリから何も削除しません。

この動作を変更するには、--deleteオプションを使用します。このオプションを使用する前に、-n--dry-runオプションを使用して、望まないデータ損失を防ぐためのテストを行うことができます。

  1. rsync -an --delete source destination

同期しているディレクトリ内にある特定のファイルやディレクトリを除外したい場合は、--exclude=オプションに続けてカンマ区切りのリストで指定することができます。

  1. rsync -a --exclude=pattern_to_exclude source destination

除外する特定のパターンがある場合は、異なるパターンに一致するファイルの除外をオーバーライドするために--include=オプションを使用できます。

  1. rsync -a --exclude=pattern_to_exclude --include=pattern_to_include source destination

最後に、Rsyncの--backupオプションは、重要なファイルのバックアップを保存するために使用できます。これは、バックアップファイルを保存するディレクトリを指定する--backup-dirオプションと併用されます。

  1. rsync -a --delete --backup --backup-dir=/path/to/backups /path/to/source destination

結論

Rsyncは、ネットワーク接続を介したファイル転送を効率化し、ローカルディレクトリの同期に堅牢性を追加できます。Rsyncの柔軟性により、さまざまなファイルレベルの操作に適したオプションとなります。

A mastery of Rsync allows you to design complex backup operations and obtain fine-grained control over how and what is transferred.

Source:
https://www.digitalocean.com/community/tutorials/how-to-use-rsync-to-sync-local-and-remote-directories