ラズベリーパイNASでrsyncを利用して差分バックアップを取得する

どうも、Tです。

ラズベリーパイでNASを作成しましたが、バックアップの部分を作れていなかったので、rsyncを利用して作ってみます。

Raspberry Piで家庭用NAS(Sambaサーバー)を作る
どうも、Tです。 先日ラズパイをインストールしました。引き続きNASとして使えるように、設定していきます。 やりたい...

また、可能な限り簡単に差分バックアップを行えるように作成しました。

やりたいこと

全体像

  1. バックアップ用としてMain HDDの内容を1日1回Backup HDDにrsyncで同期する。
  2. スクリプトは面倒なので書かない。
  3. 差分バックアップを行えるようにする。
  4. cronを利用して曜日単位で1日1回動作する。
  5. バックアップ処理の重複はしないようにする。

rsyncを使った差分バックアップの考え方

日曜日フルバックアップ

rsync -a --delete /mnt/samba/main/ /mnt/samba/backup/00_sun/

最初のフルバックアップは、00_sunフォルダにrsyncで取得します。

–deleteオプションを付けて、Main HDDにないものは00_sunフォルダからも自動で削除します。

月曜日差分バックアップ

rsync -a --link-dest=/mnt/samba/backup/00_sun/ /mnt/samba/main/ /mnt/samba/backup/01_mon/

–link-destオプションを使うことにより差分取得が可能です。書式は下記になります。

rsync -a –link-dest=${基準にするディレクトリ} ${バックアップ元} ${バックアップ先}

MainHDD(バックアップ元)と00_sunフォルダ内(基準にするディレクトリ)を比較し、異なっているファイルを01_mon(バックアップ先)にコピーします。

この際に、00_sunにある差分のないファイルについては、01_monにハードリンクとして作成されるため高速にコピーし、ファイル容量の増加も差分ファイルのみになります。

火曜日差分バックアップ

rsync -a --link-dest=/mnt/samba/backup/01_mon/ /mnt/samba/main/ /mnt/samba/backup/02_tue/

月曜日と同じ動きです。

MainHDD(バックアップ元)と01_monフォルダ内(基準にするディレクトリ)を比較し、異なっているファイルを02_tue(バックアップ先)にコピーします。

01_monフォルダには、日曜日との差分ファイルと、差分がないものは日曜日のハードリンクがあるため、月曜日からの差分ファイルのみコピーでバックアップ取得ができます。

以後、土曜日まで同じように–link-destオプションを使用して前曜日のフォルダと比較することにより差分バックアップが取得できるようになります。

環境

  • 機器:Raspberry Pi3 Model B
  • OS:Raspbian GNU/Linux 10 (buster)

方法

バックアップ用フォルダ作成

バックアップ用のHDDの配下に曜日がわかるようなフォルダ名を作成しておきます。

先頭の番号は昇順に並ぶようにとcronの曜日指定(0:日、1:月、2:火、3:水、4:木、5:金、6:土、7:日)に対応するように付けました。

pi@raspberrypi:/mnt/samba/backup $ sudo mkdir -p /mnt/samba/backup/00_sun

pi@raspberrypi:/mnt/samba/backup $ sudo mkdir -p /mnt/samba/backup/01_mon

pi@raspberrypi:/mnt/samba/backup $ sudo mkdir -p /mnt/samba/backup/02_tue

pi@raspberrypi:/mnt/samba/backup $ sudo mkdir -p /mnt/samba/backup/03_wed

pi@raspberrypi:/mnt/samba/backup $ sudo mkdir -p /mnt/samba/backup/04_thu

pi@raspberrypi:/mnt/samba/backup $ sudo mkdir -p /mnt/samba/backup/05_fri

pi@raspberrypi:/mnt/samba/backup $ sudo mkdir -p /mnt/samba/backup/06_sat

cron設定

cronでrsyncを実施するようにします。

–deleteオプションは日曜日のフルバックアップ時のみ行い、後の曜日は、–link-destで差分バックアップを行います。

pidofオプションでrsyncの二重処理が走らないようにしています。

#分 時 日 月 曜日(0→日曜日) コマンド
#pidofはプロセスが1つ以上存在する場合:0、存在しない場合:1をリターン
#||は、左辺が0以外なら右辺を実行

###rsyncの--link-destの使い方###
#rsync -a --link-dest=${基準にするディレクトリ} ${バックアップ元} ${バックアップ先}

#日曜日_フルバックアップ
0 22 * * 0 /bin/pidof -x rsync > /dev/null || rsync -a --delete /mnt/samba/main/ /mnt/samba/backup/00_sun/

#月曜日_差分バックアップ
0 22 * * 1 /bin/pidof -x rsync > /dev/null || rsync -a --link-dest=/mnt/samba/backup/00_sun/ /mnt/samba/main/ /mnt/samba/backup/01_mon/

#火曜日_差分バックアップ
0 22 * * 2 /bin/pidof -x rsync > /dev/null || rsync -a --link-dest=/mnt/samba/backup/01_mon/ /mnt/samba/main/ /mnt/samba/backup/02_tue/

#水曜日_差分バックアップ
0 22 * * 3 /bin/pidof -x rsync > /dev/null || rsync -a --link-dest=/mnt/samba/backup/02_tue/ /mnt/samba/main/ /mnt/samba/backup/03_wed/

#木曜日_差分バックアップ
0 22 * * 4 /bin/pidof -x rsync > /dev/null || rsync -a --link-dest=/mnt/samba/backup/03_wed/ /mnt/samba/main/ /mnt/samba/backup/04_thu/

#金曜日_差分バックアップ
0 22 * * 5 /bin/pidof -x rsync > /dev/null || rsync -a --link-dest=/mnt/samba/backup/04_thu/ /mnt/samba/main/ /mnt/samba/backup/05_fri/

#土曜日_差分バックアップ
0 22 * * 6 /bin/pidof -x rsync > /dev/null || rsync -a --link-dest=/mnt/samba/backup/05_fri/ /mnt/samba/main/ /mnt/samba/backup/06_sat/

バックアップ用フォルダsamba共有設定

バックアップ領域のファイルをすぐに復元できるようにReadOnlyで参照のみできるようにしておきます。

pi@raspberrypi:~ $ sudo vi /etc/samba/smb.conf

[backup]
#コメント・説明
comment = バックアップ領域
#共有先パス
path = /mnt/samba/backup

#書き込み可否
read only = yes

#共有一覧への表示
browseable = no

#許可ユーザー
valid user = @myhome

smbdを再起動して設定を有効化します。

pi@raspberrypi:~ $ systemctl restart smbd

参考

rsyncの–link-destでの差分バックアップ | なうびるどいんぐ
自分の管理運営する各種サーバのバックアップスクリプトを見直していた時、rsyncに「--link-dest」なるオプションがあるのに気付いたこのオプションを使えば指定したディレクトリを基準に差分バックアップを取る事ができ、高速化/省スペース化が望めそうだったので試してみました
https://open-groove.net/linux-command/rsync-link-dest/
[一番簡単かも]cron起動プロセスの多重起動防止ワンライナー - Qiita
よくこんな感じで1分おきにジョブを流したい場合があると思う。* * * * * /path/to/your/cron_job.shところがこのcron_job.shが1分以内に処理が終わらない場…
http://www.meguroman.com/cron_multiple_run_protection/

このバックアップ方法の欠点

簡単に作ったので色々問題点が残っています。今後改善できるように備忘録です。

問題点1:cronが失敗しても気づけない

解決策1:失敗したらメール飛ばすようにする

問題点2:どのファイルがコピーされているかわらない

解決策2:rsyncのログを出力させる

問題点3:1つのrsyncが24時間以上かかると次のrsync(差分バックアップ)がスキップされる

解決策3:cronで10分単位とかで繰り返し行うようにする※でも曜日ごとの調整が面倒・・・。

問題点4:ポイントセット(世代管理)が行えない。

解決策4:1週間分のセットをフォルダセットとして持てば可能だけど、面倒・・・・。

まとめ

ちゃんと取れてますように。あとバックアップ用HDDの容量少ないから買い足したい・・・。