server-memo.net

rsyncの使い方

      2016/06/07

データのバックアップなどに人気の「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

 - rsync