Reference

How to use

rsync [options] source destination
-a可能な限りファイルの情報を保持してコピーする
-u更新されたファイルだけをコピーする
-v詳細表示
-zファイルを圧縮して転送する
-b古いファイルのバックアップを作成する
-esshでデータを暗号化してコピーする
--delete送信元に存在しないファイルを削除する
--exclude指定したファイルを除外してコピーする

「 source 」で指定したファイル(複数可)が「 destination 」で指定した場所にコピーされる。

基本的な使用方法

rsync -a /home/user/dir/ /media/disk/dir/

rsyncは/home/usr/dir//home/usr/dirを区別する。 最後のスラッシュがない場合、rsyncはそのディレクトリも含めて全体をコピーする。 スラッシュがある場合、ディレクトリの中身をコピーするが、ディレクトリそのものは作られない。 たとえば、/var/wwwを別のマシンか何かにミラーリングするなど、 rsyncを使ってディレクトリ構造を複製しようとする場合は、最後のスラッシュを除く必要がある。

ソース名の後に付く「/」は、「このディレクトリのあるコンテンツをコピーする」ことを意味する。 スラッシュがなければ、「このディレクトリをコピーする」ことを意味する。 この違いは --delete オプションを使う際に特に重要である。

「--delete」オプションについての注意

rsyncを最後に実行した後に削除したローカルファイルが、外部システムからも削除されるようにしたければ、 次のように、--deleteオプションを追加する必要がある。

rsync -av --delete /home/user/dir/ /media/disk/backup

ただし、--deleteオプションの使用にはくれぐれも注意すること。 そのつもりがなくても大量のファイルを消してしまう恐れがある。 実際、rsyncの使い方に慣れていても、いきなり実際にファイルのコピーや同期化を行うのではなく、 --dry-runオプションを使って転送内容の確認を行うとよい。 rsyncによる転送を開始してしまってから、コマンドのどこかに間違いがあってデータが破壊される危険があるとわかった場合は、 すぐにCtrl-cキーを押して転送を中止すること。一部は失われるだろうが、残りのファイルは救えるかもしれない。

remote hostへの接続

手元にないファイルをリモートホストにコピーしたい場合はどうしたらよいか。 コマンドにリモートホストとユーザの情報を追加するだけでよい。 たとえば、先ほどのディレクトリをリモートホストにコピーしたければ、次のようにする:

rsync -ave ssh --delete /home/user/dir/ user@remote.host.com:dir/

転送速度やコピーすべき残りファイル数を表示するには、次のように--progressオプションを追加する:

rsync --progress -ave ssh --delete /home/user/dir/ user@remote.host.com:dir/

rsyncによって接続が行われるたびにパスワードを訊かれたくなければ、 パスワードではなくSSH鍵を使ってログインするようにrsyncを設定すればよい。 そのためには、「ssh-keygen -t dsa」を使ってローカルマシンでSSH鍵を生成し、 パスワードの入力を求められたらEnterキーを押す。 SSH鍵が生成されたら、

ssh-copy-id -i .ssh/id_dsa.pub user@remote.host.com

を使って公開鍵をリモートホストにコピーする。

では、rsyncを使ってコピーしたファイルの一部を元に戻すにはどうすればよいか。次のコマンド構文を使えばよい。

rsync -avze ssh remote.host.com:/home/user/dir/ /local/path/

この例では、-zオプションにより、データは圧縮された状態で転送される。 コピー中のファイルがローカルホスト上に存在する場合、rsyncはそのファイルに対しては何も行わない。 リモートホストにファイルをコピーするときと同じである。

ssh接続使用時のポート番号の指定

rsync -avz -e "ssh -p 9122" /home/username/ username@localhost:/home/username/

指定したファイルだけ転送

--files-fromfindを組み合わせて、findで一致したファイルのみ転送する:

ls 
hoge test
find test | rsync -avz -e ssh --files-from=- ./ hoge --progress

ポートフォワーディング下での使用

sshでポートフォワードされたportに接続してrsyncを行う場合、指定するのは「--port=PORT」ではなく、

rsync -avz -e 'ssh -p 8022' username@localhost:/home/username/hoge ./huga

としなければいけない

option detail

-v--verbose転送情報を詳しく表示
-q--quiet転送情報を表示しない
-c--checksum常にチェックサムを行う
-a--archiveアーカイブモード(-rlptgoD オプションと同義)
-r--recursiveディレクトリで再帰的に実行する
-R--relative相対パス名を使う
-b--backupバックアップを作成する (デフォルトで ~ が付く)
--suffix=SUFFIXバックアップのサフィックスを変更
-u--updateアップデートのみ許可 (上書き禁止)
-l--linksソフトリンクを維持する(symlink をそのままコピー)
-L--copy-linksファイルのようにソフトリンクを扱う(symlink のリンク先をコピー)
--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-filersync アルゴリズムを使わない
-x--one-file-system再帰的に実行された時にファイルシステムの境界を横断しない
-B--block-size=SIZErsync アルゴリズムのチェックサムブロックサイズの制御(default 700)
-e--rsh=COMMANDrsh の代替を指定
--rsync-path=PATHリモートのマシーンで rsync のコピーへのパスを指定
-C--cvs-excludeシステム間で転送したくない広範囲のファイルを除外(CVSの方法と同じ)
--delete送信側にないファイルを削除
--delete-excluded受信側にある exclud ファイルも削除
--partial転送途中のファイルを保存します
--forceディレクトリが空でなくても削除
--numeric-idsユーザとグループの id 番号を転送して、転送後にマッピング
--timeout=TIMEIO タイムアウトを設定(秒)
-I--ignore-timesタイムスタンプとファイルサイズのチェックをしない
--size-onlyタイムスタンプのチェックをしないで、ファイルサイズのチェックだけをする
-T--temp-dir=DIRtmp ファイルのディレクトリを指定
--compare-dest=DIR受信側のファイルと比較するための追加ディレクトリ
-z--compress受信ファイルを圧縮compress file data
--exclude=PATTERNパターン一致するファイルを除外
--exclude-from=FILEファイルに記述されたパターンと一致するファイルを除外
--include=PATTERNパターン一致するファイルを除外しない
--include-from=FILEファイルに記述されたパターンと一致するファイルを除外しない
--versionrsync のバージョンを表示する
--daemonrsync をデーモンとして走らせる
--config=FILE別の rsyncd.conf ファイルを指定
--port=PORT別の rsync ポート番号を指定
--statsrsync アルゴリズムの転送効率を表示
--progress転送中の情報を表示
--log-format=FORMATログフォーマットを指定
--password-file=FILEファイルからパスワードを得る
--files-from=FILEread list of source-file names from FILE
-h--helpこのヘルプを表示する

rsyncを使った自動バックアップ

rootの場合

  1. ルートでのsshログインを許可しておく。
  2. バックアップもとのマシーンで、rootでパブリックキーを作成。 「authrized_keys」にrename後、バックアップ先のserverにこれをアップロード、 「/root/.ssh」に配置。
  3. バックアップ元からパスワード無しでrootでログインできるかテスト。
  4. 実行ファイルの作成
    #!/bin/sh
    
    day=$(date --iso-8601)
    date=$(date --iso-8601=seconds)
    
    cd /root/rsyncLog
    
    if [ ! -e "${day}" ]
        then
        mkdir -p ${day}
    fi
    
    cd ${day}
    pwd=$(pwd)
    
    filenameUserName=${pwd}/UserName.${date}.log
    
    /usr/bin/rsync -avz -e ssh /home/UserName/ Address:/Backup/UserName/ > ${filenameUserName}
  5. 実行権限を付加
  6. 「/etc/cron.daily/」に移動

これで毎日バックアップがとられる。

一般ユーザーの場合

sshのrootログインを許可する必要はない。 cronの設置方法だけが異なる。 ユーザー毎のcronを使用する。

  1. 実行するユーザーで「crontab -e」を実行。
  2. エディタが起動するのでファイルを編集する。「/etc/crontab」を参考に書く。
    分 時 日 月 曜日 コマンド
  3. SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
    MAILTO=hoge
    
    02 04 * * * /home/hoge/local/bin/rsyn_hoge
  4. 「/var/spool/cron/ユーザー名」に設定が保存される。

rsync, scp, tar + sshのパフォーマンスの比較

只単にnetwork越しのファイル転送を行う場合、どちらの方がパフォーマンスが良いか。 特に、大量のファイル(>1e+4, 300MB in total)を転送(日本からアメリカ)する場合を考える。

Result

time:

tar+ssh < rsync << scp

rsync

time rsync -q -az -e ssh /home/cmb/chinoney/target server_berkeley:/home/chinoney/tmp/
real    2m45.420s
user    0m44.087s
sys     0m3.507s

平均で大体2-3 min.

scp

time scp -q -rC /home/cmb/chinoney/target server_berkeley::/home/chinoney/tmp/
real    100m47.358s
user    0m33.888s
sys     0m4.318s

TOO SLOW!!!

tar + ssh

time tar -C /home/cmb/chinoney -zcf - target | ssh server_berkeley 'tar -zxf- -C /home/chinoney/tmp'
real    1m21.346s
user    0m45.812s
sys     0m2.763s

平均で大体1分20-30秒程度。

Reference