rsyncの簡単な使い方いろいろ
最近rsyncを使う機会があったので、備忘録として書いておきます。
rsyncとは?
rsync は、ファイル・ディレクトリのバックアップやミラーリングを行うコマンドである。ミラーリングやバックアップを行うだけなら cp コマンドでも実現可能だが、rsync コマンドには以下のようなメリットがある。
UNIXの部屋rsyncより
ミラーリングが可能 (単純な cp だと、削除されたファイルがコピー先に残ってしまう)
リモートマシンへ/リモートマシンからのバックアップが可能
2回目以降の実行では、前回実行時との差分を調べ、必要なファイルのみ転送するため高速である
つまりはディレクトリの同期を行うためのコマンドになります。
同期元のディレクトリ構造
今回同期を行うディレクトリ構造は以下のような形のものを使用します。
/home/user/work/
-- css |
`-- style.css |
-- image |
`-- pic.gif |
通常の同期
普通に同期を行う場合は以下のようなコマンド書式になります。
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の鍵認証等を利用して実現します。
パスワード無しの認証鍵の生成方法を以下に記載します。
詳しくはこちらのページが参考になります。
パスワード無しの認証鍵の生成方法
同期元ホストでの作業
$ 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
rsyncとsshで別のマシンにバックアップ
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/