FreeBSD は、バックアップに使うメディアとして、テープなどのストーリームメディアを中心に考えているようなところが見受けられます。ハンドブックの記述でもバックアップに関してはテープが中心になっています。このテープメディアは個人の身の回りから無くなって行っており、なじみのうすいメディアなっています。
このような状況わりに光ディスク系列のメディアや、USBスティック、SD 等へのバックアップの運用例があまり公開されていません。当Webサーバでは、記録メディアの中でも長期保存性や書き換え回数に定評のあるDVD-RAMにバックアップをする様にしましたので、このやり方を説明します。
バックアップは以下の段階を想定しています。
長期保存性や書き込み回数、書き込みの信頼度について申し分のないDVD-RAMを使ってバックアップを行います。
FreeBSDにいて、DVD-RAMは普通のHDDの様に扱えます。この特性を利用して、フルバックアップ用のメディアに関しては、特別な初期化なしにdumpで直接書き込みます。差分バックアップに関しては、スライスを切ることなく全体を一つのボリュームとしてnewfsをかけてしまいます。差分用のメディアは以下のスクリプトで初期化しました。
このスクリプトは、/dvdramをマウントポイントとして想定してます。このスクリプトを走らせる前に、マウントポイントとして、/dvdramをrootから読み書き可能な状態で作成しておきます。また、スクリプトを走らす前にDVD-RAMを入れておきます。当公開Webサーバが使っているスリムタイプスーパマルチDVD(HL-DT-ST DVDRAM GSA-T10N)は、5倍速のDVD-RAMまで対応しているので、5倍速のメディアを使いました。
/dev/acd0は本機の場合IDE に接続された、スリムタイプスーパマルチDVD(HL-DT-ST DVDRAM GSA-T10N)です。
# file formatdvdram #!/bin/sh /sbin/newfs /dev/acd0 /sbin/mount /dev/acd0 /dvdram mkdir /dvdram/mounttest /sbin/umount /dvdram
このスクリプトは初期化後に一旦マウントして、ディスク上にマウント試験用のディレクトリ mounttest を作成しています。何か間違いがあってマウント前の/dvdramの配下に出来てしまうといけないので、スクリプトを走らせた後、完全にアンマウントされたことを確認してから/dvdramの配下には何もないことを確認しておきます。
これを繰り返して、初期化されたディスクを数枚作成しております。
当公開Webサーバの場合は、以下のボリューム構成になっています。
/dev/ad4s1a on / (ufs, local) /dev/ad4s1e on /tmp (ufs, local, soft-updates) /dev/ad4s1f on /usr (ufs, local, soft-updates) /dev/ad4s1d on /var (ufs, local, soft-updates)
この中で、「/tmp」以外の「/」「/usr」「/var」をバックアップの対象とします。
フルバックアップは、dumpコマンドの level0 dumpを使ってあえて手動で全体をバックアップします。手動でバックアップするのは、各ボリュームごとに分割してバックアップしても、一つのボリュームが一つのメディアに収まらずに交換しながら複数のメディアにバックアップしなくてなならない可能性が高いからです。当公開Webサーバの場合は、「/usr」が一枚のDVD-RAMに収まらずに2枚のメディアに渡って、バックアップしてます。
まず、「/」からバックアップします。下記実行の前に、DVD-RAMを入れておきます。フルバックアップはdumpコマンドで直接dumpするので、newfsで初期化していない DVD-RAM でOK。
/sbin/dump -0auLC 32 -f /dev/acd0 /dev/ad4s1a
各項目を説明します。
バックアップできたら、内容を確認します。
/sbin/restore -tf /dev/acd0
確認したら、次のボリュームにバックアップアップを行うために、DVD-RAMディスクに交換します。交換したら「/var」バックアップします。
/sbin/dump -0auLC 32 -f /dev/acd0 /dev/ad4s1d /sbin/restore -tf /dev/acd0
最後に「/usr」バックアップします。
/sbin/dump -0auLC 32 -f /dev/acd0 /dev/ad4s1f /sbin/restore -tf /dev/acd0
以上でフルバックアップは終了です。
以下のスクリプトで、差分バックアップを行います。スクリプトを走らせる前に、初期化したDVD-RAMをドライブに挿入します。
#file backup1system #!/bin/sh /sbin/mount /dev/acd0 /dvdram if [ -d /dvdram/mounttest ] then /bin/df /dvdram /sbin/bsdlabel /dev/ad4s1 > /dvdram/bsdlabel.dat 2>&1 rm /dvdram/dump.root.l1.1 mv /dvdram/dump.root.l1.0 /dvdram/dump.root.l1.1 /sbin/dump -1auLC 32 -f /dvdram/dump.root.l1.0 /dev/ad4s1a rm /dvdram/dump.usr.l1.1 mv /dvdram/dump.usr.l1.0 /dvdram/dump.usr.l1.1 /sbin/dump -1auLC 32 -f /dvdram/dump.usr.l1.0 /dev/ad4s1f rm /dvdram/dump.var.l1.1 mv /dvdram/dump.var.l1.0 /dvdram/dump.var.l1.1 /sbin/dump -1auLC 32 -f /dvdram/dump.var.l1.0 /dev/ad4s1d /sbin/restore -tf /dvdram/dump.root.l1.0 /sbin/restore -tf /dvdram/dump.usr.l1.0 /sbin/restore -tf /dvdram/dump.var.l1.0 /bin/df /dvdram fi /sbin/umount /dvdram
もし、ディスクが入っていないなど、マウントできない状態でバックアップに入ってしまうと、「/」配下にバックアップが作られてしまい、「/」がいっぱいになってしまう可能性があります。このため「if [ -d /dvdram/mounttest ]」でメディアの初期化の時に作成したディレクトリ「mounttest」をチェックしてマウントされたことを確認しています。
dumpは、「-1」オプションでフルダンプからの差分になっています。また、フルバックアップの時と異なり「-f /dvdram/dump.root.l1.0」の形になっており通常のファイルにバックアップする形になっています。出来た差分ファイルは、一つ古い差分を、mv で名前を変えて保存し、差分をカレントとその前の2世代だけ保存する形になっています。
バックアップが終わったら「/sbin/restore -tf /dvdram/dump.var.l1.0」の形でダンプに含まれるファイル名を出力させて、バックアップが失敗していないことを確認しています。また、バックアップ作業前後でdfにより空き容量の減り方を調べられるようにしています。
差分バックアップをcronで自動実行させます。差分バックアップ用のディスクを入れたままにしておきます、先ほどのスクリプトを/root/backup1systemと言うファイル名で、rootが実行できるように保存してあることを前提にしています。
以下の行を/etc/crontabに追加します。
15 6 * * * root /root/backup1system > /var/log/backup1.log 2>&1
毎日06:15に実行して、標準出力もエラー出力も含んだログファイル(/var/log/backup1.log)を作成しています。
(注)Lオプションでスナップショットを作成していますので、スナップショット作成中動作がかなり重くなります。特に/usrは作成に時間がかかるので影響が大きくなります。深夜02時頃も試しましたが当サイトのアクセスが少なくなる前の時間ですので避けることとしました。また、03〜06時頃はシステム系の予定が走るので影響が無いように避けました。06:45分からでは、夏場は室内温度が上昇し始めていますのでもう少し前にして06:15からで落ち着きました。
追加したら、/etc/rc.d/cron restartで設定変更を読み込ませておきます。
この設定の場合、毎日差分バックアップが行われます。時が経つにつれて、フルバックアップとの差分が大きくなっていきます。このためバックアップされる量も大きくなっていきます。当webサーバの場合、DVD-RAMの半分程度に達したり、make buildworld した後には、フルバックアップをし直そうと考えています。
これをもう少したくさんの世代を残しながら効率よくバックアップしていくときには、ただの差分や増分バックアップではなく、ハノイの塔シーケンスと呼ばれる方法で残していく方法が知られています。man dump等にも記述があります。
/var/log/backup1.logの内容を確認して、実行状況を確認しんします。以下のような内容になります。
Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/acd0 4331246 38034 3946714 1% /dvdram
この部分で、実行前の残り容量を把握します。
DUMP: Date of this level 1 dump: Mon Sep 17 19:30:19 2007 DUMP: Date of last level 0 dump: Sun Sep 16 16:58:04 2007 DUMP: Dumping snapshot of /dev/ad4s1a (/) to /dvdram/dump.root.l1.0 DUMP: mapping (Pass I) [regular files] DUMP: Cache 32 MB, blocksize = 65536 DUMP: mapping (Pass II) [directories] DUMP: estimated 143 tape blocks. DUMP: dumping (Pass III) [directories] DUMP: dumping (Pass IV) [regular files] DUMP: DUMP: 118 tape blocks on 1 volume DUMP: finished in less than a second DUMP: level 1 dump on Mon Sep 17 19:30:19 2007 DUMP: Closing /dvdram/dump.root.l1.0 DUMP: DUMP IS DONE
最初に書いてあるdumpの時間を確認します。開始時間、level 0 からどのくらい経過したかも確認しておきます。
DUMP: Date of this level 1 dump: Mon Sep 17 19:36:27 2007 DUMP: Date of last level 0 dump: Sun Sep 16 17:08:19 2007 DUMP: Dumping snapshot of /dev/ad4s1f (/usr) to /dvdram/dump.usr.l1.0 DUMP: mapping (Pass I) [regular files] DUMP: Cache 32 MB, blocksize = 65536 DUMP: mapping (Pass II) [directories] DUMP: estimated 15291 tape blocks. DUMP: dumping (Pass III) [directories] DUMP: dumping (Pass IV) [regular files] DUMP: DUMP: 10847 tape blocks on 1 volume DUMP: finished in 10 seconds, throughput 1084 KBytes/sec DUMP: level 1 dump on Mon Sep 17 19:36:27 2007 DUMP: Closing /dvdram/dump.usr.l1.0 DUMP: DUMP IS DONE
バックアップがある程度の量になると、スループットが表示されます。ドライブやディスクの状態の参考になります。
DUMP: Date of this level 1 dump: Mon Sep 17 19:41:39 2007 DUMP: Date of last level 0 dump: Sun Sep 16 17:00:44 2007 DUMP: Dumping snapshot of /dev/ad4s1d (/var) to /dvdram/dump.var.l1.0 DUMP: mapping (Pass I) [regular files] DUMP: Cache 32 MB, blocksize = 65536 DUMP: mapping (Pass II) [directories] DUMP: estimated 8246 tape blocks. DUMP: dumping (Pass III) [directories] DUMP: dumping (Pass IV) [regular files] DUMP: DUMP: 8118 tape blocks on 1 volume DUMP: finished in 8 seconds, throughput 1014 KBytes/sec DUMP: level 1 dump on Mon Sep 17 19:41:39 2007 DUMP: Closing /dvdram/dump.var.l1.0 DUMP: DUMP IS DONE
ここからバックアップした物のチェックに入ります。
Dump date: Mon Sep 17 19:30:19 2007
Dumped from: Sun Sep 16 16:58:04 2007
Level 1 dump of / on ettcweb0.local:/dev/ad4s1a
Label: none
2 .
3 ./.snap
211968 ./etc
−−−−中略−−−−
235529 ./root/backup1system
最低限バックアップ日時が一致して、読み出せていることは確認しましょう。
Dump date: Mon Sep 17 19:36:27 2007
Dumped from: Sun Sep 16 17:08:19 2007
Level 1 dump of /usr on ettcweb0.local:/dev/ad4s1f
Label: none
2 .
3 ./.snap
7937024 ./local
−−−−中略−−−−
32101405 ./home/ttanaka/formatdvdram
Dump date: Mon Sep 17 19:41:39 2007
Dumped from: Sun Sep 16 17:00:44 2007
Level 1 dump of /var on ettcweb0.local:/dev/ad4s1d
Label: none
2 .
3 ./.snap
47104 ./db
−−−−中略−−−−
353281 ./analog/dnsfile.txt
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/acd0 4331246 38194 3946554 1% /dvdram
ディスクの空きエリアそのものだけでなく、減少具合も確認しておきましょう。
そのうち、ダイジェストを作成してメールで内容が送られてくるようにしたいと思います。
HDDがクラッシュした時の回復手順は以下を想定しています。
しかしこの方式でのリストアの経験がないので自身がありません。一度別の機器にリストアする試験をしてみたいと思います。完全に元に戻せなかったとしても、データとしては保存できているので、内容を確認して再構築していけるのではないかと思っています。