rsync を使ってローカルのファイルをバックアップしよう

最近勘違いしていたことが多くて困り気味です・・・。rsync ってローカルのバックアップにも使えるんですね。「r」というからにはリモートマシンとローカルのデータを同期させるかと思ってました。
rsyc は差分バックアップできるので、全てをコピーするより時間がかからず、バックアップ方法としては定石かなと思います。サーバのデータバックアップとかにも使われるし。
というわけで、rsync を使って、ローカルのファイルのバックアップをとる方法を書いてみます。

ローカルのデータをrsync で定期的にバックアップするようにする

1. バックアップ用のディレクトリつくる

$ mkdir -p ~/backup/daily

2. シェルスクリプトを作成

バックアップ対象のファイルはスクリプト内に書くのではなく、別ファイルで管理するようにする。

  • backup
#!/bin/sh                                                                       
# backup files written in $HOME/backup_list.txt to $HOME/backup/daily/

RSYNC=`which rsync`
BACKUP_LIST=$HOME/etc/backup_list.txt
BACKUP_DIR=$HOME/backup/daily

echo "start backup... [`date`]" >> ${BACKUP_DIR}/history.txt

for TARGET in `cat ${BACKUP_LIST} | grep -v ^#` ; do
 ${RSYNC} -aR --delete ${TARGET} ${BACKUP_DIR}
done


rsync でよく使うオプションの意味は以下のような感じ。

  • -a: ファイル元の情報を保ったままコピー
  • -R: ファイルの絶対パス通りにバックアップ
    • 「/User/luke/hoge.txt」を-R オプションでバックアップすると、「~/backup/dairy/User/luke/hoge.txt」となる
  • --delete: バックアップ元にないファイルを削除する
  • -z 転送中にファイルを圧縮する


実行権限を付与。

$ chmod 755 ~/bin/backup

3. バックアップ対象ファイル/ディレクトリを設定

バックアップ対象のファイルは、行単位で設定ファイルに書く。

  • ~/etc/backup_list.txt

/Users/lukesilvia/.crontab
/Users/lukesilvia/.emacs.el
/Users/lukesilvia/.screenrc
/Users/lukesilvia/etc

4. スクリプトが動作するかテスト
$ ~/bin/backup
$ ls -al ~/backup/daiy
$ ls -al ~/backup/daily                   
total 8
drwxr-xr-x  4 luke  staff  136 10  8 00:07 .
drwxr-xr-x  3 luke  staff  102 10  8 00:02 ..
drwxr-xr-x  3 luke  admin  102 11 14  2007 Users
-rw-r--r--  1 luke  staff  67  10  8 00:59 history.txt
$ cat ~/backup/daily/history.txt
start backup... [2008年 10月 8日 水曜日 00時59分18秒 JST]


バックアップ履歴が記録され、きちんとUsers ディレクトリが作成されています。

5. cron に登録し、定期的に実行するようにする

最後に、バックアップスクリプトをcron に登録し、定期的に実行するようにします。

  • 設定ファイル作成

$ emacs ~/.crontab

  • .crontab
SHELL=/bin/sh
LANG=ja_JP.UTF-8
PATH=/Users/luke/TempDeveloper/flex_sdk_3/bin/:/usr/local/mysql/bin/:/opt/local/sbin/:/opt/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin

# jobs
50 21 * * * /Users/luke/bin/backup
  • 設定ファイルの内容をcron に反映

$ crontab ~/.crontab