rsyncはcpコマンドのようにファイルをコピーするコマンドですが、大量のファイルやサーバ間のコピーを
行う場合に適しており、より高速で多機能なコピーコマンドです。
この記事ではrsyncのオプションについて紹介していきます。
rsyncとは?
rsyncは多機能なコピーするコマンドです。
ざっくりした使い分けです。
- cp
- ファイルを単純にコピーする
- scp
- サーバー間のファイルをコピーするcp
- rsync
- ファイルのバックアップ
- ミラーリング
- 大量のファイルの移動、コピー
- パーミッションを保持したり転送スピードを制御したり多機能な転送
特にサーバー間で大量のファイルを転送するときはrsyncを使用するのが普通です。
rsyncは転送データを符号化するあるいはオプションで圧縮するなどして転送量を小さくすることができるので転送スピードが速いのが特徴です。
ソースと宛先間の同期では同期ファイル間のデータ差分のみをコピーするデルタ転送アルゴリズムを採用しているため転送量が少なくなります。
rsyncの基本的な使い方
基本はcpやmvなどと同じ表記方法でコピーします。
# rsync ./before/ /after/
-> /before/の中身を/after/の中身にコピーする
ディレクトリの中身をコピーしたい
ディレクトリAの中身をディレクトリBの中にコピーさせたい場合 (dirA/の/が重要)
## dirAの中にはaというファイルがある。
# rsync /dirA/ /dirB/
# ls /dirB/
dirB/a
->dirBの中にaがコピーされる
ディレクトリごと別のディレクトリに移動させたい
ディレクトリAをディレクトリBの中に作って移動(dirAの後に/は入れない)
# rsync /dirA /dirB/
# ls /dirB/
/dirB/dirA/a
-> dirBの中にdirAごとコピーされる
rsyncのオプション
rsyncには様々なオプションがあります。それぞれの違いについて紹介します。
- -v コピーしたものなど詳細表示
- -n ドライラン(実際には転送しない)
- -a –rlptgoDと同じ
- -r 再帰的にコピーする
- -l シンボリックリンクをそのままコピー
- -p パーミッションを維持する
- -t タイムスタンプをそのままコピーする
- -g グループをそのままコピー
- -o ファイルの所有者を変更
- -D 特殊なファイルコピー
- -P 途中経過を表示して部分的に転送
- –progress 途中経過表示だけ
- -H ハードリンクを保持
- -A ACLを保持
- -X 拡張属性を保持
- -c チェックサムでファイル内容を比較する(timeとsizeではなく)
- -S スパースファイルを効率的に処理する
- –delete 同期オプションでコピー元に無いファイルはコピー先からも削除する(ミラーリング)
- –delete-escluded excludeで指定されたファイルがあっても–deleteを適用する
- -u 宛先に存在し、ソースよりも新しい変更時刻の全ファイルをスキップ
- –bwlimit=1250 (kbps 10Mbps) 帯域制限オプション
- –exclude=’exclude.file’ 除外するファイルを指定
- rsync -av /root/source/ –exclude=’logs/’ –exclude=’.git’ –exclude=’*.swp’ /home/destination/
- 使用頻度が低そうなオプション
- -q エラーメッセージのみに抑制
- -g グループの保持
- -o 所有者の保持 (only root)
- -z 転送データを圧縮する(CPUを消費、転送時間は長くなる。帯域圧縮が必要な場合)
- –size-only サイズが一致した時だけスキップ
- -W –whole-file ファイル全体をコピーしてδアルゴリズムは使わない
- -h human readable
rsyncではファイルサイズと時間が一致するファイルはスキップします。
日付が違った場合はコピーする–ignore-timesではデルタ転送アルゴリズムでファイル差分のみをコピーするため転送による負荷は発生しない。(デルタ転送によるチェックで遅くなる。デルタ転送アルゴリズムを使用せずに上書きコピーしたい場合は–whole-fileを使用する)
-c チェックサムの利用でファイル差分がある場合に転送することも可能だがCPUリソースを使うためパフォーマンスが低下します。(md5ハッシュを計算して比較するため)
-cと–ignore-times(デルタ転送)では–ignore-timesのほうがCPU負荷は少ないようです。
サーバー間での同期・バックアップ
rsyncを使ってサーバ間でファイル転送する方法は2種類あります。
- SSH経由でリモートサーバに接続 (SSH経由でremoteのrsyncdを起動)
- rsyncデーモンに直接TCP経由で接続(remoteで予めrsyncデーモンを起動)
2のほうが多機能で細かい設定がしやすいですが、リモートサーバ上でrsyncデーモンの起動と設定が必要に対して、1の方法はSSHできれば特に設定が不要なので簡便です。
1.リモートサーバに接続SSH経由の方法はリモートサーバにSSHした際にリモートサーバのrsyncデーモンを起動して接続します。
SSH経由でリモートサーバとファイル転送
SSH経由で転送はデフォルトで-eオプションで明示的にsshを指定する必要はありません。
# rsync -av dirA remoteHost:/home/user/
↓わざわざ-eでsshと書かなくても良い。ポートやIPもssh_configに記載があれば不要
# rsync -e "ssh -p 10022" -av dirA user@192.0.2.10:/home/user/
-e で指定が必要なパターンはリモートサーバのSSHポートが22番ではなく、ssh_config(config)にリモートサーバ接続の設定が書いていない場合です。
デーモンモードで起動
コピー先のサーバでrsyncd(デーモン)で起動しておいてrsyncする方法です。
rsyncd.confに設定を記述して挙動を設定することができます。
- 最大コネクション数
- 許可ホスト・ユーザ
- ロギング
- read/wirte制御(read only等)
- 圧縮しないファイルの指定
個人的には非デーモンモードでrsyncを利用するので事足りるのでデーモンモードは利用しません。
rsyncdのポート873を開ける必要があります。サーバで最低限SSHのポートは開いていると思うのでわざわざrsync用に開けるポートを増やすのが面倒です。分けて管理したいなど理由があればデーモンモードを利用する意味があると思います。