rsyncは多機能なコピーツールです。
ローカルディレクトリのコピーはもちろん、ディレクトリ同士の同期や差分コピー、
sshを利用してインターネット越しにフォルダを同期させたりといったことも可能です。
構文: rsync [option] src dest
rsyncは多機能すぎるがゆえに無数のオプションがあります。全部覚えるのは大変なので
とりあえずこれだけ覚えていればおkかもしれないオプションを書いておきます。
例:
dirA(ソース)とdirBを同期
$ rsync -av dirA/ dirB/
圧縮有効でssh越しのリモートホストのディレクトリと同期
$ rsync -avze ssh dirA/ user@remotehost:/dirB/
次に書くオプションがこの記事タイトルのミソです
ローカルディレクトリのコピーはもちろん、ディレクトリ同士の同期や差分コピー、
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からハードリンクを配置する
- 関連記事
-
-
CentOS 7のネットワーク設定/管理 ipコマンド 2014/08/13
-
Virtualbox 4.3.14でLinuxが起動しない 2014/08/13
-
rsyncで世代分け差分バックアップ 2014/08/09
-
UbuntuServerでMumbleサーバーを建てる 2014/07/12
-
Visualbox上で動いてるXubuntuの解像度を変える方法 2014/07/09
-
上記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/