linux:rsync

rsyncとsshを利用したリモートサーバの高速バックアップ

ここでは、rsyncとsshを利用してリモートサーバのバックアップを取る方法を説明する。
rsyncは指定されたフォルダ間の同期を高速に行うことができる。sshを利用するとリモートサーバとの間でフォルダの同期処理を行える。

ローカルフォルダ → ローカルフォルダ の転送は、以下の形式となる。

$ sudo rsync -avP --delete --copy-links /home/samba/DataShare /mnt/backup/

-a 元のパーミッションやグループなどを保持したまま同期
-v 処理中のファイル名を表示
-P 進行状況を表示
–delete コピー元で削除されたファイルは、コピー先でも削除
–copy-links シンボルリンク先のファイルをコピー
-z データを圧縮する(ローカルコピーでは速度が低下するので指定しない)

ローカルフォルダ → リモートサーバ の転送は、以下の形式となる。

$ rsync -avz --delete -e ssh ローカルフォルダ ユーザ@リモートサーバ:転送先フォルダ

-a 元のパーミッションやグループなどを保持したまま同期
-v 処理中のファイル名を表示
-z データを圧縮する(回線が遅い場合などに使用)
–delete コピー元で削除されたファイルは、コピー先でも削除
-e ssh リモートシェルを指定

リモートサーバ → ローカルフォルダ のバックアップは、以下の形式となる。

$ rsync -avz --delete -e ssh ユーザ@リモートサーバ:バックアップ元フォルダ ローカルバックアップ先フォルダ

sshのportに10022を指定する場合は、以下の形式となる。

$ 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 -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 -avzP --delete -e ssh user@remote.srv.com:/remote/server/directory/ /local/client/directory/20150804

-P –partial –progressと同じ

-P または –progress で ir-chk=3604/183542 と表示されて、実行状況の分母が ir-chk=3005/184542 増えるので、正確な進行状況が分かりにくい場合がある。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

以下のようなエラーが出る場合は、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 が ”/var/www/html/” の mkdir に失敗しているため発生している。
対処方法はあらかじめ “/var/www/html/” を用意してあげるか、階層が存在するディレクトリをコピーする。
あらかじめ階層を用意するには以下のコマンドを実行する。

$ mkdir -p /var/www/html/

以下のように表示されるだけで中身がなにもコピーされない。

$ 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
  • linux/rsync.txt
  • 最終更新: 2022/06/29 17:29
  • by ともやん