nDiki

2014年6月23日 (月)

rsync --link-dest でスナップショットをとる

バックアップには pdumpfs をずっと使い続けているけど、メンテナンスもされていないので、ぼちぼち rsync --link-dest を使ったバックアップにしようかと。

rsync は --link-dest で前の同期ディレクトリを指定するとそちらに同一のファイルがある場合はそのファイルへのハードリンクにする形に同期してくれるので、無駄なくスナップショットをとれる。ただ --link-dest は自分で明示的に指定する必要があり面倒なのでなんらかしらスクリプトを作る必要がある。

今のところ決定版みたいなのが見つかっていないので、とりあえず用に書いた。ローカル-ローカル専用。

 #!/usr/bin/perl

 use warnings;
 use strict;
 use File::Spec;
 use File::Path;

 my ($sec, $min, $hour, $mday, $mon, $year) = localtime(time);
 $year += 1900;
 $mon++;

 my $backup_root_dir = '/mnt/backup';
 my $source_abs_dir  = '/home/naney';

 my $i          = 1;
 my $backup_dir = sprintf("%04d-%02d-%02d-%02d%02d%02d",
   $year, $mon, $mday, $hour, $min, $sec);

 my $backup_abs_dir = File::Spec->catfile($backup_root_dir, $backup_dir);
 exit 1 if -e $backup_abs_dir;

 opendir(my $dh, $backup_root_dir) or die;
 my @old_backup_dirs = reverse sort { $a cmp $b }
   grep { /^\d{4}-\d{2}-\d{2}-\d{2}\d{2}\d{2}$/ } readdir $dh;
 closedir $dh;

 my $link_dest_dir;

 for my $old_backup_dir (@old_backup_dirs) {
   exit 1 if $old_backup_dir eq $backup_dir;
   next   if (($old_backup_dir cmp $backup_dir) > 0);
   $link_dest_dir = $old_backup_dir;
   last;
 }

 File::Path::make_path($backup_abs_dir);
 exit unless -d $backup_abs_dir;

 my $command;
 if ($link_dest_dir) {
   $command
     = "rsync -av --delete --link-dest=../$link_dest_dir $source_abs_dir $backup_abs_dir";
 }
 else {
   $command = "rsync -av --delete $source_abs_dir $backup_abs_dir";
 }

 system($command);
スポンサード リンク
[ 6月23日全て ]

About Me

Naney Naney (なにい)です。株式会社ミクシィで SNS 事業の部長をしています。

nDiki1999年1月に始めたコンピュータ日誌を前身とする NaneyWeb 日記(兼パーソナルナレッジベース)です。ちょっとしたノートは nNote にあります。

※内容は個人的見解であり所属組織とは関係ありません。

月別インデックス
Process Time: 0.222835s / load averages: 0.40, 0.48, 0.65
nDiki by WATANABE Yoshimasa (Naney)
Powered by DiKicker