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

提供:Dev Guides
移動先:案内検索

序章

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

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

前提条件

rsyncを使用してローカルシステムとリモートシステム間でファイルを同期する練習をするには、ローカルコンピューターとリモートマシンとしてそれぞれ機能する2台のマシンが必要です。 これらの2台のマシンは、適切に構成されている限り、仮想プライベートサーバー、仮想マシン、コンテナー、またはパーソナルコンピューターである可能性があります。

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

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

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

Rsyncの定義

Rsyncは、非常に柔軟なネットワーク対応の同期ツールです。 LinuxおよびUnixライクなシステムで広く使用されており、システムスクリプトのツールとして人気があるため、ほとんどのLinuxディストリビューションにデフォルトで含まれています。

Rsync構文を理解する

rsyncの構文は、sshscpcpなどの他のツールと同様に動作します。

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

cd ~

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

mkdir dir1

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

mkdir dir2

次に、いくつかのテストファイルを追加します。

touch dir1/file{1..100}

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

ls dir1
Outputfile1    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フラグを使用します。ディレクトリ同期に必要です:

rsync -r dir1/ dir2

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

rsync -a dir1/ dir2

前の2つのコマンドの構文の最初の引数の最後にスラッシュ(/)があり、ここで強調表示されていることに注意してください。

rsync -a dir1/ dir2

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

~/dir2/dir1/[files]

もう1つのヒントは、rsyncコマンドを実行する前に引数を再確認することです。 Rsyncは、-nまたは--dry-runオプションを渡すことによってこれを行うためのメソッドを提供します。 適切な出力を取得するには、「verbose」を意味する-vフラグも必要です。 次のコマンドで、an、およびvフラグを組み合わせます。

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

次に、次のように、その出力を、末尾のスラッシュを削除したときに受け取る出力と比較します。

rsync -anv dir1 dir2
Outputsending 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を使用してリモートシステムと同期する

rsyncを使用してリモートシステムと同期するには、ローカルマシンとリモートマシンの間でSSHアクセスを構成し、両方のシステムにrsyncをインストールするだけです。 2台のマシン間でSSHアクセスを確認したら、次の構文を使用して、前のセクションのdir1フォルダーをリモートマシンに同期できます。 この場合、実際のディレクトリを転送することに注意してください。そのため、末尾のスラッシュは省略します。

rsync -a ~/dir1 username@remote_host:destination_directory

このプロセスは、ローカルシステムからリモートシステムにディレクトリを「プッシュ」するため、push操作と呼ばれます。 反対の操作はpullで、リモートディレクトリをローカルシステムに同期するために使用されます。 dir1ディレクトリがローカルシステムではなくリモートシステム上にある場合、構文は次のようになります。

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

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

    1. 他のRsyncオプションの使用

Rsyncには、前のセクションで学習したフラグオプションなど、ユーティリティのデフォルトの動作を変更するための多くのオプションが用意されています。

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

rsync -az source destination

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

rsync -azP source destination
Outputsending 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の機能を示しています。

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

次のようなコマンドを使用して、一部のファイルの変更時刻を更新するとします。

touch dir1/file{1..10}

次に、rsync-azPで再度実行すると、Rsyncが変更されたファイルのみをインテリジェントに再コピーする方法が出力に表示されます。

rsync -azP source destination
Outputsending 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オプションを使用して、不要なデータ損失を防ぐためのテストを実行できます。

rsync -an --delete source destination

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

rsync -a --exclude=pattern_to_exclude source destination

除外するパターンを指定している場合は、--include=オプションを使用して、別のパターンに一致するファイルの除外をオーバーライドできます。

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

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

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

結論

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

Rsyncを習得すると、複雑なバックアップ操作を設計し、転送の方法と内容をきめ細かく制御できます。