様々な機能を持つ rsync コマンドについて解説します。
rsync のインストール
rsync は yum コマンドでインストールできます。
# yum install rsync |
※後述しますが、rsync でサーバー間でコピーする場合、コピー元だけでなくコピー先でも rsync をインストールしておく必要があります。両サーバーに rsync がインストールしていないと bash: rsync: command not found というエラーが出力されます。
rsync が利用しているポートは 22/TCP もしくは 873/TCP
rsync の公式サイトを確認すると rsync は 22/TCP もしくは 873/TCP ポートを利用しています。
■rsync 公式サイト
https://download.samba.org/pub/rsync/rsync.html
■22/TCP(sshのポート)を使うケース
- can use any transparent remote shell, including ssh or rsh
There are two different ways for rsync to contact a remote system: using a remote-shell program as the transport (such as ssh or rsh) or contacting an rsync daemon directly via TCP. The remote-shell transport is used whenever the source or destination path contains a single colon (:) separator after a host specification. Contacting an rsync daemon directly happens when the source or destination path contains a double colon (::) separator after a host specification, OR when an rsync:// URL is specified (see also the “USING RSYNC-DAEMON FEATURES VIA A REMOTE-SHELL CONNECTION” section for an exception to this latter rule).
■22/TCP(ssh)を利用する例
# rsync -arvP test001@192.168.0.36:/home/test01/test_20181106.gz /tmp |
※192.168.0.36: とコロンが1つの場合は ssh(22/TCP)を利用します。
■873/TCP を使うケース
It is also possible to use rsync without a remote shell as the transport. In this case you will directly connect to a remote rsync daemon, typically using TCP port 873. (This obviously requires the daemon to be running on the remote system, so refer to the STARTING AN RSYNC DAEMON TO ACCEPT CONNECTIONS section below for information on that.)
■873/TCP(rsyncd)を利用する例①
# rsync -arvP test001@192.168.0.36::/test/test_20181106.gz /tmp |
■873/TCP(rsyncd)を利用する例②
# rsync -arvP rsync://test001@192.168.0.36/test/test_20181106.gz /tmp |
※192.168.0.36: とコロンが1つの場合は ssh(22/TCP)を利用します。
お勧めは 873/TCP を利用しない
ssh のポート(22/TCP)が空いているなら、無理に rsyncd(873/TCP)を利用する必要はないでしょう。
rsyncd.conf でデフォルトのパスが設定されていると、運用で思わぬ動きをする可能性があります。(特にスキルレベルの異なる複数人のチームの場合)
コロン 1つ(:)で 22/TCP(ssh)のポートを使用することでヒューマンエラーを無くす方がいいと思います。
rsync コマンドの使い方
様々な場面での rsync の使い方の例です。
【基本】
# rsync <ソース> <デスティネーション> |
【例】リモート(192.168.0.3)の /home/test/test-directory ディレクトリ配下すべてをローカルのカレントディレクトリにコピーする
# rsync -arvP –bwlimit=6250 test001@192.168.0.3:/home/test/test-directory/ . |
■オプション
- -v 動作内容を表示
- -a アーカイブモード
- -r リカーシブ。ディレクトリを再帰的に同期する。
- -P パーシャル。プログレス。進行状況を表示する。
- -p パーミッションを保持する。
- –bwlimit 帯域制限を掛ける。
■bwlimit の例
ネットワークの負荷を考慮し、bwlimit で帯域制限を掛けられます。
bwlimit の単位はKBPS(キロバイト/秒)になるので 8で割った数値を割り当てます。
■設定したい数値 bwlimitの設置値
- 500kbps(1秒間に500Kビット) 62.5KBps(500÷8) –bwlimit=62.5
- 1Mbps(1秒間に1Mビット) 125KBps(1000÷8) –bwlimit=125
- 10Mbps(1秒間に10Mビット) 1250KBps(10000÷8) –bwlimit=1250
- 25Mbps(1秒間に25Mビット) 3125KBps(25000÷8) –bwlimit=3125
- 50Mbps(1秒間に50Mビット) 6250KBps(50000÷8) –bwlimit=6250
- 100Mbps(1秒間に100Mビット) 12500KBps(100000÷8) –bwlimit=12500
- 500Mbps(1秒間に500Mビット) 12500KBps(500000÷8) –bwlimit=62500
【例】20GB のデータを転送するとして、帯域制限を掛けた場合の時間
- 20,000MB ÷ 3.125 = 6400秒 106分
- 20,000MB ÷ 6.25 = 3200秒 53分
【例】567GB のデータを転送するとして、帯域制限を掛けた場合の時間
- 567,000 ÷ 12 = 47250 秒 787分 13時間
【例】リモート(192.168.0.21)の /tmp ディレクトリから ISO ファイルをローカルの /tmp ディレクトリにコピーする
# rsync -arvP –bwlimit=6250 test001@192.168.0.21:/tmp/Windows2016_64bit.ISO /tmp |
【例】リモート(192.168.0.12)の /data ディレクトリ配下をローカルのカレントディレクトリにコピーする
# rsync -arvP –bwlimit=12500 root@192.168.0.12:/data . |
- ソース : root@192.168.0.12:/data
- ディスト: .(カレントディレクトリ)
【例】リモート(192.168.0.36)の /mnt/test_20181106.sql.gz をローカルのカレントディレクトリにコピーする
# rsync -arvP –bwlimit=12500 test001@192.168.0.36:/mnt/test_20181106.sql.gz . |
rsync は /(スラッシュ)の使い方に注意
rsync コマンドは /(スラッシュ)の使い方に注意が必要です。
/(スラッシュ)を付けるか付けないかで思わぬ動きをすることがあります。
【例】ローカルの /home/test001/log ディレクトリをディレクトリごとコピーして /tmp/test_log ディレクトリの下に持っていく
# rsync -arvpP /home/test001/log /tmp/test_log |
- -a アーカイブモード
- -r リカーシブ。ディレクトリを再帰的に同期する。
- -P パーシャル。プログレス。進行状況を表示する。
- -p パーミッションを保持する。
- -v 動作内容を表示
上記のコマンドを実行すると、/tmp/test_log/log ディレクトリが作成されて log ディレクトリの下に各種ログファイルがあるという形になります。
ミスを起こさないための対策案
私の場合は、ディレクトリごとコピーしたいのか、それともディレクトリはコピーしなくてディレクトリ配下のファイルだけコピーしたいのかにより以下のように使い分けています。
【例】ディレクトリごとまるっと持っていきたい
# rsync -arvpP /home/test001/log /tmp/test_log |
コマンド結果は /tmp/test_log/log ディレクトリが作成されて log ディレクトリの下に各種ログファイルがあるという形になります。
【例】特定のディレクトリ配下のファイル群・ディレクトリ群をまるっと持っていきたい
# rsync -arvpP /home/test001/log/* /tmp/test_log |
ポイントは /* とスラッシュ(/)プラスアスタリスク(*)を付けていることです。
こうすることで明示的にディレクトリは持っていかないけど、そのディレクトリ配下のファイル群・ディレクトリ群は持っていくということが分かるようになります。
rsync は dry-run を利用できる
rsync は dry-run(ドライラン)を利用できます。
- dry run ← (実弾ではなく空砲による)射撃演習、(劇などの)けいこ、空運転(空運転)、リハーサルなど
■ドライラン
# rsync -anrvP –bwlimit=12500 root@192.168.0.12:/data . |
- -n ← dry-run を実行する。
rsync コマンドトラブルシューティング
■以下のエラー
[root@test01 ~]# rsync -arvP –bwlimit=6250 test001@192.168.0.21:/tmp/Windows2008R2_64bit.ISO /tmp |
原因はリモートのサーバー上に rsync がインストールされていないことでした。
※rsyncの場合は両サーバー上に rsync がインストールされていないとエラーになります。
参考サイト
【rsync】差分同期の仕組みとオプション, ログの見方(フォーマット)
コメント