ここでのバックアップ設定は、LS-HGLのroot取得ができていることを前提に実施する。
root取得についてはこちらを参照。
ここでの設定を行うことで、1日1回、自動でUSBディスクにバックアップが作成されるようになる。(差分のミラーリング)
もしメインのハードディスクが故障した場合、USBディスクを抜き出してメインと差し替えるだけで、他は何も設定することなく起動し、そのまま利用可能となる。もちろんデータは昨日のバックアップまでの状態となる。
◆用意するもの
・本体と同容量のUSBハードディスク
◆手順
1.クローンの作成
2.バックアップパーティションのマウント
3.バックアップ設定
4.バックアップ自動実行の設定
5.USBドライブ死活監視
6.トラブル時のリストア
●クローンの作成
・USBディスクを接続。
・自動でUSBドライブの先頭パーティションが/mnt/usbdisk1にマウントされるのでumountする。
# umount /mnt/usbdisk1
umountできない場合は、一度再起動してumountする。
・ドライブクローン作成(時間かかるのでBG実行)
# dd if=/dev/sda of=/dev/sdb bs=4096 conv=noerror &
500GBで丸1日以上はかかる。
以上でクローン作成完了。
とりあえずディスクを入れ替えて起動するか確認。
●バックアップパーティションのマウント
データパーティション /dev/sda6 をミラーリングするため、対応するクローンのデータパーティション
/dev/sdb6をマウントする。
・マウントポイントの作成
# mkdir /mnt/bkup
・fstabに以下のエントリーを追加
/dev/sdb6 /mnt/bkup xfs rw 0 0
→ どうやらOS起動時に反映されない模様。なので、
/etc/rc.d/init.d/rcS の最終行に以下を記述(上記fstabは記述のこと)
/bin/mount -a
・マウント
# mount -a
もしエラーが出る場合は、/dev/sdb6をXFSフォーマット。
# mkfs.xfs -f /dev/sdb6
終わったら
# mount -a
dfコマンドにてマウントされていることを確認。
参考
ファイルシステムの確認方法
# file -k -s /dev/sdb6
●バックアップ設定
rsync にて/mnt/disk1/をバックアップさせるためのスクリプトを作成。
以下のバックアップスクリプトを作成。
/etc/cron/cron.d/daily_bkup.sh
ファイル内容
/usr/bin/rsync -a --delete /mnt/disk1/* /mnt/bkup
※rsyncオプションの意味
-t, --times タイムスタンプを維持する
-p, --perms パーミッションを維持する
-o, --owner オーナーを維持する (root のみ)
-g, --group グループを維持する
-r, --recursive ディレクトリで再帰的に実行する
以上全て -a が包含
--delete 送信側に存在しない、受信側にあるファイルを削除。
実行権限を付与。
# chmod +x /etc/cron/cron.d/daily_bkup.sh
実行してみて/mnt/disk1/ と /mnt/bkup/ の内容が同じになるか確認。
●自動実行の設定
cronにてdaily_bkup.shが毎朝5時に実行されるよう登録。
#crontab -e
以下を追加 (毎日5:00に実施)
00 5 * * * /etc/cron/cron.d/daily_bkup.sh
以上で日々の自動バックアップ設定は完了。
●USBドライブの死活監視
日々のバックアップ設定ができていてもディスクの故障に気付かなければ冗長構成の意味が薄れる。
特にバックアップ側は意識してアクセスしないと死活がわからないので、メイン死亡時にバックアップ側はとうの昔に死んでいた、なんてこともあり得るわけで、それではバックアップしている意味がない。
ここでは、USBディスクの死活を定期的に監視し、異常発生時は携帯にメールを飛ばすよう設定を行う。
メインが死亡したときはすぐに気付けないが、メインは比較的気付きやすいのでそこは妥協。
動作は単純で、USB上の特定ファイルの存在を定期的に確認し、もし確認できなかったらUSBにトラブルが発生したと判断する。
存在確認用ファイルを作成。
# touch /mnt/bkup/LIVING_USB.FLG
死活監視スクリプトを作成。
/etc/cron/cron.d/USB_heartbeat_checker.sh
ファイル内容
#!/bin/sh
CMD="/usr/bin/tmail"
FLGFILE="/mnt/bkup/LIVING_USB.FLG"
SENDFLG="/tmp/USBHDD_DEAD.FLG"
SMTP="smtp_server" ← smtp 環境に合わせて設定
MAILTO="send_mail_address2" ← 送信先メールアドレス1 環境に合わせて設定
CC="send_mail_address2" ← 送信先メールアドレス2 環境に合わせて設定
FROMADD="from_mail_address" ← 送信元メールアドレス なんでもいい
SUBJECT="USB_Trouble"
FROM="USB_Watcher"
MSG="nantekottai! /(^o^)/"
if [ ! -f $FLGFILE ];
then
if [ ! -f $SENDFLG ];
then
echo $MSG | $CMD -s $SMTP -t $CC -f $FROMADD -sub $SUBJECT -h $FROM -c UTF-8 -b 8
sleep 60
echo $MSG | $CMD -s $SMTP -t $MAILTO -f $FROMADD -sub $SUBJECT -h $FROM -c UTF-8 -b 8
touch $SENDFLG
chmod a+w $SENDFLG
fi
else
rm $SENDFLG
fi
スクリプトの動作概要
/mnt/bkup/LIVING_USB.FLG の存在を確認し、存在すれば終了。
存在しない場合、指定のメールアドレス2つに通知。1度通知した後は送信済みフラグにより復旧するまでメールの発出は行わない。復旧すると送信済みフラグは削除され、元の監視状態に戻る。
動作確認は /mnt/bkup/LIVING_USB.FLGを削除かリネームで。
cronにて10分ごとに実行されるよう登録
#crontab -e
以下を追加
0,10,20,30,40,50 * * * * /etc/cron/cron.d/USB_heartbeat_checker.sh
以上で全て完了。
●トラブル時のリストア
◆メインが壊れた場合
USBHDDを本体内にセットして起動。
以上で完了。
新しいUSBディスクが用意できたら以下「新しいUSBディスクの接続」を参照。
◆USBディスクが壊れた場合
そのままメインだけで運用可能。
新しいUSBディスクが用意できたら、以下「新しいUSBディスクの接続」を参照。
◆新しいUSBディスクの接続
同容量の新しいHDDを用意し、USB接続。あとは手順1のクローン作成で完了。
念のため、作業前にdaily_bkup.sh のcronを一時的に無効化しておいたほうがいいかもしれない。
※クローン作成に時間がかかるため。
完了後、もしdaily_bkup.sh を無効化していた場合は、daily_bkup.sh のcronを有効化を忘れずに。
バックアップ側もdaily_bkup.sh が無効状態なので、ディスク入替動作確認時にでも有効にしておく。
もちろんシステムパーティションのみミラーリングを行うのでもOK。
●その他 参考情報
◆Windowsからsambaマウントした時にバックアップも参照したい場合、Windowsから見えるフォルダは/mnt/disk1/ 配下のみのため、/mnt/bkupは見えない。
というわけで、/mnt/disk1/に/mnt/bkupのシンボリックリンクを作成する。
まずは通常通り(謹製WebGUIより)共有フォルダを追加。
フォルダ名 backup
readonly属性にすることを忘れずに。
/mnt/disk1/backup が作成される。
上記フォルダを/mnt/bkup のシンボリックリンクへ変更。
# rm /mnt/disk1/backup
# ln -s /mnt/bkup /mnt/disk1/backup
以上でバックアップフォルダもreadonlyで参照可能となった。
ちなみに /etc/samba/smb.confを直接編集すればこんなややこしいことしなくてもよさそうだが、編集してもsamba再起動するとなぜか元に戻される。
どうやら/etc/melco配下にbuffalo仕様のカスタマイズ項目があり、ここのものが反映されるようだ。
ここを直接いじればいけそうな気もしたが、危険そうだったのでパス。
◆デフォルト動作でマウントされる/mnt/usbdisk1 を
非公開にしたいUSBHDDを接続した状態で再起動すると、
/dev/sdb1 が /mnt/usbdisk1 にマウントされる。
このままでも特に問題はないが、公開フォルダとして見えてしまうので、謹製GUIよりreadonly設定か、非公開設定にするとよい。
◆時々のシステムミラーリング
システムパーティションに何か変更を加えた場合、システムパーティションだけをミラーリングする。
ミラーリング前に /mnt/usbdisk1 をumountしておく。
# umount /mnt/usbdisk1
システムのミラーリング
# dd if=/dev/sda1 of=/dev/sdb1 bs=4096 conv=noerror
# dd if=/dev/sda2 of=/dev/sdb2 bs=4096 conv=noerror
システムに変更を加えた場合は実行するようにしている。
時間はそんなにかからないので毎日cronで実行してもよいかもしれない。