rsync 複数の {src,dest} ペア

rsync 複数の {src,dest} ペア

コードを配布するリモートサーバーがあります。私は現在scpアップロードコードを使用していますが、遅すぎる(またはより効率的な他のコードに)scp切り替えたいと思います。接続をrsync確立する際にボトルネックが発生するため、sshサーバーへの接続数を最小限に抑えたいと思います。

ローカルでは、私のビルドプロセスはサブディレクトリとサブディレクトリをout含むディレクトリを出力します。出力ファイルのサブセットをリモートサーバーの一致する場所にプッシュします。binlibetc

私のscpコマンドは次のとおりです。

scp out/bin/$BINFILES remote:/usr/bin
scp out/lib/$LIBFILES remote:/usr/lib
scp out/etc/$ETCFILES remote:/etc

これにより、リモートサーバーに3つの接続が確立され、ファイルが変更されていなくてもファイル全体がコピーされます。これが私がしたことですrsync

rsync -e ssh -avz out/bin/$BINFILES remote:/usr/bin
rsync -e ssh -avz out/lib/$LIBFILES remote:/usr/lib
rsync -e ssh -avz out/etc/$ETCFILES remote:/etc

より高速ですが(圧縮と重複排除)、まだリモートサーバーに3つの接続を作成します。

rsync単一のコマンドを使用してこれら3つのコピーを取得する方法はありますか?これがうまくいけば、コピーする前にすべての {src,dest} ペアを一時ファイルに入れることになります。

私は他のツールを試すこともできますが、OS X(現在の開発プラットフォーム)で動作し、理想的にはトランスポート最適化をサポートする必要がありますrsync

答え1

複数の連続したrsyncコマンドが遅いのは、SSH接続を確立するのに時間がかかるためです。この問題は次のように解決できます。設定された SSH チャネルの使用デフォルトの接続共有設定次に、デフォルト接続を開き、rsyncコマンドを変更せずに使用し(このコマンドは-e ssh約10年間デフォルトコマンドでした)、最後にSSH接続を閉じます。

ssh -Nf remote
rsync -avz out/bin/$BINFILES remote:/usr/bin
rsync -avz out/lib/$LIBFILES remote:/usr/lib
rsync -avz out/etc/$ETCFILES remote:/etc
ssh -O exit remote

SSH接続共有が利用できない場合(たとえば、片側でDropbearまたは非常に古いOpenSSHバージョンを実行しているため)、次のことができます。トンネルの構築しかし、これはもっと問題になります。

または、少しの操作で、次を使用してrsyncコマンドを1つにリファクタリングすることもできます。再同期フィルタそしてシンボリックリンク。移動binしてディレクトリを指定できる場合はlib簡単です。

mkdir out/usr
mv out/bin out/lib out/usr/
rsync -avz \
      --include='/bin/***' --include='/lib/***' --include='/etc/***' \
      --exclude='*' out/ remote:/

移動できませんが、コピーするツリーに絶対シンボリックリンクがない場合は、絶対シンボリックリンクを使用してrsyncにディレクトリとして処理するように指示できます。

ln -s "$PWD" out/usr
rsync -avz --copy-unsafe-links \
      --include='/bin/***' --include='/lib/***' --include='/etc/***' \
      --exclude='*' out/ remote:/

関連情報