自宅のホームサーバ(NAS)を更新する(5) バックアップの設定

Arch Linuxパソコンを利用して、ファイルサーバ兼DLNAメディアサーバを作成し、既存のNASを置きかえて運用を始めた。その続き。
データのバックアップが自動で行われるように構成していたのだが、その記事は実際にバックアップが機能しているのを確認してから作成しようと思っていたら、大幅に日があいてしまった。

要件

  • 指定したディレクトリ内のファイルを物理的に独立した別HDDにバックアップする。
  • バックアップは週に1回自動で実行される。
  • バックアップは世代管理が行われるが、差分バックアップなどの方法でディスク容量を節約する。

どうやら、rsyncコマンドをsystemdでタイマー実行する、という方法で実現できそうだ。

rsyncコマンド

基本の書式は

rsync [option] SOURCE DEST

optionは、基本的なファイル同期として期待するひととおりの内容が指定できる「-a –delete」と、ログが出力される「-v」と、バックアップ対象外のファイルを指定する「–exclude=’PatternOfNoBackupFiles’」、ハードリンクを使って容量を節約しながら世代管理ができる「–link-dest=/path/to/lastupdate」あたりを知っていれば便利に扱えそうだ。
まとめると、単純にフルバックアップするなら、

rsync -av --delete (--exclude='/path/to/nexclude/files') SOURCE DEST

世代管理を行うなら

rsync -av --delete (--exclude='/path/to/nexclude/files') --link-dest=/path/to/lastupdate SOURCE DEST

となる。

rsyncコマンドを発行するperlスクリプトを作成して管理することにした。
シェルスクリプトでも実現できる機能なのだろうが、perlの方が自分にとって扱いやすい。

#!/usr/bin/perl

my $BackupDest = "/path/to/backupdir";

my($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime(time);
my $newdate = sprintf("%04d_%02d_%02d_%02d_%02d_%02d",$year+1900,$mon+1,$mday,$hour,$min,$sec);

unless(-e "/path/to/lastbackup.txt"){
        open(DATA,">/path/to/lastbackup.txt");
        close(DATA);
}

open(DATA,"+</path/to/lastbackup.txt");
seek(DATA,0,0);
truncate(DATA,0);
print DATA $newdate;
close(DATA);

my $option;
if($lastdate){
        $option = "--link-dest=$BackupDest/$lastdate";
}

`rsync -av --delete $option /path/to/buckupdir1 $BackupDest/$newdate`;
`rsync -av --delete $option --exclude='PatternOfNoBackupFiles' /path/to/buckupdir2 $BackupDest/$newdate`;

systemdでタイマー実行

rsyncコマンドをおさめたスクリプトを実行させる.serviceファイルと、それをタイマーで実行する.timerファイルを作成して、

#systemctl enable [name]

すればよさそうだ。

/etc/systemd/system/[name].service

[Unit]
Description=Backup Data   

[Service]
Type=oneshot
ExecStart=/path/to/backupscript

/etc/systemd/system/[name].timer

[Unit]
Description=Backup Data

[Timer]
OnCalendar=Sat *-*-* 4:00:00
Persistent=false

[Install]
WantedBy=timers.target