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