第28回 「rsync によるディレクトリ間の同期」
LANDISK HACKING DIARY
Since2005/8/17
TOPへ戻る
     INDEX
   
1. rsync によるディレクトリ間の同期
2. rsync with ssh




 
     rsync によるディレクトリ間の同期
 
ここでは、rsync による同期を行ってみることにする。いままでは、cp や tar によるバックアップしか使ったことがなかったが(筆者はこれでも十分だが)、rsync はもっと便利そうなのでようやく使ってみようかという気分になった(おそっ)。このページより前に、「第08回 「dump/restore によるインクリメンタルバックアップ」 というのも作成しているので合わせて見ておくといいかも(?)。同期をとる環境として、ネットワーク越しのマシンにバックアップしてもいいのだが、都合よくLinux が何台もあるわけではないので、USB接続された外付けHDDと同期をとってみることにする。

rsync にはいくつものオプションが装備されている。以下では、使いそうなものをピックアップしてみる。

 -a 可能な限りファイルの情報を保持してコピーする
 -u 更新されたファイルだけをコピーする
 -v 詳細表示
 -z ファイルを圧縮して転送する
 -b 古いファイルのバックアップを作成する
 -e ssh sshでデータを暗号化してコピーする
 --delete 送信元に存在しないファイルを削除する
 --exclude 指定したファイルを除外してコピーする

rsync をインストールする。

landisk:~# apt-get install rsync

バックアップ先のリムーバブルHDDをマウントする。リムーバブルHDDは2つのパーティションに切ってあり、バックアップ先(/dev/sda2)のマウントポイントを、/share/usb2 とする。

landisk:~# mount -t ext2 /dev/sda2 /share/usb2/
landisk:~# mkdir -p /share/usb2/debian/{home,etc,var,usr,sbin,root,share}

/etc ディレクトリを同期するには以下のようにする。/etc ディレクトリを /share/usb1/debian/etc/ にコピーしている。注意点として、bash の場合は末尾の / はあってもなくても同じ意味になるが、rsync の場合は、コピー元ディレクトリ名の末尾には、必ず / を付けておくようにする。そうでないと、バックアップした際に、/etc/etc/ とディレクトリが1階層深くなって保存されてしまう。/var/spool/squid は必要ないので、exclude に指定しておく。

landisk:~# rsync -auvz --delete /etc/ /share/usb2/debian/etc/
landisk:~# rsync -auvz --delete --exclude='spool/squid' /var/ /share/usb2/debian/var/
landisk:~# rsync -auvz --delete /usr/ /share/usb2/debian/usr/
landisk:~# rsync -auvz --delete /root/ /share/usb2/debian/root/

一通り、バックアップに成功したのを確認したら、次にシェルスクリプトを作成する。ネットワーク上のマシンにコピーしているわけではないので、rm -rf /share などと操作ミスをしてしまえば、いくらリムーバブルHDDに保存したとはいえ、ファイルは一瞬のうちに消え去ってしまうので、バックアップが終了したら、Read Only にしておく。

landisk:~# vi /etc/cron.daily/rsync

#!/bin/sh

mount -t ext2 -o,rw,remount /dev/sda2 /share/usb2/

rsync -auvz --delete /etc/ /share/usb2/debian/etc/
rsync -auvz --delete --exclude='spool/squid' /var/ /share/usb2/debian/var/
rsync -auvz --delete /usr/ /share/usb2/debian/usr/
rsync -auvz --delete /root/ /share/usb2/debian/root/
rsync -auvz --delete /sbin/ /share/usb2/debian/sbin/
rsync -auvz --delete /home/ /share/usb2/debian/home/
rsync -auvz --delete /share/iPOD/ /share/usb2/debian/share/iPOD/

mount -t ext2 -o,ro,remount /dev/sda2 /share/usb2/

exit 0;

2回目のバックアップからは更新されたファイルだけを検出し、バックアップを行うようになるのでシステムへの負荷が少なくて済むので大変便利ですね。


 
     rsync with ssh
 
どうせ、rsync について触れたのだから、ssh 経由でリモートマシンと特定のディレクトリを同期してみることにする。リモートマシンにも rsync をインストールしておこう。また、公開鍵、秘密鍵などは既に作成してあるもとして話を進める。また、slogin や scp などがマシン間ですでに行えていることが大前提だ。

以下のコマンド例では、/home/kororo/audio を172.16.50.2 へSSH経由でコピーしている。一見すると、コマンド名こそ違うが、scp コマンドと同じような動作をする。SCP と違う点は、rsync が両ディレクトリ間で同期できるという点だろう。このとき、相手先には、audio ディレクトリが存在しなくても自動で作成される。

landisk:~# rsync -auvvzb -e ssh /home/kororo/audio/ 172.16.50.2:/home/kororo/audio



     参考文献
 
⇒rsync





TOPへ戻る
 
Copyright © KORO All Rights Reserved.