rsyncで世代分け差分バックアップ

/ Linux/Unix / Comment[0]
rsyncは多機能なコピーツールです。
ローカルディレクトリのコピーはもちろん、ディレクトリ同士の同期や差分コピー、
sshを利用してインターネット越しにフォルダを同期させたりといったことも可能です。

構文: rsync [option] src dest


rsyncの主なオプションと使い方


rsyncは多機能すぎるがゆえに無数のオプションがあります。全部覚えるのは大変なので
とりあえずこれだけ覚えていればおkかもしれないオプションを書いておきます。
  • -a アーカイブモード(-rlptgoDのエイリアス)
  • -u 更新されたファイルのみコピー
  • -e シェルを指定
  • -z gzipの圧縮を有効化
  • --delete ソースに存在しないオブジェクトがあったら削除
  • -v 詳細表示
  • --progress 転送速度を表示

例:
dirA(ソース)とdirBを同期
$ rsync -av dirA/ dirB/

圧縮有効でssh越しのリモートホストのディレクトリと同期
$ rsync -avze ssh dirA/ user@remotehost:/dirB/


次に書くオプションがこの記事タイトルのミソです

重複ファイルに対する3つのオプション


--compare-list=DIR
DIRの差分のみをコピーする
--copy-dest=DIR
DIRからコピーして持ってくる
--link-dest=DIR
DIRからハードリンクを配置する

上記3つのオプションが世代ごとの差分バックアップの際に重宝します。
特に--link-destは存在するファイルからハードリンクを張ってくれるのでディスク容量の節約になるとともに、
ハードリンクされたファイルは実質リンク元ファイルと同じモノなのでアクセスと管理ともに容易です。

差分バックアップの例

まずフルバックアップします。
下記コマンドでhomeディレクトリの内容がそっくりそのまま/media/backup/gen1にコピーされます。
$ rsync -av ~/ /media/backup/gen1

次に--link-destオプションを用いた差分バックアップ
$ rsync -av --delete --link-dest=/media/backup/gen1 ~/ /media/backup/gen2
$ rsync -av --delete --link-dest=/media/backup/gen2 ~/ /media/backup/gen3
$ rsync -av --delete --link-dest=/media/backup/gen3 ~/ /media/backup/gen4

rsyncの世代分け差分バックアップを行うシェルスクリプト


書いてみました。

具体的に何をやっているのかというと、
・フルバックアップを行い~/.timemachine.logにログと時刻を書き込み
・上記ファイルからバックアップした時刻を取得
・時刻から前回バックアップしたディレクトリ名を取得し差分バックアップ
そんな感じです。

timemachine.sh
operation_user=`whoami`
log_file="/home/$operation_user/.timemachine.log"
backup_dir="/backup" #末尾のスラッシュは無し
source_dir='/works' #末尾のスラッシュは無し

if test $1; then
chmod +w $log_file
if [ $1 = 'full' ]; then
time=`date +%Y%m%d-%H%M`
rsync -av $source_dir/ $backup_dir/$time | tee -a $log_file
echo $time >> $log_file
elif [ $1 = 'diff' ]; then
time=`date +%Y%m%d-%H%M`
last_backup=`tail -1 $log_file`
rsync -av --delete --link-dest=$backup_dir/$last_backup/ $source_dir/ $backup_dir/$time | tee -a $log_file
echo $time >> $log_file
fi
chmod -w $log_file
else
echo "使い方:\n フルバックアップ(初回):$0 full\n 差分バックアップ(2回目以降):$0 diff"
fi


フルバックアップ
$ sh timemachine.sh full
sending incremental file list
created directory /mnt/20140809-1810
./
aa
o0640049911602025370.jpg
url.jpg
:


差分バックアップ
$ sh timemachine.sh diff
sending incremental file list
created directory /mnt/20140809-1759

sent 1721 bytes received 18 bytes 3478.00 bytes/sec
total size is 1673305670 speedup is 962222.93


2回目の差分バックアップ
$ sh timemachine.sh diff
sending incremental file list
created directory /mnt/20140809-1801

sent 1721 bytes received 18 bytes 3478.00 bytes/sec
total size is 1673305670 speedup is 962222.93


バックアップ先を見てみると差分バックアップされたフォルダが時間ごとに分けられています。
$ ls /mnt
20140809-1724/  20140809-1730/  20140809-1753/  20140809-1756/  20140809-1759/  20140809-1801/
関連記事

コメント

:
:
:
:
:
管理人のみ表示を許可