サーバ&アプリ開発

rsyncコマンドで効率的な差分転送を実現

SANA

こんにちは。今回はファイル転送や同期作業を効率良くかつ安全に行う「rsync」コマンドについて解説します。このコマンドはサーバー管理やバックアップに頻繁に使われます。本記事では、rsyncの基本的な使い方からFTPやSCPとの比較、コマンド例について詳しく解説します。

※本記事でのrsyncはSSHプロトコルを利用することを前提とします。

rsyncとは?

rsyncはファイルやディレクトリを効率的に転送・同期するためのコマンドです。初回はすべてのファイルを転送しますが、2回目以降は差分転送により、変更された部分だけを転送します。この機能により、高速で帯域幅を節約した転送が可能になります。

「rsync」の主な特徴
  • 差分転送による効率化: 更新されたファイルだけを転送。
  • SSHを使用した暗号化通信: リモートサーバーへ安全にバックアップ。
  • ファイル属性を保持: パーミッションやタイムスタンプを維持したまま転送。

「rsync」「SCP」「FTP」の比較

「rsync」と似たような機能をもつ「SCP」と「FTP」と比較してみましょう。こちらの3つは用途や特性が異なるため、状況に応じて使い分ける必要があります。

以下の表にて、それぞれの特徴を比較整理しました。

項目rsyncSCPFTP
使用プロトコルSSHSSHFTP
差分転送可能不可不可
デフォルトポート222221(コントロール)
20(データ転送)
暗号化ありありなし
転送速度高速
(差分転送が可能)
やや低速
(全データ転送)
高速
(平文転送のため)
用途バックアップ、同期単発ファイル転送ファイル共有
アップロード
 「rsync」「SCP」「FTP」の比較


定期的なバックアップを取りたい場合は、更新部分だけを効率よく転送できる差分バックアップ機能を備えたrsyncが最適です。また、クライアントがファイルをダウンロードする際には比較的操作が容易なFTPが便利で、特に複数人にファイルを共有する場合に適しています。一方、サーバーに単一のファイルをアップロードする場合は、SSHを利用して安全かつ迅速にファイルを転送できるSCPが適しています。

rsyncが使える条件

転送先と転送元にrsyncがインストールされていること

Linux環境では以下のコマンドでインストール可能です。

#リポジトリを最新化
sudo apt update
#rsyncをインストール
sudo apt install rsync

SSHサーバーが稼働していること

以下のコマンドを打ってsshサーバの状態を確認します。

# Ubuntu系の場合
sudo service ssh status

# CentOS/Red Hat系の場合
sudo systemctl status sshd

sshサーバがACTIVEになっていればOKです。

rsyncコマンド例

オプションを含めたrsyncの基本的な使い方について解説します。

基本構文

基本的な文法は以下です。

rsync [オプション] [転送元] [転送先]

オプション一覧

よく使用されるオプションを以下に示します。

オプション解説
-aディレクトリ再帰的コピーする。(属性も保持)
-v進行状況がわかる。
-z転送時に圧縮をする。
-u更新されたファイルのみ転送。
※転送先に新しいファイルがある場合はスキップ
–dry-runファイルを転送・削除する前に「どのファイルが対象になるか」をシミュレーション。
–progressファイル転送の進行状況を表示。
–delete転送先に存在し、転送元にないファイルを削除。同期をする際に便利。
–exclude特定のファイルやディレクトリを除外して転送。
オプション一覧

ディレクトリを再帰的にコピー(-a)

リモートサーバーにディレクトリ全体をコピーするコマンドは以下です。その他のvとzオプションについては先ほど一覧で示した通り、「進行状況の把握」と「転送時の圧縮」となります。

rsync -avz /local/directory user@remote:/remote/directory

更新されたファイルのみ転送(-u)

「-u」のオプションを使用することで既に最新のファイルがある場合は転送をスキップし、転送の時間を短縮することができます。

rsync -avu /home/user/source/ /home/user/destination/

ただ、この「-u」オプションが紛らわしい。そもそもrsyncには差分更新の機能があるのに「-u」オプションを使うような時はどういう時なのでしょう?まずは「-u」オプション利用有無による違いを下にまとめました。

ファイルの状態「-u」なし「-u」あり
転送先が転送元より最終更新日時が古い場合転送される転送される
転送先が転送元より最終更新日時が新しい場合(サイズが異なる場合※1)
転送される
(サイズが同じ場合※1)
転送されない
転送されない
転送先と転送元の内容と最終更新日時が同じ場合転送されない転送されない
「-u」を利用有無による違い

※1:–checksum オプションを使用すると、ファイルのハッシュ値(内容そのもの)を計算して比較することもできます。

特定のファイルを除外してコピー(–exclude)

特定のファイルをリモートサーバに送信したくない場合はexcludeコマンドを使用します。例のようにワイルドカードを使用することも可能です。

rsync -av --exclude="*.log" /home/user/source/ /home/user/destination/

ディレクトリ間で完全同期(–delete)

rsync -av --delete /home/user/source/ /home/user/destination/

/home/user/source/ ディレクトリの内容を /home/user/destination/ ディレクトリに同期します。さらに、同期元 (source) に存在しないファイルを同期先 (destination) から削除します。

–delete オプションは誤って意図しないファイルを削除してしまう可能性があります。そのため、–dry-run オプションと併用して動作確認を行ってから実施してください。

転送中の進行状況を表示(–progress)

rsync -av --progress /home/user/source/ /home/user/destination/

-vのオプションとの違いはなんだろ?と疑問に思う方もいると思うので下にまとめておきます。

-v:転送対象の内容や処理の概要を把握

・転送対象のファイル名

・ディレクトリの作成や削除の詳細

・rsyncが行った操作の概要(例: コピー、スキップなど)

–progress:ファイルごとの詳細な進捗を確認

・各ファイルごとの転送進捗(現在の転送量 / 全体のサイズ)

・転送速度(例: 3.45 MB/s)

・経過時間と推定残り時間

「-v」と「–progress」は併用して使うことも可能です。

今回は以上です。

Xからの読者コメントをお待ちしています。
ブログ更新の励みになります!
ABOUT ME
さな夫
さな夫
JTC エクストリーム中間管理職
東京生まれ。30代。大学院修了後に今のSIer会社へ就職。普段はアプリ開発の設計を担当。奥さんと子供2人とほのぼのとした日常を過ごしながら技術系のブログを執筆中。
記事URLをコピーしました