rsyncを使ってみる
まずは、rsyncを手動で使ってみましょう。
以下の例では、
コピー元サーバーは、自サーバー、
コピー先サーバーは、IPアドレス: 111.122.133.144 としています。
$ rsync -auz --delete -e ssh /var/www/html/ ruser@111.122.133.144:/var/www/html/
|
上記のコマンドイメージでは、
コピー元サーバー のディレクトリ
/var/www/html/ を
コピー先サーバー(IPアドレス : 111.122.133.144) の
ディレクトリ
/var/www/html/ へコピーします。
コピーするために、sshで
コピー先サーバーへユーザ名:
ruserでログインします。
※
コピー先サーバーには、
ruserというユーザが、既に登録されていなければなりません。
ファイルをコピーする場合、以下の条件に従います。(オプションの意味です)
-u : 更新日時を確認して、
コピー先サーバーのファイルが古い場合は、コピーします。
–delete :
コピー元サーバーに存在しないファイルが、
コピー先サーバーで見つかった場合、そのファイルは削除します。
また、
-z : 転送時圧縮して転送します。
その他、オプションは、以下のようなものが存在します。
-v, --verbose 転送情報を詳しく表示
-q, --quiet 転送情報を表示しない
-c, --checksum 常にチェックサムを行う
-a, --archive アーカイブモード(-rlptgoD オプションと同義)
-r, --recursive ディレクトリで再帰的に実行する
-R, --relative 相対パス名を使う
-b, --backup バックアップを作成する (デフォルトで ~ が付く)
--suffix=SUFFIX バックアップのサフィックスを変更
-u, --update アップデートのみ許可 (上書き禁止)
-l, --links ソフトリンクを維持する
-L, --copy-links ファイルのようにソフトリンクを扱う
--copy-unsafe-links 送信側ツリー外のリンクをコピー
--safe-links 受信側ツリー外のリンクを無視
-H, --hard-links ハードリンクを維持する
-p, --perms パーミッションを維持する
-o, --owner オーナーを維持する (root のみ)
-g, --group グループを維持する
-D, --devices デバイスを維持する (root のみ)
-t, --times タイムスタンプを維持する
-S, --sparse 密度の低いファイルを効率的に扱う
-n, --dry-run 実行時の動作だけを表示
-W, --whole-file rsync アルゴリズムを使わない
-x, --one-file-system 再帰的に実行された時にファイルシステムの境界を横断しない
-B, --block-size=SIZE rsync アルゴリズムのチェックサムブロックサイズの制御(default 700)
-e, --rsh=COMMAND rsh の代替を指定
--rsync-path=PATH リモートのマシーンで rsync のコピーへのパスを指定
-C, --cvs-exclude システム間で転送したくない広範囲のファイルを除外(CVSの方法と同じ)
--delete 送信側にないファイルを削除
--delete-excluded 受信側にある exclud ファイルも削除
--partial 転送途中のファイルを保存します
--force ディレクトリが空でなくても削除
--numeric-ids ユーザとグループの id 番号を転送して、転送後にマッピング
--timeout=TIME IO タイムアウトを設定(秒)
-I, --ignore-times タイムスタンプとファイルサイズのチェックをしない
--size-only タイムスタンプのチェックをしないで、ファイルサイズのチェックだけをする
-T --temp-dir=DIR tmp ファイルのディレクトリを指定
--compare-dest=DIR 受信側のファイルと比較するための追加ディレクトリ
-z, --compress 受信ファイルを圧縮compress file data
--exclude=PATTERN パターン一致するファイルを除外
--exclude-from=FILE ファイルに記述されたパターンと一致するファイルを除外
--include=PATTERN パターン一致するファイルを除外しない
--include-from=FILE ファイルに記述されたパターンと一致するファイルを除外しない
--version rsync のバージョンを表示する
--daemon rsync をデーモンとして走らせる
--config=FILE 別の rsyncd.conf ファイルを指定
--port=PORT 別の rsync ポート番号を指定
--stats rsync アルゴリズムの転送効率を表示
--progress 転送中の情報を表示
--log-format=FORMAT ログフォーマットを指定
--password-file=FILE ファイルからパスワードを得る
-h, --help このヘルプを表示する
|
sshのポート番号がデフォルトの22でない場合は、以下のように指定します。
以下の例では、ポート番号が10022の場合としています。
$ rsync -auz --delete -e "ssh -p 10022" /var/www/html/ ruser@111.122.133.144:/var/www/html/
|
この後、パスワード確認があるので、パスワードを入力し、処理を続行します。
$ rsync -auz --delete -e ssh /var/www/html/ ruser@111.122.133.144:/var/www/html/
The authenticity of host '111.122.133.144 (111.122.133.144)' can not be established.
RSA key fingerprint is xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '111.122.133.144' (RSA) to the list of known hosts.
ruser@111.122.133.144's password:
|
Are you sure you want to continue connectingは、yesを入力しリターンします。
ruser@111.122.133.144’s password:は、ruserのパスワードを入力しリターンします。
ログインできれば、ファイルの同期が実施されます。
最初は、ファイル数にもよりますが、多少時間がかかります。
2回目以降は、新規作成、更新、削除したファイルのみが制御されますので、通常は、すぐに終わります。
rsyncを使って自動で同期をとるようにする
ここまでで、rsyncを手入力することで、ファイルの同期をとることができました。
続けて、これを自動化しようと思います。
自動化といえば、cronですね、
ただ、cronを使うには、パスワード入力などのコンソールにおける対話をなしにする必要がありますね。
sshでは、rsaを使った公開キーファイル、秘密キーファイルを元にログインを自動化することができます。
sshの自動ログインの手順を簡単に解説します。
(参照 : TeraTermで 公開鍵認証(鍵交換)を使ってSSH 接続してみる )
- コピー元サーバーでrsyncのcronを実行するユーザでログインします
cronを実行するためのユーザをここでは、ouserとしています。
ここでは、説明をわかりやすくするためにouserとruserを使い分けていますが、
ほとんどの場合、同じユーザ名になるでしょう。
$ su ouser
password:
|
- ouserのホームディレクトリに.sshの名前でディレクトリを作成します
$ cd ~
$ pwd
/home/ouser
$ mkdir .ssh
|
この例では、/home/ouser/.ssh というディレクトリが作成されたことになります。
- ouserでrsaを使った公開キーファイル、秘密キーファイルを作成します
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ouser/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/ouser/.ssh/id_rsa.
Your public key has been saved in /home/ouser/.ssh/id_rsa.pub.
The key fingerprint is:
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx ouser@example.com
$ cd .ssh
$ ls
id_rsa id_rsa.pub
|
全てのEnter …. : の箇所では、何も入力せずにリターンでOKです。
id_rsa.pub : 公開キーファイル
id_rsa : 秘密キーファイル
となります。
- コピー先サーバーのruserのホームディレクトリに.sshというディレクトリを作成します
$ su ruser
password:
$ cd ~
$ pwd
/home/ouser
$ mkdir .ssh
|
- コピー元サーバーで作成したid_rsa.pub : 公開キーファイルをコピー先サーバーのruserのホームディレクトリ/.sshへアップロードします。
$ scp id_rsa.pub ruser@111.122.133.144:~/.ssh/
The authenticity of host '111.122.133.144 (111.122.133.144)' can not be established.
RSA key fingerprint is xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '111.122.133.144' (RSA) to the list of known hosts.
ruser@111.122.133.144's password:
id_rsa.pub 100% 404 0.4KB/s 00:00
|
scpもsshと同じポートを使います。そのためsshで22番ポートを使っていない場合は、
-Pオプションを使います。
以下の例では、ポート番号が10022の場合としています。
$ scp -P 10022 id_rsa.pub ruser@111.122.133.144:~/.ssh/
|
- コピー先サーバーへアップロードされたid_rsa.pub : 公開キーファイルのファイル名をauthorized_keysへ変更します
$ cd .ssh
$ mv id_rsa.pub authorized_keys
|
これで完了。
コピー元サーバーから、コピー先サーバーへsshでログインしてみましょう。
$ ssh ruser@111.122.133.144
|
パスワードを聞かれずにログインできればOKです。
sshのポート番号がデフォルトの22でない場合は、以下のように指定します。
以下の例では、ポート番号が10022の場合としています。
$ ssh -p 10022 ruser@111.122.133.144
|
最後に、コピー元サーバーでcronに登録して完了です。
$ crontab -e
...
*/5 * * * * rsync -auz --delete -e ssh /var/www/html/ ruser@111.122.133.144:/var/www/html/ > /var/log/rsync 2>&1
...
|
この例では、5分間隔で同期をとるようにしています。
また、複数のサーバーと同期をとりたい場合は、ここまでの手順と同じようにユーザの設定を行い、ここのcronの設定にサーバー分列挙することになります。
ざっとこんな感じです。
この同期設定を行っておくと、サーバーの分散化が楽になるでしょう。
まずは、お試しあれ。
2011年9月6日, 1:56 PM
[…] […]
2012年1月14日, 2:33 AM
[…] via rsync + ssh でファイルの同期をとる http://sakura.off-soft.net/centos/rsync-ssh.html […]
2012年10月25日, 8:40 AM
実行例にある、111.222.333.444 という IPv4 アドレスはあり得ないので、修正された方がよいと思います.重要な情報がわかりやすくかかれているのに、これでは「画竜点睛を欠く」だと思います。
2012年10月25日, 1:33 PM
Hiroon さん、
管理人です。
コメントありがとうございます。おっしゃるとおりかもしれませんね。例だとしても、知っている人にとっては、ちょっと違和感有りですかね。
とりあえず、最大値255を下回るように、
111.222.333.444 → 111.122.133.144 に変更してみました。
でも、このパターンの記事がいっぱいありますので、ぼちぼち修正していきます。
ご指摘ありがとうございました。また、何かあれば、ご指摘くださいませ。
2013年2月6日, 5:44 PM
[…] […]