実家で運用している Raspberry Pi で構成される汎用サーバー群に、先日不具合が発生しました。結局、システムの入った SD カードを取り外し、PCから中身をチェックして設定ファイルをいくつか修正して復帰させましたが、この時、定期的なシステムの バックアップ の必要性を感じた次第です。
今回は上記ダイヤグラムの日本サイトにある2つのRaspberry PiのシステムSDイメージを、ファイルサーバのストレージに使用しているUSBストレージへ出力する作業を考えます(上図中、dd RAWと記載されている2本の遷移)。
ddして圧縮してそれを保存するなり、ssh介して保存するというのが大まかな流れ、それをワンライナーで実現したいと調べてみると、やはり同じことを考える方はいらっしゃいます。
home Pi 2の場合、USBストレージはローカルですので、
1 |
sudo dd if=/dev/mmcblk0 | pv | gzip -6 -c > /mnt/md0/backup/$HOSTNAME.img.gz |
pvはパイプの進捗を表示してくれる便利なツールで、検証用に挟んでいます。
gzipの圧縮率と速度の相対関係については、こちらの検証記事を参考にしました。
二つの異なる圧縮率で実験を行い、掛かった時間と生成されたバックアップファイルのサイズを比較してみます。
圧縮レベル 1: 18分 / 916MB
圧縮レベル 6: 31分 / 811MB (デフォルトレベル)
次にhome Pi 3の場合、圧縮後の出力先はssh先であるhome Pi 2になります。
1 |
sudo dd if=/dev/mmcblk0 | pv | gzip -6 | ssh pi@homepi2.local dd of=/mnt/md0/backup/$HOSTNAME.img.gz |
こちらでも同様の条件で実験してみます。
圧縮レベル 1: 19分 / 1451MB
圧縮レベル 6: 25分 / 1157MB (デフォルトレベル)
ネットワークを介することが、ボトルネックになっていないのは意外です。
尚、home Pi 3の方がシステムサイズが大きいのは、運用期間が1年多いことや、搭載サービスが多いためです。
いずれも夜間の定期作業には充分ですので、ここは圧縮率優先でスケジューラへ登録です。ブロックデバイスを扱うので実行者はroot権限で。
1 2 3 4 5 |
# home Pi 2 dd if=/dev/mmcblk0 | gzip -6 -c > /mnt/md0/backup/$HOSTNAME.img.gz # home Pi 3 dd if=/dev/mmcblk0 | gzip -6 | ssh pi@homepi2.local dd of=/mnt/md0/backup/$HOSTNAME.img.gz |
home Pi 2のUSBストレージ上に置いておけば、別のタスクでhome Pi 3のバックアップ用USBストレージや、香港サイトにあるNASへ複製されるので安心というわけです(→複製タスクを走らせる前のRAID健康チェックについての記事はこちら)。
home Pi 2ファイルサーバのRAID10構成なUSBストレージについてはまた別の機会に紹介したいと思います(→障害復旧の顛末記はこちら)。