Perl開発者のためのLinux入門

rsyncコマンド - ディレクトリを同期する

rsyncコマンドを使うとディレクトリを同期できます。同期とは、二つのディレクトリを同じ状態にすることです。

これには、ディレクトリをコピーする機能も含まれているので、rsyncコマンドは、ディレクトリのコピーにも利用します。

rsyncは、差分だけを転送してくれます。ですので、大きなディレクトリでも、変更分だけが転送されるので、パフォーマンスが良いです。

rsyncを使ってディレクトリを同期する

まずは、rsyncを使って、ディレクトリを同期する方法を紹介します。これが、意外と曲者です。

# ディレクトリをコピーする。src_dirの中身をdist_dirの中に同期する
rsync -av src_dir/ dist_dir

rsyncには、コマンドオプションがたくさんありますが、まずは「-a」と「-v」だけを覚えておきましょう。

「-a」オプションは、他のオプションの組み合わせで、良さげに同期してくれるオプションです。

「-v」オプションで、どのファイルを同期したかが出力されます。

ここが最も大事ですが、rsyncでは、ディレクトリ名の後ろに「/」がつくか、つかないかで意味が変わってきます。

ここをしっかり理解しておかないと、rsyncを実行するたびに、「あれれ」となります。

rsyncでは、同期元のディレクトリの末尾に「/」が付く場合は、「ディレクトリの中身を」ということを意味します。

同期先は、単にディレクトリ名を書きます。

上記は、src_dirの中身をdist_dirの中に同期するという意味になります。

コピー先のディレクトリがない場合は、自動的に作成されます。

もし同期元のディレクトリ名の末尾に「/」がない場合は「src_dir」を「dist_dir」の中に同期するという意味になります。「dist_dir」の中に「src_dir」ができてしまいます。

ローカル・リモート間でディレクトリを同期する

rsyncは、ローカルの同期だけではなく、SSHプロトコルを使ったローカル・リモート間の同期をサポートしています。これは、バックアップに活用できます。

ユーザー名、ホスト名、ポート番号の指定方法を記述しておきます。それ以外は、ローカルでの同期と同じです。

rsync -e "ssh -p 55555" -av /foo/src_dir/ kimoto@192.168.1.1:/bar/dist_dir

ユーザー名・ホスト名の書式

リモートホストは以下のような書式で書きます。

ユーザー名@ホスト名:ディレクトリ

ポート番号の指定

ポート番号の指定は普通のオプションにはなくて、-eオプションでsshコマンドのオプションとして含める必要があります。

-e "ssh -p ポート番号"

バックアップ運用の自動化を行いたい

バックアップ運用の自動化を行いたい場合は、バックアップサーバーでSSHの秘密鍵・公開鍵のペアを作って、それを使って、接続します。鍵があると、パスワードが必須ではないので、バックアップ運用を自動化できます。

SSHの鍵のペアの作り方は、別のところで、解説します。