目次
rsyncとsshを利用したリモートサーバの高速バックアップ
本家: rsync - samba.org
ソースコード: RsyncProject/rsync: An open source utility that provides fast incremental file transfer. It also has useful features for backup and restore operations among many other use cases.
rsync(アールシンク) は、UNIXシステムにおいて、差分符号化を使ってデータ転送量を最小化し、遠隔地間のファイルやディレクトリの同期を行うアプリケーションソフトウェアである。
類似のプログラムやプロトコルにはない rsync 独自の特徴として、ミラーサイトとの転送が双方向に高々1回で済む点がある。
rsync はディレクトリ内容を表示し、ディレクトリやファイルをコピーできる。オプションでデータ圧縮や再帰も指定可能。
rsync プロトコルのデーモン rsyncd がデフォルトで使うTCPポート番号は 873 である。
rsync はローカルなディレクトリ間の同期にも使えるし、RSH や SSH などのリモートシェル経由でも使える。
後者の場合、rsync のクライアントプログラムはローカルとリモートの両方にインストールされている必要がある。
GNU General Public License でリリースされており、フリーソフトウェアである。
Rsync - Wikiwand より…
rsync - 高速増分ファイル転送ユーティリティ(Windows)
rsync + ssh の基本
ここでは、rsyncとsshを利用してリモートサーバのバックアップを取る方法を説明する。
rsyncは指定されたフォルダ間の同期を高速に行うことができる。sshを利用するとリモートサーバとの間でディレクトリの同期処理を行える。
ローカルディレクトリ → ローカルディレクトリ (ディスク間コピーなど)
ローカルディレクトリ → ローカルディレクトリ の転送を行うには、以下のコマンドを実行する😉
$ rsync -avP --delete --copy-links /home/samba/source /mnt/backup/
-a
元のパーミッションやグループなどを保持したまま同期
-v
処理中のファイル名を表示
-P
進行状況を表示
--delete
コピー元で削除されたファイルは、コピー先でも削除
--copy-links
シンボルリンク先のファイルをコピー
-z
データを圧縮する(ローカルコピーでは速度が低下するので指定しない)
選ばれて10年。エンジニアの気持ちが分かる転職エージェントは【アイムファクトリー】
ローカルディレクトリ → リモートサーバ の転送
ローカルディレクトリ → リモートサーバ の転送を行うには、以下のコマンドを実行する😉
$ rsync -avz --delete -e ssh ローカルディレクトリ ユーザ@リモートサーバ:転送先フォルダ
-a
元のパーミッションやグループなどを保持したまま同期
-v
処理中のファイル名を表示
-z
データを圧縮する(回線が遅い場合などに使用)
--delete
コピー元で削除されたファイルは、コピー先でも削除
-e ssh
リモートシェルを指定
自社で腰を落ち着けて仕事がしたい方は【社内SE転職ナビ】へ
リモートサーバ → ローカルディレクトリ のバックアップ
リモートサーバ → ローカルディレクトリ のバックアップを行うには、以下のコマンドを実行する😉
$ rsync -avz --delete -e ssh ユーザ@リモートサーバ:バックアップ元ディレクトリ ローカルバックアップ先ディレクトリ
ssh の port に 10022を指定する場合は、"ssh -p<port>"
のようにダブルクォーテーションで囲って指定する🤔
$ rsync -avz --delete -e "ssh -p10022" ユーザ@リモートサーバ:バックアップ元ディレクトリ ローカルバックアップ先ディレクトリ
実行例:
$ rsync -avz --delete -e ssh username@remote.server.com:/remote/server/directory/ /local/client/directory/20081016
username@remote.server.com's password: receiving file list ... done ./ log/ log/geeklog.tomoyan.net.1.log log/geeklog.tomoyan.net.2.log log/geeklog.tomoyan.net.3.log ... sent 2594 bytes received 403518 bytes 14767.71 bytes/sec total size is 140703092 speedup is 346.46
rsyncコマンドの元ディレクトリ指定の違いによる動作
ディレクトリ間の同期を行う場合は、元ディレクトリ指定の違いによる動作に注意する😉
元ディレクトリの中身が先ディレクトリに展開される例:
$ rsync -avz --delete -e ssh username@remote.server.com:/remote/server/directory/ /local/client/directory/20081016
/remote/server/directory/
のように、元ディレクトリの最後に “/
” を付けると、directory
の内容が 20081016
内に展開されるかたちで同期される🤔
先ディレクトリに元ディレクトリ名のディレクトリが作成される例:
$ rsync -avz --delete -e ssh username@remote.server.com:/remote/server/directory /local/client/directory/20081016
/remote/server/directory
のように、元ディレクトリの最後に “/
” を付けないと、20081016
内に directory
が作成されてその中に同期される🤔
rsync でレジューム同期を行うには?
$ rsync -avzP --delete -e ssh user@remote.srv.com:/remote/server/directory/ /local/client/directory/20150804
-P
–partial –progressと同じ
rsync 進行状況を正確に知る
-P
または --progress
で ir-chk=3604/183542 と表示されて、処理中に ir-chk=3005/184250 のように実行状況の分母が増えて変動するので、完了までの正確な進行状況が分かりにくい場合がある😥 ir-chk (for incremental recursion check)
--no-inc-recursive
オプションを使うと、最初に全ての処理対象をカウントしてから to-chk=3019/196542 のように実行状況の分母が変動しないので、完了までの正確な進行状況が分かりやすい😍
$ rsync -avzP --delete --no-inc-recursive -e ssh user@remote.srv.com:/remote/server/directory/ /local/client/directory/20150804
冗長でくどい Verbose ...😅
-v
オプションは --verbose
なので…🤔
-v
処理中のファイル名を表示
-vv
スキップされたファイル名も表示
-vvv
デバッグレベルの処理詳細を表示
$ rsync -avvvzP --delete --no-inc-recursive -e ssh user@remote.srv.com:/remote/server/directory/ /local/client/directory/20150804
差分転送はわかるけど、どうしてそんなに高速なの?🤔
The Algorithm behind Rsync. “we want algorithms that are good in… | by Prashant Saksena | Medium
要約するとA, B間でブロック署名をやり取りして、ブロックごとに差分のみを高速転送するアルゴリズムだから…🤔
トラブルシューティング
rsync で同期中に Operation not permitted のエラーが出る
以下のようなエラーが出る場合は、rsync がファイルシステムのタイムスタンプやパーミッションをセットする権限がないため発生している。
rsync: failed to set times on "/var/www/html/.": Operation not permitted (1)
権限のあるユーザーで同期するか、sudo を付けて実行するとエラーはでなくなる。
$ sudo rsync -avz --delete -e ssh user@remote.server.com:/remote/server/directory/ /local/client/directory/
rsync で同期中に mkdir "/var/www/html/" failed: No such file or directory (2) のエラーが出る
以下のようなエラーが出る場合は、rsync が ”/var/www/html/” の mkdir に失敗しているため発生している。
対処方法はあらかじめ “/var/www/html/” を用意してあげるか、階層が存在するディレクトリをコピーする。
あらかじめ階層を用意するには以下のコマンドを実行する。
$ mkdir -p /var/www/html/
マウントした NTFS で何もコピーできない
以下のように表示されるだけで中身がなにもコピーされない。
$ rsync -avz --delete -e /var/www/vhosts/ '/mnt/win_c-drv/Program Files (x86)/Ampps/www/vhosts/'
sending incremental file list drwxrwxrwx 0 2019/09/13 05:48:31 . sent 48 bytes received 64 bytes 224.00 bytes/sec total size is 0 speedup is 0.00
-a
オプションは -rlptgoD を指定した事になる。
-v
オプションは verbose (詳細表示)
-z
オプションは 転送時に圧縮
-e
オプションは “ssh -p10022” SSH でポートを指定する
この場合マウントした NTFS なので -e オプションは不要である。(単純にコマンドオプションのミス😅)
$ rsync -avz --delete /var/www/vhosts/ '/mnt/win_c-drv/Program Files (x86)/Ampps/www/vhosts/'
〜省略〜 sent 1,243,360,982 bytes received 891,926 bytes 8,378,807.46 bytes/sec total size is 1,626,537,962 speedup is 1.31
-e オプションを外すとすんなりコピーできた🤣
それでもコピー出来ない場合は -a オプションを分解して以下を試す。
$ rsync -rlptvz --delete /var/www/vhosts/ '/mnt/win_c-drv/Program Files (x86)/Ampps/www/vhosts/'
〜省略〜 sent 1,243,360,982 bytes received 891,926 bytes 8,378,807.46 bytes/sec total size is 1,626,537,962 speedup is 1.31