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