ウェブサイト検索

LinuxでのRsyncコマンドと実用的な例


このガイドでは、Linuxでrsyncコマンドを使用してファイルやディレクトリを同期する方法を簡単な例を用いて説明します。

Rsyncは、すべてのLinux管理者にとって必須のスキルの一部であるコマンドです。これは、ファイルやディレクトリをミラーリングし、バックアップを作成し、データを他のサーバーに移行するためのコマンドラインツールです。

rsyncコマンドの使用はSCPコマンドと機能的に類似していますが、いくつかの利点とより多くの柔軟性を提供します。

このガイドでは、rsync コマンドを使用して、Linux 上でファイルとディレクトリの同期を効率的に行う方法を簡単な例を使って説明します。それらのほとんどには、2台のLinuxマシンを使用する必要があります。

したがって、rsyncを利用できる必要があります。幸いなことに、ほとんどのLinuxディストリビューションにプリインストールされて利用可能です。しかし、もしそれがない場合は、APT、DNF、Pacman、XBPSなど、あなたのディストリビューションのパッケージマネージャーを使って簡単にインストールできます。パッケージ名はrsyncです。

Rsyncコマンドの仕組み

Rsyncは一方向の同期を行い、デフォルトではSSHを使用して転送の安全性を確保します。さらに、rsyncプロセスは別のrsyncプロセスと通信することで動作します。

したがって、2つのリモートサーバー間でファイルやディレクトリを同期させたい場合は、まず両方のサーバーにrsyncコマンドをインストールする必要があります。

前述の通り、Rsyncは背後でSSHを利用しています。そのため、使用しているLinuxマシンの種類に関係なく、事前に両方のマシンでSSHキーを作成することを強くおすすめします。やり方がわからない場合は、素晴らしいガイド「SSHキーペアの生成方法(例付き)」をチェックしてください。

その場合、パスワードなしで動作させるために、ホスト間でSSHキーを交換することが最善です。しかし、再度言いますが、弊社の「パスワードなしでSSHログインを設定する方法」に関するガイダンスを参考にすることができます。

クライアントがリモートサーバーとの同期を要求すると、rsyncはどのファイルを転送する必要があるかを判断します。つまり、rsyncは、その間に変更されたファイルのみ(デルタ転送アルゴリズム)を転送します。

この目的のために rsync が使用する最も基本的なアプローチは、単にフォルダーを再帰的にスキャンし、変更日時と正確なファイルサイズを評価することです。

Rsyncの使い方を学んだので、実際にどのように使うかを探ってみましょう。

Rsyncコマンドの構文

しかし、rsyncの使い方に入る前に、rsyncコマンドの構文を理解することが賢明です。それから、例を進める際にその構文を念頭に置くことができます。

rsync [OPTIONS] SOURCE DESTINATION

最も重要なことは、SOURCEがファイルやディレクトリをコピーする元の場所であり、DESTINATIONがファイルやディレクトリを転送する先の場所であることを覚えておくことです。

ここに、rsync コマンドの最も重要な引数を強調したクイックチートシートがあります。

  • -a(アーカイブ)モードは、シンボリックリンク、ファイルの権限、ユーザーおよびグループの所有権、タイムスタンプを保持しながら、再帰的なファイルコピーを許可します。
  • -h、--human-readable:出力される数字は人間が読みやすい形式で表示されます。
  • -n, --dry-run: 変更を加えずに試行実行を行います。
  • -r、--recursive:データを再帰的にコピーしますが、データ transferの際にタイムスタンプと権限は保持されません。
  • -v, --verbose: 詳細情報を増やす。
  • -z、--compress: 通信中にデータを圧縮してスペースを節約するために使用されます。

LinuxでRsyncコマンドを使用する方法

以下の例のほとんどは、2台のLinuxマシンを使用したシナリオで、記号的にeastとwestとラベル付けされています。その説明が終わったところで、ガイドの本題に入りましょう。

ローカルで単一のファイルをコピー/同期する

次のコマンドは、ローカルマシンの一つのディレクトリ(/srv/dir1)から別のディレクトリ(/srv/dir2)に単一のファイル(logo.jpg)を同期します。宛先のディレクトリが既に存在しない場合、rsyncは自動的にそれを作成します。

rsync /srv/dir1/logo.jpg /srv/dir2/

ご覧のように、rsyncはこの場合、よく知られたcpコマンドと似たような機能を持っています。

ファイル名を宛先の場所から省略した場合、現在の名前のファイルがコピーされます。しかし、異なる名前でファイルを保存したい場合は、宛先部分に新しい名前を入力してください。

rsync /srv/dir1/logo.jpg /srv/dir2/new-logo.jpg

複数のファイルとディレクトリをローカルで再帰的にコピー/同期する

rsync コマンドの真の力は、ディレクトリ全体を同期させるときに発揮されます。

しかし、実際の例に入る前に、重要なことを明確にしておきましょう。rsync コマンドを使って、一つのディレクトリとそのサブディレクトリを別の場所に同期するとき、通常はファイルの修正時間、ファイル権限、シンボリックリンクなどを保持したいと思います。

これを達成するためには、いくつかのオプションを組み合わせる必要があります。最終的な結果は-rlptgoDのようになりますが、覚えにくいです。幸いなことに、rsyncは、前のオプションを単一のオプション-aに結合した簡略版を提供します。

したがって、コマンドに -a 引数を追加すると、次のようになります:

  • (-r) ディレクトリを再帰的に処理する
  • (-l) シンボリックリンクをシンボリックリンクとしてコピーする
  • (-p) パーミッションを保持する
  • (-t) 修正時刻を保持する
  • (-o) 所有者を保持する
  • (-g) グループを保持する
  • (-D) デバイスファイルを保持する

覚えやすく使いやすい -a(アーカイブ)パラメータで。

これらの明確化により、以下のコマンドは同じマシンの /srv/dir1 ディレクトリから /srv/dir2 ディレクトリにすべてのファイルを転送します。

rsync -a /srv/dir1/ /srv/dir2/

しかし、この方法で実行すると、rsync コマンドは実行する活動に関する追加情報を返しません。そこで、何が起こるかを見るために、-a オプションにさらに3つのパラメータ -v、-z、-h を追加します。

これにより、クラシックで最も広く使用されているrsyncコマンドと-avzhパラメータに移ります。

-vオプションは転送に関する追加情報を提供し、-zはストレージを節約するために転送中にファイルを圧縮し、-hは転送されたファイルのサイズをわかりやすい形式で表示します。

もう一度コマンドを実行することができ、その出力ははるかに情報量が多いです。

rsync -avzh /srv/dir1/ /srv/dir2/

ローカルからリモートマシンへ複数のファイルとディレクトリを再帰的にコピー/同期する

rsyncはシステム内でファイルをローカルに同期させるのに優れていますが、一般的には2台のリモートLinuxマシン間でファイルを同期させるために使用されます。

ローカルマシン(east)からリモートマシン(west)の/tmp/dir1に、/srv/dir1ディレクトリの全内容を転送するには、次のように入力します:

rsync -avzh /srv/dir1/ root@west:/tmp/dir1/

では、文法に焦点を当てましょう。最初の部分(ソース)は、私たちのローカルディレクトリへのパス (/srv/dir1) です。一方、2 番目の部分は、SSH のお馴染みの user@host 構文を使用してリモートホストを指定します。

これに続いてコロン(:)が区切りとして使用され、次にファイルを転送するリモートシステム上のディレクトリへのフルパス(/tmp/dir1)が続きます。

リモートからローカルマシンに複数のファイルとディレクトリを再帰的にコピー/同期する

リモートマシンからローカルマシンにファイルを転送することは、前の例と同じです。唯一の違いは、ソースと宛先の位置が入れ替わったことです。

言い換えれば、リモートマシンをソースとして、私たちのローカルマシンを宛先として使用します。

したがって、westという名前のシステムにあるリモートディレクトリ/tmp/dir1の全内容を、私たちのローカルマシンの/srv/dir1に転送するには、次のコマンドを実行してください:

rsync -avzh root@west:/tmp/dir1/ /srv/dir1/

同期からファイルとディレクトリを除外する

rsync コマンドの便利な機能の一つは、どのファイルやディレクトリを同期操作から除外するかを指定できることです。

これは2つの方法で行うことができます:コマンドラインから直接リストする方法(--exclude)または、これらのファイルとディレクトリを別のテキストファイルで指定する方法(--exclude-from)です。両方のアプローチを示しましょう。

例えば、私たちはサーバーwestのリモートディレクトリ/tmp/dir1を私たちのローカルディレクトリ/srv/dir1と同期させます。しかし、myfilesディレクトリとtest.txtファイルは同期プロセスから除外することを指定します。

これらの明確化をもって、私たちの指示は次のようになります:

rsync -avzh --exclude=myfiles --exclude=test.txt root@west:/tmp/dir1/ /srv/dir1/

除外したいファイルやディレクトリに対して、フルパス(/srv/dir1/test.txt)ではなく、相対パス(test.txt)を提供することに注意してください。

次に、2つ目のアプローチを考えてみましょう。そのために、除外したいファイルやディレクトリのリストを含むテキストファイルを作成し、そのファイルをrsyncコマンドの引数として渡してください。

これを達成するために、次のような exclude.txt と呼ばれるテストファイルを作成します:

それから実行します:

rsync -avzh --exclude-from=exclude.txt root@west:/tmp/dir1/ /srv/dir1/

もちろん、--excludeオプションをワイルドカード(*)と一緒に使用することができます。たとえば、すべてのJPGファイルを同期から除外したい場合は、--exclude=*.jpgを使用できます。

同期のためのファイルを含める

--excludeオプションと同様に、--includeを使用すると、同期に含めたいファイルを指定できます。ただし、このオプションは--excludeと組み合わせることで最も効果を発揮します。これにより、転送可能なファイルの種類を制限することができます。

例えば、すべての他のファイルを除外してJPGファイルのみを転送したい場合、コマンドは次のようになります:

rsync -avzh --include='*.jpg' --exclude='*' root@west:/tmp/dir1/ /srv/dir1/

ファイルを削除する

ソースに存在しないが宛先にあるファイルを削除することは、ファイルを同期する際に役立つ別のオプションです。この機能は--deleteオプションを使用することで実現できます。

現在、私たちのローカル/srv/dir1ディレクトリは次のようになっています:

私たちは、リモートサーバー(west)の同期したいディレクトリ(/tmp/dir1)には、index.phpとlogo.jpgのファイルのみが存在すると仮定しています。--deleteオプションを使用してrsyncを実行します。

rsync -avzh --delete root@west:/tmp/dir1/ /srv/dir1/

ご覧の通り、rsyncを--deleteオプションで実行した後、私たちのマシン(宛先)に存在するが、同期元のディレクトリには存在しないファイルは自動的に削除されます。

しかし、私たちが強調しなければならないことが一つあります。--deleteオプションを使用してrsyncを実行する際には、十分な注意が必要です。ソースを指定する際に間違えると、デスティネーションのすべてが削除されてしまいます。

したがって、--deleteを使用する前に、次のセクションで説明する--dry-runオプションを追加してrsyncコマンドの実行をテストすることを強くお勧めします。

Rsyncでドライランを実行する

このオプションを使用することで、間違いによって引き起こされる多くのトラブルを回避できます。--dry-runオプションは、rsyncに実際の実行と同じ結果を生成する変更を加えない試行実行を指示します。

上記の例を参照すると、結果が期待通りであるかをテストするために、--dry-runオプションを使って--deleteコマンドを実行することができます。

rsync -avzh --delete --dry-run root@west:/tmp/dir1/ /srv/dir1/

ファイルに変更が加えられない間、同期中にどの操作が行われるかを見ることができます。

転送後にソースファイルを削除する

時々、転送後にソースファイルを削除したい場合があります。たとえば、毎日のバックアップを新しいサーバーに転送することができます。そのため、転送が完了すると、古いサーバーのソースファイルはもはや必要ありません。

ソースファイルを削除するには、--remove-source-filesオプションを使用できます。

rsync -avzh --remove-source-files root@west:/tmp/dir1/ /srv/dir1/

ここで覚えておくべき重要なことは、--remove-source-filesオプションを付けてrsyncを実行すると、ファイルはソースからのみ削除され、ディレクトリは削除されないということです。

変更された宛先ファイルを上書きしないようにRsyncを避ける

以前述べたように、rsyncを使用して2つのディレクトリ間でファイルを同期させる際、ソースと宛先の両方にファイルが存在し、同一である場合、それらは転送されません。

しかし、その間に宛先のファイルに変更を加えた場合、次回の転送でそれらは元のファイルに置き換えられます。

その場合、更新された宛先ファイルの上書きをスキップするために、-u(--update)オプションを追加できます。

rsync -avzhu root@west:/tmp/dir1/ /srv/dir1/

転送中に進捗を表示する

データを転送している間に進行状況を表示するには、--progressオプションを使用できます。特定のファイルの転送が完了すると、rsyncは以下に示すように要約行を表示します。

rsync -avzh --progress root@west:/tmp/dir1/ /srv/dir1/

転送のための最大および最小ファイルサイズを設定する

rsyncコマンドのもう一つの便利な機能は、同期されるファイルの最大サイズ(--max-size)または最小サイズ(--min-size)を指定できることです。

100KB未満のファイルをスキップするには、次のコマンドを実行してください。

rsync -avzh --min-size=100k root@west:/tmp/dir1/ /srv/dir1/

同様に、1MB未満のファイルを転送するには、次のコマンドを使用してください。

rsync -avzh --max-size=1m root@west:/tmp/dir1/ /srv/dir1/

帯域幅制限を設定する

データ転送中に帯域幅制限を設定するには、--bwlimitオプションを使用してください。このオプションは、ネットワークのスループットが過負荷にならないようにしたい場合に便利です。さらに、rsyncコマンドは、キロバイト毎秒(KB/s)を測定単位として使用します。

たとえば、最大転送速度を500KB/sに設定するには、次のように入力します:

rsync -avzh --bwlimit=500 root@west:/tmp/dir1/ /srv/dir1/

結論

この記事では、Linuxでファイルを同期するためのrsyncコマンドの最も一般的な使用法について説明しました。お役に立てれば幸いです。

rsync コマンドに関する詳細情報は、そのマニュアルページで見つけることができます。

下のセクションにコメント、提案、追加事項を自由に残してください。

関連記事: