DVD-RAMを使ったバックアップの運用例

作成
2007/09/16 Sun
公開
2007/09/17 Mon
更新
2007/11/05 Mon

トップへ戻る Tips へ戻る

概要

 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

 各項目を説明します。

-0
Level 0 dumpの指定
a
メディアの終了通知まで書き込む
u
ダンプが成功した後で、dumpdatesファイルを更新
L
ライブファイルシステムをダンプする。スナップショットが作成され、それを利用して dump が行われる
C 32
キャッシュサイズを 32Mbyte に指定。32Mbyteは推薦キャッシュサイズの上限
-f /dev/acd0
/dev/acd0にダンプを作成する。これは、当公開WebサーバではスリムタイプスーパマルチDVD(HL-DT-ST DVDRAM GSA-T10N)
/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がクラッシュした時の回復手順は以下を想定しています。

  1. 6.2-RELEASEのDIKS2(fixit ディスク)DISK1を用意しておく
  2. 6.2-RELEASEのDIKS2(fixit ディスク)DISK1で立ち上げる
  3. fdiskで切り分ける
  4. bsdlabelで切り分ける。このために、パーティションのサイズを記録しておく必要がある。bsdlabel.datの形で保存している。
  5. 各パーティションのnewfsをかける
  6. 通常の最小のインストールをしてしまう。この時、インストーラーを使ってfdisk、ラベル書き込み、newfsをかけてしまう。このために、パーティションのサイズを記録しておく必要がある。bsdlabel.datの形で保存している。
  7. すべてのボリュームをリストアする

 しかしこの方式でのリストアの経験がないので自身がありません。一度別の機器にリストアする試験をしてみたいと思います。完全に元に戻せなかったとしても、データとしては保存できているので、内容を確認して再構築していけるのではないかと思っています。


トップへ戻る Tips へ戻る