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 はディレクトリのタイムスタンプは保存しない。
削除について
標準では「送信側に存在しない、受信側にあるファイル」を削除しない。
- –delete : 送信側に存在しない、受信側にあるファイルを削除。ただし、受信側のファイルシステムに十分なスペースを確実に確保するために、ファイル転送前にファイルを削除。
- –delete-after : 転送後にファイルを削除。
参考 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