linux:rsync

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

選ばれて10年。エンジニアの気持ちが分かる転職エージェントは【アイムファクトリー】

ディレクトリ間の同期を行う場合は、元ディレクトリ指定の違いによる動作に注意する😉

元ディレクトリの中身が先ディレクトリに展開される例:

$ 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/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

-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 がファイルシステムのタイムスタンプやパーミッションをセットする権限がないため発生している。

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
  • 最終更新: 2024/06/16 14:52
  • by ともやん