データのバックアップなどに人気の「rsync」コマンドの使い方メモです。
「rsync」には非常に多くのオプションがありますが、普段使いそうなものをまとめています。
rsync書式
「rsync」コマンドを実行する際の書式です。
rsync [オプション] コピー元 コピー先
オプション
普段使いそうなオプションの抜粋です。
-a | アーカイブモード「-rlptgoD」を指定したのと同じ 所有者情報、パーミッション、タイムスタンプをコピー元からそのまま同期します 基本的にいつも指定します |
|
-r | ディレクトリを再帰的にコピーします 指定したディレクトリ内にあるディレクトリもコピーする場合に必要 無いとディレクトリはコピーされません |
|
-l | シンボリックリンクをそのままシンボリックリンクとしてコピーします | |
-p | パーミッションをコピー元と同じにします | |
-t | タイムスタンプをコピー元と同じにします | |
-g | グループ(group)情報をコピー元と同じにします | |
-o | 所有者情報(owner)をコピー元と同じにします | |
-D | デバイスファイルとスペシャルファイルをそのまま同期します | |
--dry-run (-n) |
動作テストに使用します データに変更を加えず、実行時の動作の表示だけをします 実際にデータ同期を行う前にテストとして使用します(すごく大事!!) 省略形は「-n」私は、「-v」オプションと一緒に使うことが多いです |
|
-v | 実行状況の詳細表示をします | |
--delete | コピー元で削除されたデータを、コピー先からも削除する (コピー元とコピー先を同じ状態にする) |
|
--exclude=パターン | パターンにマッチするものをコピーしない | |
-e ssh | sshでリモートサーバにデータをコピーする場合に使用する | |
-z | データを圧縮して転送する |
実行例
実際にrsyncを実行した際のログを元に、rsyncの使い方を説明していきます。
検証環境
rsyncの動作検証用に下記の環境を作成しましたので、この環境でrsyncの動作を検証していきます。
コピー元
「/home/tamohiko/rsync-test」というディレクトリ内に「test1」から「test5」という5つのファイルを作成しました。
$ ls -la /home/tamohiko/rsync-test/ 合計 4 drwxrwxr-x 2 tamohiko tamohiko 66 6月 24 12:49 . drwx------. 4 tamohiko tamohiko 4096 6月 24 12:49 .. -rw-rw-r-- 1 tamohiko tamohiko 0 6月 24 12:49 test1 -rw-rw-r-- 1 tamohiko tamohiko 0 6月 24 12:49 test2 -rw-rw-r-- 1 tamohiko tamohiko 0 6月 24 12:49 test3 -rw-rw-r-- 1 tamohiko tamohiko 0 6月 24 12:49 test4 -rw-rw-r-- 1 tamohiko tamohiko 0 6月 24 12:49 test5
コピー先
「/home/tamohiko/rsync-test」というディレクトリをコピー先に用に作成しました。
rsyncの動作テスト方法
実際に検証を行っていく前に、「rsync」の動作テスト方について説明します。
「rsync」は非常に便利なのですが、間違った設定で実行してしまいますとデータ消失の危険性があります。
「--dry-run」(省略形は-n)と「-v」オプションを使用することで、データ変更を行わずに動作結果を詳しく表示させることが出来るので、
必ずこれでテストを行ってから、実際にデータコピーを行うように習慣づけましょう。
面倒でもすごく大事です。
データが消失してから後悔しても手遅れです・・・
テストしないのダメ絶対!!
テスト(dry-run)実施
「--dry-run」と「-v」オプションを付けて実際に動作テストを行ってみます。
$ rsync -av --dry-run /home/tamohiko/rsync-test /home/tamohiko/backup/ sending incremental file list rsync-test/ rsync-test/test1 rsync-test/test2 rsync-test/test3 rsync-test/test4 rsync-test/test5 sent 146 bytes received 31 bytes 354.00 bytes/sec total size is 0 speedup is 0.00 (DRY RUN) <---ここに注目
最後の行に(DRY RUN)と表示されています。
コピー先の確認
コピー先に指定されているディレクトリの中を確認すると、データがコピーされていないことが確認できます。
$ ls -la /home/tamohiko/backup/ 合計 4 drwxrwxr-x 2 tamohiko tamohiko 6 6月 24 18:07 . drwx------. 5 tamohiko tamohiko 4096 6月 24 17:23 ..
このように、「--dry-run」オプションを使用することで、データに変更を加えず「rsync」の実行結果を確認することができます。
「-n」での実行例
私はひと目で「dry-run」を指定しているのがわかるので「--dry-run」を良く使っていますが、入力するのが面倒であれば、省略形の「-n」をお使いください。
ちなみに、下記は「-n」を使用しての実行例となります。
$ rsync -avn /home/tamohiko/rsync-test /home/tamohiko /backup/ sending incremental file list rsync-test/ rsync-test/test1 rsync-test/test2 rsync-test/test3 rsync-test/test4 rsync-test/test5 sent 146 bytes received 31 bytes 354.00 bytes/sec total size is 0 speedup is 0.00 (DRY RUN)
ローカルでのデータコピー
まずは、基本的な自分のサーバ内でデータをコピーする方法です。
書式
rsync -av コピー元 コピー先
※「-v」オプションは、データコピー状況を確認するために付けていますが、必要がなければ付けなくてもかまいません。
スラッシュ有無での動作について
「rsync」を実行する際に注意が必要な点は、コピー元の指定方法です。
コピー元のディレクトリの最後にスラッシュ「/」をつけるか、つけないかで動作が異なります。
- スラッシュを付けた場合 コピー元のディレクトリ内のデータがコピーされます
- スラッシュを付けなかった場合 コピー元のディレクトリがそのままコピーされます
スラッシュを付けた場合
コピー元を指定する際に、ディレクトリの最後にスラッシュ「/」つけて「rsync」を実行してみます。
$ rsync -av /home/tamohiko/rsync-test/ /home/tamohiko/backup/ sending incremental file list ./ test1 test2 test3 test4 test5 sent 307 bytes received 110 bytes 834.00 bytes/sec total size is 0 speedup is 0.00
「-v」オプションを付けているので、コピーされたデータの詳細が表示されていて、コピー元からファイルだけがコピーされているのが読み取れます。
コピー先の確認
実際にコピー先のディレクトリを確認してみましょう。
$ ls -la /home/tamohiko/backup/ 合計 4 drwxrwxr-x 2 tamohiko tamohiko 66 6月 28 19:35 . drwx------. 6 tamohiko tamohiko 4096 6月 28 20:51 .. -rw-rw-r-- 1 tamohiko tamohiko 0 6月 24 12:49 test1 -rw-rw-r-- 1 tamohiko tamohiko 0 6月 24 12:49 test2 -rw-rw-r-- 1 tamohiko tamohiko 0 6月 24 12:49 test3 -rw-rw-r-- 1 tamohiko tamohiko 0 6月 24 12:49 test4 -rw-rw-r-- 1 tamohiko tamohiko 0 6月 24 12:49 test5
ファイルだけがコピーされていることが確認できました。
スラッシュを付けなかった場合
コピー元を指定する際に、ディレクトリの最後にスラッシュ「/」つけないで「rsync」を実行してみます。
コピー実施
$ rsync -av /home/tamohiko/rsync-test /home/tamohiko/backup/ sending incremental file list rsync-test/ rsync-test/test1 rsync-test/test2 rsync-test/test3 rsync-test/test4 rsync-test/test5 sent 311 bytes received 111 bytes 844.00 bytes/sec total size is 0 speedup is 0.00
「rsync-test/test1」といったように、コピー元のディレクトリごとコピーされていることが読み取れます。
コピー先確認
実際にコピー先のディレクトリを確認してみましょう。
$ ls -la /home/tamohiko/backup/ 合計 4 drwxrwxr-x 3 tamohiko tamohiko 23 7月 1 17:44 . drwx------. 6 tamohiko tamohiko 4096 6月 28 20:51 .. drwxrwxr-x 2 tamohiko tamohiko 66 6月 28 19:35 rsync-test
コピー先を確認すると、コピー元のディレクトリ「rsunc-test」がそのままコピーされていることが確認できます。
コピー元とコピー先のデータ同期(--delete)
「--delete」オプションを付けることで、コピー元で削除されたデータをコピー先からも削除し、コピー元とコポー先の両方でデータを同じ状態に保つことができます。
テストデータ
「--delete」オプションを使用する前のコピー元とコピー先データです。
「test1」から「test5」というファイルが両ディレクトリに存在します。
コピー元データ
$ ls -la /home/tamohiko/rsync-test 合計 4 drwxrwxr-x 2 tamohiko tamohiko 66 6月 24 17:51 . drwx------. 5 tamohiko tamohiko 4096 6月 24 17:23 .. -rw-rw-r-- 1 tamohiko tamohiko 0 6月 24 12:49 test1 -rw-rw-r-- 1 tamohiko tamohiko 0 6月 24 12:49 test2 -rw-rw-r-- 1 tamohiko tamohiko 0 6月 24 12:49 test3 -rw-rw-r-- 1 tamohiko tamohiko 0 6月 24 12:49 test4 -rw-rw-r-- 1 tamohiko tamohiko 0 6月 24 12:49 test5
コピー先データ
$ ls -la /home/tamohiko/backup/ 合計 4 drwxrwxr-x 2 tamohiko tamohiko 66 6月 24 17:51 . drwx------. 5 tamohiko tamohiko 4096 6月 24 17:23 .. -rw-rw-r-- 1 tamohiko tamohiko 0 6月 24 12:49 test1 -rw-rw-r-- 1 tamohiko tamohiko 0 6月 24 12:49 test2 -rw-rw-r-- 1 tamohiko tamohiko 0 6月 24 12:49 test3 -rw-rw-r-- 1 tamohiko tamohiko 0 6月 24 12:49 test4 -rw-rw-r-- 1 tamohiko tamohiko 0 6月 24 12:49 test5
コピー元からファイル削除
コピー元より「test5」ファイルを削除します。
$ rm /home/tamohiko/rsync-test/test5 $ ls -la /home/tamohiko/rsync-test 合計 4 drwxrwxr-x 2 tamohiko tamohiko 54 6月 24 18:20 . drwx------. 5 tamohiko tamohiko 4096 6月 24 17:23 .. -rw-rw-r-- 1 tamohiko tamohiko 0 6月 24 12:49 test1 -rw-rw-r-- 1 tamohiko tamohiko 0 6月 24 12:49 test2 -rw-rw-r-- 1 tamohiko tamohiko 0 6月 24 12:49 test3 -rw-rw-r-- 1 tamohiko tamohiko 0 6月 24 12:49 test4
「--delete」オプションを付けて「rsync」を実行
まずは、「--dry-run」で確認をします。
$ rsync -av --delete --dry-run /home/tamohiko/rsy nc-test/ /home/tamohiko/backup/ sending incremental file list ./ deleting test5 <--「test5」が削除される sent 101 bytes received 15 bytes 232.00 bytes/sec total size is 0 speedup is 0.00 (DRY RUN)
「deleting test5」と表示され、「test5」ファイルが削除されることが読み取れます。
表示された実行結果から、意図した動作と合致しているので実際にデータを同期させてみます。
$ rsync -av --delete /home/tamohiko/rsync-test/ / home/tamohiko/backup/ sending incremental file list ./ deleting test5 sent 101 bytes received 15 bytes 232.00 bytes/sec total size is 0 speedup is 0.00
コピー先確認
「test5」ファイルが、コピー先からも削除されていることが確認できます。
$ ls -la /home/tamohiko/backup/ 合計 4 drwxrwxr-x 2 tamohiko tamohiko 54 6月 24 18:20 . drwx------. 5 tamohiko tamohiko 4096 6月 24 17:23 .. -rw-rw-r-- 1 tamohiko tamohiko 0 6月 24 12:49 test1 -rw-rw-r-- 1 tamohiko tamohiko 0 6月 24 12:49 test2 -rw-rw-r-- 1 tamohiko tamohiko 0 6月 24 12:49 test3 -rw-rw-r-- 1 tamohiko tamohiko 0 6月 24 12:49 test4
このように「--delete」オプションを付けることで、データの同期を行うことができるのですが、設定を間違えると意図しないデータ消失が発生してしまうので、最初にかならず「--dry-run」で動作テストを行うようにしてください。
コピー対象外指定(--exclude)
「--exclude」オプションを使用することで、コピーを行わないデータを指定することが出来ます。
書式
rsync -av --exclude [パターン] コピー元 コピー先
パターンの部分には除外するデータ名を記述します。
正規表現もつかえます。
--exclude実行例
「test3」のファイルをコピー対象外として、「rsync」を実行してみます。
$ rsync -av --exclude test3 /home/tamohiko/rsync-test/ /h ome/tamohiko/backup/ sending incremental file list ./ test1 test2 test4 test5 sent 253 bytes received 91 bytes 688.00 bytes/sec total size is 0 speedup is 0.00
実行ログから、「test3」のファイルがコピーされていないことが確認できます。
コピー対象外指定(--exclude-from)
複数のデータを指定したい場合は、ファイルに記述しそれを読み込ませることもできます。
書式
rsync -av --exclude-from=ファイル コピー元 コピー先
ファイル作成
今回は「/home/tamohiko/rsync-exclude」というファイルを作成し、そこにコピー対象外としたファイルを記述します。
ファイル名は自分で分かりやすいファイル名で作成してください。
ファイルの中身
「test1」「test3」をコピー対象外にするために両方のファイル名を記述しています。
$ cat /home/tamohiko/rsync-exclude test1 test3
※記述方法は、正規表現での指定も可能です。
rsync --exclude-fromの実行
コピー対象外のデータが記述されているファイルを指定て「rsync」を実行してみます。
$ rsync -av --exclude-from=/home/tamohiko/rsync-exclude /home/tamohiko/rsync-test/ /home/tamohiko/backup/ sending incremental file list ./ test2 test4 test5 sent 203 bytes received 72 bytes 550.00 bytes/sec total size is 0 speedup is 0.00
実行時のログから、「test1」「test3」の両ファイルがコピーされないことが確認できます。
rsync + ssh でリモートサーバとのデータコピー
「rsync」では、「-e ssh」オプションを使用することで、SSHで接続できるサーバとの間でデータをコピーすることが出来ます。
書式
rsync -azv -e ssh [接続先ユーザ名]@ホスト名:コピー元 コピー先 rsync -azv -e ssh コピー元 [接続先ユーザ名]@ホスト名:コピー先
コピー元、コピー先どちら側にもリモートサーバを指定することが出来ます。
※「-z」オプションはデータを圧縮してのコピーとなるので、リモートサーバとのコピーでは付けておいたほうが良いでしょう。
リモートサーバへのコピー
ローカルサーバから「192.168.1.160」のサーバにデータをコピーした際の例です。
sshでの接続となりますので、接続先のユーザのパスワードを入力する必要があります。
$ rsync -azv -e ssh /home/tamohiko/rsync-test/ tamohiko@192.168.1.160:/home/tamohiko/backup/ tamohiko@192.168.1.160's password: sending incremental file list ./ test1 test2 test3 test4 test5 sent 292 bytes received 110 bytes 73.09 bytes/sec total size is 0 speedup is 0.00
実行時のログから、無事データがコピーされていることが確認できます。
ssh接続時のポート番号変更
「rsync」でリモートサーバにデータをコピーする際に、リモートサーバのSSH待ち受けポートがデフォルトの「22」番から変更されている場合は、下記のようにポート番号を指定することができます。
書式
rsync -azv -e "ssh -p ポート番号" [接続先ユーザ名]@ホスト名:コピー元 コピー先 rsync -avz -e "ssh -p ポート番号" コピー元 [接続先ユーザ名]@ホスト名:コピー先
実行例
ポート番号が「10022」に変更されているサーバへ、「rsync」でデータをコピーした際のログです。
$ rsync -azv -e "ssh -p 10022" /home/tamohiko/rsync-test/ tamohiko@192.168.1.160:/home/tamohiko/backup/ tamohiko@192.168.1.160's password: sending incremental file list ./ test1 test2 test3 test4 test5 sent 292 bytes received 110 bytes 73.09 bytes/sec total size is 0 speedup is 0.00
公開鍵を使用する方法
SSHの認証が鍵認証方式である場合は、「-i」オプションを使用することで認証に必要な公開鍵を使用することができます。
rsync -azv -e "ssh -p ポート番号 -i 公開鍵" [接続先ユーザ名]@ホスト名:コピー元 コピー先 rsync -avz -e "ssh -p ポート番号 -i 公開鍵" コピー元 [接続先ユーザ名]@ホスト名:コピー先
SSHのポート番号がデフォルトのままであれば、「-p ポート番号」部分は必要ありません。
コメント