hogehoge foobar Blog Style Beta

Web,Mac,Linux,JavaScript,Perl,PHP,RegExp,Git,Vim,Redmineなど技術的なことのメモや、ちょっと便利そうなものの紹介をしています。

rsyncの簡単な使い方いろいろ

最近rsyncを使う機会があったので、備忘録として書いておきます。

rsyncとは?

rsync は、ファイル・ディレクトリのバックアップやミラーリングを行うコマンドである。ミラーリングやバックアップを行うだけなら cp コマンドでも実現可能だが、rsync コマンドには以下のようなメリットがある。
ミラーリングが可能 (単純な cp だと、削除されたファイルがコピー先に残ってしまう)
リモートマシンへ/リモートマシンからのバックアップが可能
2回目以降の実行では、前回実行時との差分を調べ、必要なファイルのみ転送するため高速である

UNIXの部屋rsyncより

つまりはディレクトリの同期を行うためのコマンドになります。

同期元のディレクトリ構造

今回同期を行うディレクトリ構造は以下のような形のものを使用します。

/home/user/work/
-- css
`-- style.css
-- image
`-- pic.gif
`-- index.html

通常の同期

普通に同期を行う場合は以下のようなコマンド書式になります。

rsync -az 同期元ディレクトリ 同期先ディレクトリ
  • a : アーカイブモード
  • z : データ転送時に圧縮を行う

実際にコマンドは以下のようになります。

$ rsync -az /home/user/work/ /home/user/backup/

通常の同期(転送情報を表示したい場合)

「どんなファイルが転送されたのか?」等の転送時の情報を表示したい場合は「v」オプションを指定します。
コマンド書式は以下のような形になります。

rsync -avz 同期元ディレクトリ 同期先ディレクトリ
  • v : コピーしたバイト数などの転送情報を表示するオプション

実際に「v」を指定した場合のコマンド&出力は以下のようになります。

$ rsync -avz /home/user/work/ /home/user/backup/
building file list ... done
./
index.html
css/
css/style.css
image/
image/pic.gif

sent 337 bytes  received 104 bytes  882.00 bytes/sec
total size is 22  speedup is 0.05

「v」オプションは最大で3個付けることができます。「v」より「vv」はより詳細に、「vv」より「vvv」は更に詳細な情報を表示してくれます。
※「vvv」と「vvv」の例は長くなるので省略します。

同期元で削除されたファイルを同期先でも削除する(全く同じ構造にする)

複数台のWEBサーバーで稼働しているシステム等では、削除したファイル等も含めディレクトリの内容を全く同じに同期したい場合があります。
そういう場合は「--delete」を使用します。
コマンド書式は以下のような形になります。

rsync -avz --delete 同期元ディレクトリ 同期先ディレクトリ
  • --delete : 同期元で削除されたファイルを同期先でも削除する

実際に「--delete」を指定した場合のコマンド&出力は以下のようになります。
今回は同期元から「cssディレクトリ」が削除されたケースで試してみました。

同期前のディレクトリの状態
$ tree work
work
|-- image
|   `-- pic.gif
`-- index.html

1 directory, 2 files
$
$ tree backup/
backup/
|-- css
|   `-- style.css
|-- image
|   `-- pic.gif
`-- index.html

2 directories, 3 files
「--delete」無しで同期してみる

rsync実行後もbackup/には「css/」「css/style.css」が残ったままになっています。

$ rsync -avz /home/user/work/ /home/user/backup/
building file list ... done

sent 136 bytes  received 20 bytes  312.00 bytes/sec
total size is 17  speedup is 0.11
$
$ tree backup/
backup/
|-- css
|   `-- style.css
|-- image
|   `-- pic.gif
`-- index.html

2 directories, 3 files
「--delete」有りで同期してみる

rsync実行時に「deleting css/style.css」のようにファイルを削除しています。
rsync実行後にbackup/から「css/」「css/style.css」が削除されています。

$ rsync -avz --delete /home/user/work/ /home/user/backup/
building file list ... done
deleting css/style.css
deleting css/
./

sent 142 bytes  received 26 bytes  336.00 bytes/sec
total size is 17  speedup is 0.10
$
$ tree backup/
backup/
|-- image
|   `-- pic.gif
`-- index.html

1 directory, 2 files

特定のファイルだけを同期させる

特定のファイル名や特定の拡張子(*.htmlなど)だけを同期させたい場合には、「--include」「--exclude」を指定します。
コマンド書式は以下のような形になります。

rsync -avz --include '同期対象のファイル名' --exclude '同期対象外のファイル名' 同期元ディレクトリ 同期先ディレクトリ
  • --include:同期対象のファイル名を指定する(ワイルドカードでの指定可)
  • --exclude:同期対象外のファイル名を指定する(ワイルドカードでの指定可)

実際に「--include」「--exclude」を指定した場合のコマンド&出力は以下のようになります。
今回は、全てのディレクトリとhtmlファイルとcssファイルだけを同期の対象としています。
ここで重要なのは「--exclude '*'」です。これは「全てのファイルを同期対象外とする」という意味になります。
「--exclude '*'」を指定しない場合、いくら「--include '*.html'」のように同期対象のファイルを指定しても全てのファイルが同期されてしまいます。
逆に同期対象外のファイルを指定したい場合は「--exclude '*.gif'」と書けばOKです。

つまり整理すると、

  • 特定のファイルだけを同期させたい(ホワイトリスト方式) : 「--include '同期対象のファイル名' --exclude '*'」
  • 特定のファイルだけを対象外にしたい(ブラックリスト方式) : 「--exclude '同期対象外のファイル名'」

という形になります。

実際に「--include」「--exclude」を指定した場合のコマンド&出力は以下のようになります。

特定のファイルだけを同期させる(ホワイトリスト方式)
$ rsync -avz --include '*/' --include '*.html' --include '*.css' --exclude '*' /home/user/work/ /home/user/backup/
building file list ... done
./
index.html
css/
css/style.css
image/

sent 255 bytes  received 82 bytes  674.00 bytes/sec
total size is 18  speedup is 0.05
特定のファイルだけを対象外にして同期する(ブラックリスト方式)
$ rsync -avz --exclude '*.gif' /home/user/work/ /home/user/backup/
building file list ... done
./
index.html
css/
css/style.css
image/

sent 255 bytes  received 82 bytes  674.00 bytes/sec
total size is 18  speedup is 0.05

SSH経由での同期

同期元と同期先が別サーバーの場合は、SSH経由での同期を行う事ができます。
コマンド書式は以下のような形になります。

rsync -av -e ssh 同期元ディレクトリ ユーザー名@同期先ホスト名:同期先ディレクトリ
  • -e ssh : SSH経由で別サーバーに同期する

実際にコマンドは以下のようになります。

$ rsync -av --delete -e ssh /home/user/work/ username@remotehost:/home/user/backup/
username@remotehost's password:
building file list ... done
./
index.html
css/
css/style.css
image/
image/pic.gif

sent 338 bytes  received 104 bytes  176.80 bytes/sec
total size is 22  speedup is 0.05

ただこの場合だと毎回パスワードの入力を求められるため、cron等での自動実行ができません。

自動実行を行う場合は、SSHの鍵認証等を利用して実現します。
パスワード無しの認証鍵の生成方法を以下に記載します。
詳しくはこちらのページが参考になります。

rsyncとsshで別のマシンにバックアップ

パスワード無しの認証鍵の生成方法

同期元ホストでの作業

$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):
Enter passphrase (empty for no passphrase): #何も入力せずにEnter
Enter same passphrase again: #何も入力せずにEnter
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
12:34:56:78:90:ab:cd:ef:fh:ij:kl:mn:op:qr:st:uv username@remotehost
$ scp /home/user/.ssh/id_rsa.pub username@remotehost:/home/user/.ssh/

同期先ホストでの作業

$ cat /home/user/.ssh/id_rsa.pub >> /home/user/.ssh/authorized_keys

今回参考にしたページ

UNIXの部屋 コマンド検索 rsync ( BSD Linux)
http://x68000.q-e-d.net/~68user/unix/pickup?rsync

rsyncsshで別のマシンにバックアップ
http://www.jitaku-server.net/backup_ssh.html

rsync
http://www.infoscience.co.jp/technical/rsync/rsync.html

rsync+ssh+cron
http://emperor.yz.yamagata-u.ac.jp/~takayama/manu_dir/rsync+ssh+cron.html

rsyncコマンド - 管理者必見! ネットワーク・コマンド集:ITpro
http://itpro.nikkeibp.co.jp/article/COLUMN/20070822/280151/