Rsyncによるファイル同期

提供: Astarisk Works Wiki

目次

基本的な使い方

rsyncのコマンドは次のように使う。

>rsync [オプション] コピー元 コピー先

例1) コピー元のディレクトリ指定の末尾に/を付けた場合と、付けない場合

次のように構成されているfromディレクトリをtoディレクトリにコピーする

>ls -R from
from:
from1  from2  from3

from/from1:
hoge1.txt  hoge2.txt  hoge3.txt

from/from2:
hoge1.txt  hoge2.txt  hoge3.txt

from/from3:
hoge1.txt  hoge2.txt  hoge3.txt

コピー元のディレクトリ指定に/がついている場合とついていない場合には動作が異なるので比較する。

>rsync -av from/ to  #コピー元のディレクトリ指定に/がついている
sending incremental file list
./
from1/
from1/hoge1.txt
from1/hoge2.txt
from1/hoge3.txt
from2/
from2/hoge1.txt
from2/hoge2.txt
from2/hoge3.txt
from3/
from3/hoge1.txt
from3/hoge2.txt
from3/hoge3.txt

>ls -R to
to:
from1  from2  from3

to/from1:
hoge1.txt  hoge2.txt  hoge3.txt

to/from2:
hoge1.txt  hoge2.txt  hoge3.txt

to/from3:
hoge1.txt  hoge2.txt  hoge3.txt

/を付けた場合にはfromディレクトリ自身はコピーされずにtoディレクトリ以下はfromディレクトリ以下の構成と同じになる。

では/がついていない場合はどうなるかというと…

>rsync -av from to  #コピー元のディレクトリ指定に/がついていない
sending incremental file list
from/
from/from1/
from/from1/hoge1.txt
from/from1/hoge2.txt
from/from1/hoge3.txt
from/from2/
from/from2/hoge1.txt
from/from2/hoge2.txt
from/from2/hoge3.txt
from/from3/
from/from3/hoge1.txt
from/from3/hoge2.txt
from/from3/hoge3.txt
>ls -R to
to:
from

to/from:
from1  from2  from3

to/from/from1:
hoge1.txt  hoge2.txt  hoge3.txt

to/from/from2:
hoge1.txt  hoge2.txt  hoge3.txt

to/from/from3:
hoge1.txt  hoge2.txt  hoge3.txt

fromディレクトリもtoディレクトリに以下にコピーされてしまい、to/from/from1というディレクトリ構成となる。

例2) --delete オプション

--delete オプションを付けるとコピー元で削除したディレクトリはコピー先でも削除される。

>ls -R from
from:
from2  from3

from/from2:
hoge1.txt  hoge2.txt  hoge3.txt

from/from3:
hoge1.txt  hoge2.txt  hoge3.txt

>ls -R to
to:
from1  from2

to/from1:
hoge1.txt  hoge2.txt  hoge3.txt

to/from2:
hoge1.txt  hoge2.txt  hoge3.txt

上記の状態からrsyncを--delete付きで実行するとto/from1ディレクトリ以下は削除され、toになかったfrom3ディレクトリがコピーされる。

>rsync -av --delete from/ to
sending incremental file list
./
deleting from1/hoge3.txt
deleting from1/hoge2.txt
deleting from1/hoge1.txt
deleting from1/
from3/
from3/hoge1.txt
from3/hoge2.txt
from3/hoge3.txt

rsyncのオプション

-a
アーカイブモードで転送を行う。オプション-rlptgoDと同じ。
ディレクトリを再帰的にたどり(-r)複製しうる情報をコピーする
つまり、シンボリックリンクはシンボリックリンクとしてコピー(-l)し、パーミッション(-p)、時間(-t)、グループ(-g)、オーナー(-o)、デバイス(-D)の情報をそのままコピーする。
--delete
コピー元になく、コピー先にあるディレクトリは削除する。これにより、コピー元とコピー先が完全に一致する。
通常は-aとあわせて利用する。

他のマシンと同期を取る

リモートのマシンと同期を取るのにもrsyncはよく使われる。その場合、通信部分はSSHを使って行われることが多い。 そこで問題となるのは接続時の認証。

以下に毎回SSHのパスワードを入力せずに接続する方法を説明する。

手順の概要は次の様になる

  1. RSA認証のキーペアを作る
  2. 同期先側のマシンに同期元の公開鍵を追加する

以下の説明では同期処理をキックする(スクリプト等を実行する)側をクライアント、クライアントからSSHで接続される側をサーバーとして説明する。

RSA認証のキーペアを作る

この操作はクライアントとなるマシンで、同期処理を実行するユーザとして操作する。

キーペアを作る途中で、パスフレーズを聞かれるが、何も入力しないでエンターキーを押す。

# su - syncuser
$ ssh-keygen
$ cd .ssh
$ cat id_rsa.pub >> authorized_keys

サーバーとなるマシンにクライアントの公開鍵を追加する

この操作はサーバー側のマシンで、サーバー側の同期処理に利用するユーザとして操作する。

最初にクライアントからクライアントの公開鍵を転送し、それをサーバー側の authorized_keysに追加する。

$ sftp syncuser@<clientserverのアドレス>
sftp> cd .ssh
sftp> get identity.pub
sftp> exit
$ cd .ssh
$ cat ../id_rsa.pub >> authorized_keys

これで一組のサーバ/クライアント関係の設定は終了。

設定の確認

実際にファイル転送を行い、設定を確認する。 クライアントのマシンに同期処理用ユーザとしてログインし、次のコマンドを実行して実際にファイルが転送できるかを確認する。 初めての実行の場合は確認されたホストに追加するかを聞かれるので"yes"と入力し、進む。

$ rsync -auzr -e "ssh -1" <<サーバーのアドレス>>:/同期先ディレクトリ /同期元ディレクトリ

ここでpassphraseが云々と入力が求められたら設定に間違いがある。 成功するとローカルに/同期元ディレクトリ ができ、サーバーの/同期先ディレクトリの データがまるごとコピーされているはず。

うまくいかない場合

よく引っかかるのが公開鍵のアクセス権限。 sshではキーペア(公開鍵identity.pub、秘密鍵identity)のアクセス権限を600にしておく必要がある。 所有者以外でも編集、参照できる権限がついていると、SSHはそのキーを使わない。なので、identity.pub、 identity、念のためauthorized_keysもchmodで600に設定する。

また、キーペアを作るときにパスフレーズを入力してしまっている場合がある。 その場合、その鍵を使う時にパスフレーズの入力を求められる。 これではパスワード入力しないでrsyncを利用できるようにするという目的を満たさない。 パスフレーズを入力しないでキーペアを作成し直すところから手順をやり直す。



参考

Command Technica:はじめてrsyncを使う方が知っておきたい6つのルール (1/2) - ITmedia エンタープライズ

個人用ツール