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のパスワードを入力せずに接続する方法を説明する。
手順の概要は次の様になる
- RSA認証のキーペアを作る
- 同期先側のマシンに同期元の公開鍵を追加する
以下の説明では同期処理をキックする(スクリプト等を実行する)側をクライアント、クライアントから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 エンタープライズ