目次

rsync

基本

since 2011-01-06

rsync オプション src dest

引数が3つ以上の場合は src が複数になり、最後のひとつが dest になる。

ローカルファイル同士でも使える http://d.hatena.ne.jp/LukeSilvia/20081007/p1

$ cd /path/to/dest_dir
# リハーサル
$ sudo rsync -n -av /path/to/src_dir/* .
# 本番
$ sudo rsync -av /path/to/src_dir/* .

シナリオ

ディスクの引越しをするときに、こんなシナリオで使える。

(1) まず rsync する (2) リモートユーザの利用を禁止する (3) もう一度 rsync して差分だけコピー (4) 設定を変えて新しいディスクを有効に (5) リモートユーザの利用を再度許可する

オプション

–dry-run (-n) : 実行時の処理を表示するだけ。 これを使って練習、スクリプトのデバッグをするとよい。

-e ssh (rsync over ssh であることを明示する)
-a アーカイブ ( -rlptgoD )
-v verbose
-z 圧縮

rsync over ssh の他に、rsh を使う方法、rsyncd デーモンを使う方法などがある。

情報源

  -r = recursive – コピー元の場所から下のサブフォルダを全てバックアップします。
  -l = links – シンボリックリンクがあったら保存先でも同じリンクを作成します。
  -p = permission – rsyncは保存先でもファイルのパーミッションを元の通りにセットします。
  -t = times – rsyncは保存先のファイルの時間データを元の通りにセットします。
  -g オプションはコピー先のファイルのオーナーグループ属性も保存します。
  -o = owner – rootとして実行された場合、コピー先のファイルのオーナーを元のファイルの通りにセットします。
  -D = これは --devices と --specials の二つのオプションを書いたのと同じです。
   --devices = コピー元の文字デバイスとブロックデバイスをターゲットに転送して同じデバイスを作ります。 
   --specials = named sockets や fifo といった特殊ファイルもコピーします。

-t はディレクトリのタイムスタンプは保存しない。

削除について

標準では「送信側に存在しない、受信側にあるファイル」を削除しない。

参考 http://www.infoscience.co.jp/technical/rsync/rsync.html

同期を取るなら "-a –delete" で /via http://www.jitaku-server.net/backup_rsync.html

push モード

rsync -e ssh -avz src... user@remote:dest

ちょっと試した記録。push先のユーザがrootであればlocalの所有者情報が保持される。

remote:/data/_test というディレクトリのグループパーミッションが開いているとする。

src が一つのディレクトリの場合は remote に dest/src ディレクトリが作られる。

 
[local]
$ whoami
nishi
$ rsync -e ssh -avz /home/nishi/src admin@remote:/data/_test
(admin@remoteのパスワード入力)

[remote]
# pwd
/data/_test
# ls -l
drwxr-xr-x  3 admin hil 4096 12/28 23:25 src
# ls -l src/
drwxr-xr-x  2 admin hil 4096 12/28 23:25 data
-rw-r--r--  1 admin hil    0 12/28 23:25 hoge
# rm -rf src

[local]
$ rsync -e ssh -avz /home/nishi/src root@remote:/data/_test
(root@remoteのパスワード入力)

[remote]
# ls -la
drwxr-xr-x  3 admin hil  4096 12/28 23:44 .
drwxrwxrwx  3 root  root 4096 12/28 23:12 ..
drwxr-xr-x  3 nishi hil  4096 12/28 23:25 src
# ls -l src/
drwxr-xr-x  2 nishi hil 4096 12/28 23:25 data
-rw-r--r--  1 nishi hil    0 12/28 23:25 hoge

ちなみに下記のようにすると src を複数指定したことになり、/data/_test/{data,hoge} ができる。

$ cd /home/nishi/src
$ rsync -e ssh -avz . admin@remote:/data/_test

レシピ

ls -l した結果を、手作業で確認して、テキスト形式のリストを作る。

これに基づいて rsync で push する。

drwxr-x---   2 a-aaaaaaa   hil       4096  6月 8日  2001 a-aaaaaaa/
drwxr-x---   2 b-bbbbbbb   hil       4096  6月 8日  2001 b-bbbbbbb/
drwxr-x---   2 c-ccccccc   hil       4096  6月 8日  2001 c-ccccccc/
drwx------   2 d-dddddd    hil       4096  2月28日  2001 d-dddddd/
drwx------   2 e-eeeee     hil       4096  2月28日  2001 e-eeeee/
#!/usr/bin/ruby
# 2009-12-29 nishimoto
LS_FILE = "users-to-push.txt"
ar = [] ; File.open(LS_FILE).each_line do |line|
  ar << line.chomp.split("/")[0].match(/(\S*)$/)[0]
end
a = ar.join(' ')
# --dry-run 
system "cd /export/home; sudo rsync -e ssh -avz #{a} root@remote:/export/archive/2009/users"

ローカルで sudo するときにユーザのパスワードを一度入力。 その後、root@remote のパスワードを一度入力するだけで処理が進む。

pull モード

rsync -e ssh -avz user@host:src... dest