====== rsyncとsshを利用したリモートサーバの高速バックアップ ====== {{:linux:kaki_kanpo_food.jpg?360|ストレスホルモンを抑え、脳内🧠活性酸素を消去する、薬膳食材の牡蠣🤤 - 「厚岸町牡蠣まつり」にて}} **ストレスホルモンを抑え、脳内🧠活性酸素を消去する、薬膳食材の牡蠣…🤤 - 「厚岸町牡蠣まつり」にて** (内容とはあまり関係ないイメージです)\\ 本家: [[https://rsync.samba.org/|rsync - samba.org]]\\ ソースコード: [[git>RsyncProject/rsync|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 でリリースされており、フリーソフトウェアである。\\ [[wwjp>Rsync|Rsync - Wikiwand]] より...\\ [[windows:rsync|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
選ばれて10年。エンジニアの気持ちが分かる転職エージェントは【アイムファクトリー】 \\ ===== 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
===== 除外 [--exclude] =====
$ sudo rsync -rtlzvogpHAXP --delete --exclude /dev/ --exclude /proc/ --exclude /sys/ --exclude /var/run/ --exclude /var/lock/ --exclude ifcfg* --exclude ssh_host_* --exclude fstab --block-size=4096 -e "ssh -p12345" / skv0001:/
--exclude [パターン] パターンに一致するものを除外する🤔\\ [[.rsync:fedora_vps_duplicate|Fedora VPS サーバーを rsync で複製する😍]] のような場合に活躍するオプション😉\\ ==== 除外パターンを bash braces '{}' で効率よく書く✍😍 ==== ''%%--%%exclude data/log'' ではなく ''%%--%%exclude=data/log'' で書く必要がある🤔\\ ''%%--%%exclude\ data/log'' スペースをバックスラッシュでエスケープすると、bash はブレース展開をシングルクオートで囲むので rsync で **rsync error: syntax or usage error** になるからである🤔\\
$ rsync -avzP --delete \
  --exclude={data/log,lib/plugins/codemirror,lib/tpl/tomoyannet,lib/tpl/tomoyannet_lite} \
  --exclude=data/cache/{{0..9},{a..f}} \
  -e ssh \
  skv0001://var/www/vhosts/www.tomoyan.net/dokuwiki/ \
  ~/my_projects/tomoyan.net/sites/tomoyan.net/dokuwiki
+ rsync -avzP --delete \
  --exclude=data/log --exclude=lib/plugins/codemirror --exclude=lib/tpl/tomoyannet --exclude==lib/tpl/tomoyannet_lite \
  --exclude==data/cache/0 --exclude=data/cache/1 --exclude=data/cache/2 --exclude=data/cache/3 --exclude=data/cache/4 --exclude=data/cache/5 --exclude=data/cache/6 --exclude=data/cache/7 --exclude=data/cache/8 --exclude=data/cache/9 --exclude=data/cache/a --exclude=data/cache/b --exclude=data/cache/c --exclude=data/cache/d --exclude=data/cache/e --exclude=data/cache/f \
  -e ssh \
  skv0001://var/www/vhosts/www.tomoyan.net/dokuwiki/ \
  /home/tomoyan/my_projects/tomoyan.net/sites/tomoyan.net/dokuwiki
[[dt>rpalo/bash-brackets-quick-reference-4eh6|Bash Brackets Quick Reference - DEV Community]] [[gtr>https://dev.to/rpalo/bash-brackets-quick-reference-4eh6|翻訳]]\\ ===== 冗長でくどい 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
===== 差分転送はわかるけど、どうしてそんなに高速なの?🤔 ===== [[md>@saksenaprashant06/the-algorithm-behind-rsync-76c66a278152|The Algorithm behind Rsync. “we want algorithms that are good in… | by Prashant Saksena | Medium]]\\ 要約するとA, B間でブロック署名をやり取りして、ブロックごとに差分のみを高速転送するアルゴリズムだから...🤔\\ ===== レシピ ===== [[.rsync:fedora_vps_duplicate|Fedora VPS サーバーを rsync で複製する😍]]\\ ===== トラブルシューティング ===== ==== 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
===== 参考文献 ===== [[https://linux.die.net/man/1/rsync|rsync(1) - Linux man page]]\\ [[http://www.maruko2.com/mw/rsync_%E3%81%A7%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AE%E5%90%8C%E6%9C%9F%EF%BC%88%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%EF%BC%89|rsync でディレクトリの同期(バックアップ) - maruko2 Note.]]\\ [[http://superuser.com/questions/534862/what-does-rsyncs-output-tell-here-about-to-chk|What does Rsync's output tell here about to-chk?]]\\ [[md>@saksenaprashant06/the-algorithm-behind-rsync-76c66a278152|The Algorithm behind Rsync. “we want algorithms that are good in… | by Prashant Saksena | Medium]]\\