運営しているサイトのサーバー環境をリフレッシュさせたくて一時的にサブVPSに移動して作業していたときにふとrsyncとSCPの違いが気になったので調べてみました。
まずrsyncとはコピー元ディレクトリとコピー先ディレクトリを同期させるLinuxコマンドのこと。ローカルだけではなく別のサーバーにも同期可能。
それに対しSCPはSSHを利用したファイル転送コマンドのこと。rsyncもSSHを利用して暗号化しつつデータを転送でき、どちらかというとrsyncのほうが高性能。
また、SCPは転送先に同名ファイルがあるとそのファイルをオープンして転送するため、転送中にアクセスされると中途半端な内容が読み込まれてしまったり、転送を中断した場合転送先のファイルが破損する可能性があるとか。
それに対してrsyncは転送が終了してからファイルを削除するのでたとえアクセスがあったとしても問題なし。また転送を中断してもまず一時ファイルとしてデータを書き出すのでファイルが破損する可能性もない。
というわけで重要なファイルを転送したりするときはrsyncを使うのがよさそう。そうでないときはコマンドが単純でCPUパワーをそこまで食わないSCPでさくっと。(rsyncは差分のチェックサムをとる関係でCPUパワーが必要)
以下両コマンドの使い方備忘録
・SCP
scp オプション ファイル(ディレクトリ)名 ユーザ名@転送先IPorドメイン:転送先パス (パス省略時ユーザホームディレクトリ)
ex) scp hogehoge,tgz hoge@hoge.net:/home/hoge/
コマンドオプション
・-r ディレクトリごと転送 scp /hoge の場合hogeディレクトリが転送
・-P ポート指定
・-p 最終修正時刻、最終アクセス時刻、パーミッションを引き継ぐ
・-C 圧縮転送
・-c 暗号形式の指定
・-i 公開鍵のパス指定
・-l 転送速度指定
・-q 進行状況等非表示
・rsync
rsync オプション ファイル(ディレクトリ)名 ユーザ名@転送先IPorドメイン:
ex) rsync –avz –delete
コマンドオプション
・-a 元のパーミッションやグループなどを保持したまま同期。-rlptgoDしたのと同じことになる。
・-D 特殊なファイルもそのまま同期
・-g グループ情報を維持して同期
・-l シンボリックリンクをそのままコピー
・-n 実際には同期せず実行時の動作のみ出力(--dry-run)
・-o 所有者情報を保持したまま同期
・-p パーミッションを保持したまま同期
・-q 情報非表示
・-r 指定したディレクトリ以下のディレクトリも再帰的にバックアップ
・-t タイムスタンプを保持したままコピー
・-u 追加、更新されたファイルだけコピー
・-v 処理中の経過ファイル名を表示
・-z 圧縮転送
・—delete 動機元にないファイルが同期先にあった場合ファイルを削除
・--exclude=○○ 指定したパターンに一致したファイルを同期対象から排除
・--existing 転送先にないファイルは同期しない
・—ignore-existing 転送先に存在するファイルは同期しない
なお、転送元のディレクトリ名に/をつけるかどうかで挙動が変わる点に注意。
つけないとディレクトリそのものがコピーされ、つけているとコピーされない。
また、昔は-e SSH として明示的にSSHを利用することを宣言しなければならなかったみたいですけど最近はSSHを利用するのがデフォルトになったようですね。
参考URL
UNIXの部屋 コマンド検索:rsync (*BSD/Linux) http://x68000.q-e-d.net/~68user/unix/pickup?rsync
Command Technica:はじめてrsyncを使う方が知っておきたい6つのルール - ITmedia エンタープライズ http://www.itmedia.co.jp/enterprise/articles/0804/21/news013.html
rsyncコマンド - 管理者必見! ネットワーク・コマンド集:ITpro http://itpro.nikkeibp.co.jp/article/COLUMN/20070822/280151/
SCP (1) http://www.unixuser.org/~euske/doc/openssh/jman/scp.html