(57)【要約】【課題】元のボリュームのブロック配置に影響を与えず、少ない記憶装置の追加で、複数のスナップショットを任意の時点で採取、維持、削除可能にする。【解決手段】スナップショット（ＳＳ）は、運用ボリュームの更新が行われた個所の元データと、更新されていない個所のデータを組み合わせて実現し、運用ボリュームのブロック対応に、ＳＳ毎に更新が行われていない事を示す値と元データの格納場所を示す値を備えるスナップショット管理テーブル２１１を維持する。更新時には、更新個所で更新が行われていないＳＳがあれば、元データをコピーし、スナップショット管理テーブル２１１を更新する。コピーした元データは、ＳＳ毎に参照していることを示す値を備える差分ブロック管理テーブル２１２で管理する。ＳＳが削除されると、差分ブロック管理テーブルの全エントリから当該ＳＳが参照していることを示す値をクリアする。【選択図】                図５
2004342050.tif 000002
【特許請求の範囲】
【請求項１】
一つ以上のＣＰＵと、メモリと、一つ以上のネットワークＩ／Ｆと、一つ以上のストレージＩ／Ｆを備え、該ストレージＩ／Ｆに一つ以上のディスク装置を接続したサーバ装置における複数のスナップショット維持方法であって、
通常の読み書きを行う運用ボリュームへの読み書きと、複数の仮想ボリュームの各ブロックに対するスナップショットの読み書きとして前記仮想ボリュームのブロックと同じアドレス値の差分ボリュームのブロックにスナップショットの差分データの読み書きを行い、
前記運用ボリュームの各ブロック対応に、前記複数の仮想ボリューム毎のスナップショットを格納したブロックのアドレス値またはスナップショット格納なしを示す情報と、前記複数の仮想ボリューム毎のスナップショット格納の有無を示す値を配した第１のテーブルを生成し、前記一つ以上のクライアントに対してスナップショットを読み書き可能にすることを特徴とする複数のスナップショット維持方法。
【請求項２】
請求項１記載の複数のスナップショット維持方法において、
前記各スナップショットの差分データの格納先の前記差分ボリュームの各ブロックに対応して、前記複数の仮想ボリューム毎のスナップショット格納の有無を示す値を有する第２のテーブルを生成することを特徴とする複数のスナップショット維持方法。
【請求項３】
請求項２記載の複数のスナップショット維持方法において、
前記仮想ボリュームにスナップショットを書き込むとき、前記第１のテーブルを参照し、更新される運用ボリュームのブロックに対応する書き込み対象の仮想ボリュームにスナップショットを格納したブロックのアドレス値が格納されている場合、同じ運用ボリュームのブロックに対応する他の仮想ボリュームにもスナップショットを格納したブロックのアドレス値が格納されているか否か判定することを特徴とする複数のスナップショット維持方法。
【請求項４】
請求項３記載の複数のスナップショット維持方法において、
前記判定の結果、他の仮想ボリュームにもスナップショットを格納したブロックのアドレス値が格納されている場合には、前記差分ボリュームの新たなブロックにスナップショットの差分データを書き込み、
前記第１のテーブルにおいて、前記書き込み対象の仮想ボリュームに格納されているブロックのアドレス値を前記新たなブロックのアドレス値と同じアドレス値に変更し、
前記第２のテーブルにおいて、前記書き込み対象の仮想ボリュームに格納されているブロックのアドレス値と同じアドレス値のブロックアドレスに対応する、複数の仮想ボリューム毎のスナップショット格納の有無を示す値を変更することを特徴とする複数のスナップショット維持方法。
【請求項５】
一つ以上のＣＰＵと、一つ以上のＩ／Ｆと、一つ以上の物理ディスク装置と、二つ以上の論理ユニットと、ディスクアレイコントローラと、メモリを備え、前記Ｉ／Ｆを介して一つ以上のサーバ装置に接続されたストレージ装置における複数のスナップショット維持方法であって、
通常の読み書きを行う運用ボリュームへの読み書きと、複数の仮想ボリュームの各ブロックに対するスナップショットの読み書きとして前記仮想ボリュームのブロックと同じアドレス値の差分ボリュームのブロックにスナップショットの差分データの読み書きを行い、
前記運用ボリュームの各ブロック対応に、前記複数の仮想ボリューム毎のスナップショットを格納したブロックのアドレス値またはスナップショット格納なしを示す情報と、前記複数の仮想ボリューム毎のスナップショット格納の有無を示す値を配した第１のテーブルを生成し、前記一つ以上のクライアントに対してスナップショットを読み書き可能にすることを特徴とする複数のスナップショット維持方法。
【請求項６】
請求項５記載の複数のスナップショット維持方法において、
前記各スナップショットの差分データの格納先の前記差分ボリュームの各ブロックに対応して、前記複数の仮想ボリューム毎のスナップショット格納の有無を示す値を有する第２のテーブルを生成することを特徴とする複数のスナップショット維持方法。
【請求項７】
請求項６記載の複数のスナップショット維持方法において、
前記仮想ボリュームにスナップショットを書き込むとき、前記第１のテーブルを参照し、更新される運用ボリュームのブロックに対応する書き込み対象の仮想ボリュームにスナップショットを格納したブロックのアドレス値が格納されている場合、同じ運用ボリュームのブロックに対応する他の仮想ボリュームにもスナップショットを格納したブロックのアドレス値が格納されているか否か判定することを特徴とする複数のスナップショット維持方法。
【請求項８】
請求項７記載の複数のスナップショット維持方法において、
前記判定の結果、他の仮想ボリュームにもスナップショットを格納したブロックのアドレス値が格納されている場合には、前記差分ボリュームの新たなブロックにスナップショットの差分データを書き込み、
前記第１のテーブルにおいて、前記書き込み対象の仮想ボリュームに格納されているブロックのアドレス値を前記新たなブロックのアドレス値と同じアドレス値に変更し、
前記第２のテーブルにおいて、前記書き込み対象の仮想ボリュームに格納されているブロックのアドレス値と同じアドレス値のブロックアドレスに対応する、複数の仮想ボリューム毎のスナップショット格納の有無を示す値を変更することを特徴とする複数のスナップショット維持方法。
【請求項９】
一つ以上のＣＰＵと、一つ以上のネットワークＩ／Ｆと、メモリと、ファイルシステムを備え、前記ネットワークＩ／Ｆを介して一つ以上のクライアントが接続され、ファイルサーバプログラムが稼働するサーバ装置における複数のスナップショット維持方法であって、
ファイルシステムの各ブロック対応に、仮想ボリューム毎のスナップショットを格納したブロックのアドレス値またはスナップショット格納なしを示す情報と、前記複数の仮想ボリューム毎のスナップショット格納の有無を示す値を配した第１のテーブルを生成し、前記一つ以上のクライアントに対してスナップショットを読み書き可能にすることを特徴とする複数のスナップショット維持方法。
【請求項１０】
請求項９記載の複数のスナップショット維持方法において、
前記各スナップショットの差分データの格納先の前記ファイルシステムの各ブロックに対応して、前記複数の仮想ボリューム毎のスナップショット格納の有無を示す値を有する第２のテーブルを生成することを特徴とする複数のスナップショット維持方法。
【請求項１１】
一つ以上のＣＰＵと、メモリと、一つ以上のネットワークＩ／Ｆと、一つ以上のストレージＩ／Ｆを備え、該ストレージＩ／Ｆに一つ以上のディスク装置を接続したサーバ装置において、
通常の読み書きを行う運用ボリュームへの読み書きと、複数の仮想ボリュームの各ブロックに対するスナップショットの読み書きとして前記仮想ボリュームのブロックと同じアドレス値の差分ボリュームのブロックにスナップショットの差分データの読み書きをする読み出し・書き込み手段と、
前記運用ボリュームの各ブロック対応に、前記複数の仮想ボリューム毎のスナップショットを格納したブロックのアドレス値またはスナップショット格納なしを示す情報と、前記複数の仮想ボリューム毎のスナップショット格納の有無を示す値を配した第１のテーブルとを有するスナップショット手段を備え、前記一つ以上のクライアントに対してスナップショットを読み書き可能にすることを特徴とするサーバ装置。
【請求項１２】
請求項１１記載のサーバ装置において、
前記各スナップショットの差分データの格納先の前記差分ボリュームの各ブロックに対応して、前記複数の仮想ボリューム毎のスナップショット格納の有無を示す値を有する第２のテーブルを備えることを特徴とするサーバ装置。
【請求項１３】
請求項１２記載のサーバ装置において、
前記スナップショット手段は、仮想ボリュームにスナップショットを書き込むとき、前記第１のテーブルを参照し、更新される運用ボリュームのブロックに対応する書き込み対象の仮想ボリュームにスナップショットを格納したブロックのアドレス値が格納されている場合、同じ運用ボリュームのブロックに対応する他の仮想ボリュームにもスナップショットを格納したブロックのアドレス値が格納されているか否か判定することを特徴とするサーバ装置。
【請求項１４】
請求項１３記載のサーバ装置において、
前記スナップショット手段は、前記判定の結果、他の仮想ボリュームにもスナップショットを格納したブロックのアドレス値が格納されている場合には、前記差分ボリュームの新たなブロックにスナップショットの差分データを書き込み、前記第１のテーブルにおいて、前記書き込み対象の仮想ボリュームに格納されているブロックのアドレス値を前記新たなブロックのアドレス値と同じアドレス値に変更し、
前記第２のテーブルにおいて、前記書き込み対象の仮想ボリュームに格納されているブロックのアドレス値と同じアドレス値のブロックアドレスに対応する、複数の仮想ボリューム毎のスナップショット格納の有無を示す値を変更することを特徴とするサーバ装置。
【請求項１５】
一つ以上のＣＰＵと、一つ以上のＩ／Ｆと、一つ以上の物理ディスク装置と、二つ以上の論理ユニットと、ディスクアレイコントローラと
、メモリを備え、前記Ｉ／Ｆを介して一つ以上のサーバ装置に接続されたストレージ装置において、
通常の読み書きを行う運用ボリュームへの読み書きと、複数の仮想ボリュームの各ブロックに対するスナップショットの読み書きとして前記仮想ボリュームのブロックと同じアドレス値の差分ボリュームのブロックにスナップショットの差分データの読み書きをする読み出し・書き込み手段と、
前記運用ボリュームの各ブロック対応に、前記複数の仮想ボリューム毎のスナップショットを格納したブロックのアドレス値またはスナップショット格納なしを示す情報と、前記複数の仮想ボリューム毎のスナップショット格納の有無を示す値を配した第１のテーブルとを有するスナップショット手段を備え、前記一つ以上のクライアントに対してスナップショットを読み書き可能にすることを特徴とするストレージ装置。
【請求項１６】
請求項１５記載のストレージ装置において、
前記各スナップショットの差分データの格納先の前記差分ボリュームの各ブロックに対応して、前記複数の仮想ボリューム毎のスナップショット格納の有無を示す値を有する第２のテーブルを備えることを特徴とするストレージ装置。
【請求項１７】
請求項１６記載のストレージ装置において、
前記スナップショット手段は、仮想ボリュームにスナップショットを書き込むとき、前記第１のテーブルを参照し、更新される運用ボリュームのブロックに対応する書き込み対象の仮想ボリュームにスナップショットを格納したブロックのアドレス値が格納されている場合、同じ運用ボリュームのブロックに対応する他の仮想ボリュームにもスナップショットを格納したブロックのアドレス値が格納されているか否か判定することを特徴とするストレージ装置。
【請求項１８】
請求項１７記載のストレージ装置において、
前記スナップショット手段は、前記判定の結果、他の仮想ボリュームにもスナップショットを格納したブロックのアドレス値が格納されている場合には、前記差分ボリュームの新たなブロックにスナップショットの差分データを書き込み、
前記第１のテーブルにおいて、前記書き込み対象の仮想ボリュームに格納されているブロックのアドレス値を前記新たなブロックのアドレス値と同じアドレス値に変更し、
前記第２のテーブルにおいて、前記書き込み対象の仮想ボリュームに格納されているブロックのアドレス値と同じアドレス値のブロックアドレスに対応する、複数の仮想ボリューム毎のスナップショット格納の有無を示す値を変更することを特徴とするストレージ装置。
【請求項１９】
一つ以上のＣＰＵと、一つ以上のネットワークＩ／Ｆと、メモリと、ファイルシステムを備え、前記ネットワークＩ／Ｆを介して一つ以上のクライアントが接続され、ファイルサーバプログラムが稼働するサーバ装置において、
前記ファイルシステムは仮想ボリュームに対するスナップショット手段を有し、
該スナップショット手段は、ファイルシステムの各ブロック対応に、仮想ボリューム毎のスナップショットを格納したブロックのアドレス値またはスナップショット格納なしを示す情報と、前記複数の仮想ボリューム毎のスナップショット格納の有無を示す値を配した第１のテーブルを備え、前記一つ以上のクライアントに対してスナップショットを読み書き可能にすることを特徴とするサーバ装置。
【請求項２０】
請求項１９記載のサーバ装置において、
前記各スナップショットの差分データの格納先の前記ファイルシステムの各ブロックに対応して、前記複数の仮想ボリューム毎のスナップショット格納の有無を示す値を有する第２のテーブルを備えることを特徴とするサーバ装置。
【請求項２１】
仮想ボリュームにスナップショットを書き込むとき、第１のテーブルであって運用ボリュームの各ブロック対応に、複数の仮想ボリューム毎のスナップショットを格納したブロックのアドレス値またはスナップショット格納なしを示す情報と、前記複数の仮想ボリューム毎のスナップショット格納の有無を示す値を配したテーブルを参照し、更新される運用ボリュームのブロックに対応する書き込み対象の仮想ボリュームにスナップショットを格納したブロックのアドレス値が格納されている場合、同じ運用ボリュームのブロックに対応する他の仮想ボリュームにもスナップショットを格納したブロックのアドレス値が格納されているか否か判定する手順と、
該判定の結果、他の仮想ボリュームにもスナップショットを格納したブロックのアドレス値が格納されている場合には、前記差分ボリュームの新たなブロックにスナップショットの差分データを書き込む手順と、
前記第１のテーブルに対し、前記書き込み対象の仮想ボリュームに格納されているブロックのアドレス値を前記新たなブロックのアドレス値と同じアドレス値に変更する手順と、
各スナップショットの差分データの格納先の前記差分ボリュームの各ブロックに対応して、前記複数の仮想ボリューム毎のスナップショット格納の有無を示す値を有する第２のテーブルに対し、前記書き込み対象の仮想ボリュームに格納されているブロックのアドレス値と同じアドレス値のブロックアドレスに対応する、複数の仮想ボリューム毎のスナップショット格納の有無を示す値を変更する手順をコンピュータに実行させるためのスナップショット管理プログラム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、ストレージを利用するコンピュータシステムにおけるボリュームイメージのスナップショットに関し、特に異なる時刻に採取した複数のスナップショットを維持する方法及び装置に関する。
【０００２】
【従来の技術】
情報化社会において、情報を蓄積するストレージ・システムの重要な役割の一つに、データ保護がある。
【０００３】
データ保護のもっとも一般的な方法は、テープをはじめとするバックアップ・メディアにストレージ上のデータを保存するバックアップである。
【０００４】
バックアップは、故障や障害、或いは、操作ミスなどによって、万が一、運用中のストレージ上のデータを失なったとしても、バックアップを復元することで、保存した時点のデータに回復する事を可能にし、被害を最小限に抑えることができる。
【０００５】
しかし、ストレージの大容量化に伴い、バックアップに要する時間が問題となってきている。
【０００６】
さらに、データの更新頻度が高い用途では、一度バックアップを採取しても、すぐにバックアップとの差が拡大し、万が一の際、被害が増大してしまうため、頻繁にバックアップを採取することが必要となってきている。
【０００７】
また、操作ミスなどによるファイル紛失や、ファイルの内容を過去の状態と比較したい場合などに備えて、定期的なバックアップを容易に参照可能にしたいという要求がある。
【０００８】
このような用途に応える機能として、スナップショット機能が注目されている。
【０００９】
スナップショット機能は、スナップショットを採取した瞬間の運用中のストレージ上のデータイメージを維持すると共に、運用中のストレージとは別の手段でアクセス可能にする機能である。
【００１０】
スナップショットは、採取時点で、ストレージ上のデータ全体のコピー完了を待つ事なく利用可能にすることにより、テープバックアップで問題となっていたバックアップ時間を極小化する。
【００１１】
従来、以下に示す方法が用いられていた。
（１）スナップショットを維持するため、スナップショット時のデータを保存する保存記憶領域を利用する方法がある（例えば、特許文献１参照）。
【００１２】
これによれば、運用ボリュームのスナップショットを採取すると、それ以降に発生する未更新ブロックの更新時に、当該ブロックの旧データを、保存記憶領域にコピーするとともに、スナップショットを提供する仮想ボリュームを生成する。
【００１３】
仮想ボリュームからの読み出しは、読み出すアドレスのブロックが、保存記憶領域にコピー済であれば、そのブロックを返す。
【００１４】
保存記憶領域にコピーがなければ、運用ボリュームに変更が生じていないため、運用ボリュームの同じアドレスのブロックを返す。
【００１５】
これにより、仮想ボリュームのボリュームイメージは、スナップショット採取時点の運用ボリュームのボリュームイメージを維持する。
（２）一定間隔でメモリ上に蓄積した更新データ、および、制御データをディスク上に追加書きし、同期点と呼ぶディスク上でファイルシステムとして意味をなす状態を残してゆくファイルシステムにおいて、スナップショットを実現する方法がある（例えば、特許文献２参照）。
【００１６】
これによれば、スナップショット採取時点で同期点を作成し、その同期点をスナップショットとして確保することにより、スナップショット採取時点のファイルシステムイメージを維持する。
（３）複数のスナップショットを維持するためには、保存記憶領域を個別に用意するほうほうがある（例えば、特許文献３参照）。
（４）専用のファイルシステムのスナップショットを実現する方法がある（例えば、特許文献４参照）。この方法では、他の実現方式のファイルシステムを利用する場合や、ボリュームを占有利用するデータベースなどのアプリケーションなどに適用できない。
【００１７】
【特許文献１】
米国特許５，６４９，１５２号明細書
【特許文献２】
米国特許５，８１９，２９２号明細書
【特許文献３】
米国特許５，６４９，１５２号明細書
【特許文献４】
米国特許５，８１９，２９２号明細書
【００１８】
【発明が解決しようとする課題】
スナップショットを用いたストレージの運用形態は、多様である。
【００１９】
たとえば、日々、スナップショットを生成し、１ヶ月維持する運用形態や、１時間に１回スナップショットを生成し、２４時間以内は１時間毎のスナップショットを、１週間以内は一日毎のスナップショットをそれぞれ維持する運用形態がある。
【００２０】
このような運用を可能にするには、複数のスナップショットを維持できることに加え、スナップショット維持に必要なストレージ容量を必要最小限に抑え、さらにスナップショットの運用コストを低減出来ることが必要である。
【００２１】
本発明の目的は、元のボリュームやファイルシステムのブロック配置に影響を与えず、少ない記憶装置の追加により、複数のスナップショットを任意の時点で採取でき、各スナップショットを任意の時点で削除可能なスナップショットを維持できるようにすることにある。
【００２２】
【課題を解決するための手段】
上記目的を達成するため、本発明では、一つ以上のＣＰＵと、メモリと、一つ以上のネットワークＩ／Ｆと、一つ以上のストレージＩ／Ｆを備え、該ストレージＩ／Ｆに一つ以上のディスク装置を接続したサーバ装置において、通常の読み書きを行う運用ボリュームへの読み書きと、複数の仮想ボリュームの各ブロックに対するスナップショットの読み書きとして前記仮想ボリュームのブロックと同じアドレス値の差分ボリュームのブロックにスナップショットの差分データの読み書きを行い、前記運用ボリュームの各ブロック対応に、前記複数の仮想ボリューム毎のスナップショットを格納したブロックのアドレス値またはスナップショット格納なしを示す情報と、前記複数の仮想ボリューム毎のスナップショット格納の有無を示す値を配した第１のテーブルを生成し、前記一つ以上のクライアントに対してスナップショットを読み書き可能にしている。
【００２３】
【発明の実施の形態】
以下、本発明の実施の形態１を、図１から図８を用い詳細に説明する。
【００２４】
まず、本発明に関わる構成要素の概要を述べ、次に、処理手順とデータ構造の詳細を述べる。
【００２５】
図１は、本発明の実施形態１の一構成例を示す。
【００２６】
サーバ装置１０１は、ネットワークＩ／Ｆ１１２を介して接続したクライアント１３１、１３２に対してファイル共有サービスを提供する。
【００２７】
サーバ装置１０１は、一つ以上のＣＰＵ１１１、一つ以上のネットワークＩ／Ｆ１１２、一つ以上のストレージＩ／Ｆ１１３および、メモリ１１４を備える。
【００２８】
メモリ１１４には、ファイルサーバプログラム１２１、データ保護プログラム１２２、ファイルシステム処理プログラム１２３、スナップショット管理プログラム１２４を備える。
【００２９】
ストレージＩ／Ｆには、ディスク装置１１５、１１６、および、バックアップ装置１１７を接続している。
【００３０】
ディスク装置１１５、１１６は、それぞれ独立した物理ディスクドライブを用いても良いし、単一物理ディスクドライブをパーティション分割し、各パーティションをディスク装置１１５、１１６としても良い。
【００３１】
さらに、ＲＡＩＤ装置のように、多数の物理ディスクドライブを仮想化し、論理的な複数のディスク装置を提供する機能を利用し、論理的なディスク装置をディスク装置１１５、１１６としてもよい。
【００３２】
バックアップ装置１１７は、本実施例ではサーバ装置１０１のストレージＩ／Ｆに接続しているが、ネットワークＩ／Ｆ１１２を介して接続しているクライアント１３１等のストレージＩ／Ｆに接続していても良い。
【００３３】
ファイルサーバプログラム１２１は、クライアント１３１、１３２が要求するファイルのアクセス要求に応じて、ファイルシステム処理プログラム１２３に対してファイルやディレクトリの読み出し及び書き込み処理を実行し、その結果を要求元であるクライアント１３１、１３２に送り返す。
【００３４】
ファイルシステム処理プログラム１２３は、ファイルサーバプログラム１２１や、データ保護プログラム１２２が発行するファイルやディレクトリの読み出し及び書き込み処理の要求に応じて、ファイルやディレクトリを格納しているボリュームと、アクセスするブロック位置、サイズを指定した、データの読み出しや、書き込み処理をスナップショット管理プログラム１２４に対して発行する。
【００３５】
データ保護プログラム１２２は、スナップショット管理プログラム１２４にスナップショットの生成や、削除を要求すると共に、指定したファイルに対してファイルシステム処理プログラム１２３にファイルの読み出し要求を発行して読み出したデータをバックアップ装置１１７に書き込み、バックアップを作成する処理を行う。
【００３６】
スナップショット管理プログラム１２４は、ファイルシステムなどが格納されるボリューム（運用ボリューム）に加え、スナップショットの差分データ、すなわちスナップショットの維持に必要な差分データを格納するボリューム（差分ボリューム）を管理し、ファイルシステム１２３の要求に応じた処理や、スナップショットを維持する処理、および、スナップショットを利用可能にする処理を行う。
【００３７】
ここで示したボリュームとは、ディスク装置１１５、１１６上に確保した領域を意味する。
【００３８】
本実施例では、ディスク装置１１５にファイルシステムを格納している運用ボリュームを、ディスク装置１１６にスナップショットの差分データ、すなわちスナップショットの維持に必要な差分データなどを格納する差分ボリュームを割り当てている。
【００３９】
スナップショット管理プログラム１２４は、ディスク装置１１５の運用ボリュームに対してスナップショットを生成すると、生成した運用ボリュームのスナップショットを提供するための仮想ボリュームをアクセス可能にする。
【００４０】
ファイルシステム処理プログラム１２３は、仮想ボリュームにアクセスすることにより、スナップショットが生成された時点の情報が利用できるため、ファイルシステムのスナップショットイメージを提供することが可能になる。
【００４１】
図２は、スナップショット管理プログラム１２４の構成を示している。
【００４２】
スナップショット管理プログラム１２４は、ファイルシステム処理プログラム１２３が発行する処理要求に応じて書き込み処理サブプログラム２０１、読み出し処理サブプログラム２０２を呼び出すとともに、データ保護プログラム１２２が発行する処理要求に応じてスナップショット生成サブプログラム２０３、スナップショット削除サブプログラム２０４を呼び出す。
【００４３】
スナップショット管理テーブル２１１は、スナップショットを維持するため、および、スナップショットを利用可能にするために保持するデータである。
【００４４】
差分ブロック管理テーブル２１２は、差分ボリュームのブロック使用状況を管理するためのデータである。
【００４５】
図３に、スナップショット管理テーブル２１１の詳細を示す。
【００４６】
スナップショット管理テーブル２１１の列３１１は、運用ボリュームのブロックアドレスに対応しており、最初の行である１番目の行（以下、第１行）には運用ボリュームの１番目のブロックアドレス（以下、ブロックアドレス０番）が割り当てられ、第２行には運用ボリュームのブロックアドレス１番が割り当てられ、以下順番に運用ボリュームのブロックアドレスが割り当てられ、最後の行である第ｍ行には運用ボリュームのブロックアドレス（ｍ−１）番が割り当てられる。
【００４７】
列３１２は、Ｃｏｗビットマップであり、これについては後述する。
【００４８】
スナップショット番号１に対応した仮想ボリューム１（この場合、スナップショット番号と仮想ボリュームの番号は同一である）の第１行には仮想ボリューム１のブロックアドレスとして０番（第１行から順番に、０番、１番、２番、・・・とする）が割り当てられ、第２行には仮想ボリューム１のブロックアドレスとして１番が割り当てられ、第３行と第ｍ行には‘なし’が割り当てられている。
【００４９】
上記仮想ボリューム１の第１行に割り当てられた仮想ボリューム１のブロックアドレス０番は、差分ボリュームのブロックアドレス０番に対応している。運用ボリュームのブロックアドレス０番のデータが更新されるときブロックアドレス０番の更新前のデータが仮想ボリューム１のブロックアドレス０番に仮想的に書き込まれたこととし、運用ボリュームのブロックアドレス０番の更新前のデータの実体は差分ボリュームのブロックアドレス０番に書き込まれる。
【００５０】
仮想ボリューム１の第１行のブロックアドレス０番にアクセスすることにより、即ち、差分ボリュームのブロックアドレス０番にアクセスすることにより、運用ボリュームのブロックアドレス０番の更新前のデータが得られ、この得られたデータと運用ボリュームのブロックアドレス１〜（ｍ−１）番のデータによりスナップショットイメージを提供することが可能になる。
【００５１】
上記仮想ボリューム１の第２行に割り当てられた仮想ボリューム１のブロックアドレス１番は、差分ボリュームのブロックアドレス１番に対応している。運用ボリュームのブロックアドレス１番のデータが更新されるとき、このブロックアドレス１番の更新前のデータが仮想ボリューム１のブロックアドレス１番に仮想的に書き込まれたこととし、運用ボリュームのブロックアドレス１番の更新前のデータの実体は差分ボリュームのブロックアドレス１番に書き込まれる。
【００５２】
上記仮想ボリューム１の第３行に割り当てられた仮想ボリューム１のブロックアドレス２番と、第（ｍ−１）行に割り当てられた仮想ボリューム１のブロックアドレス（ｍ−１）番には、‘なし’が割り当てられており、‘なし’が割り当てられている場合には、それぞれ運用ボリュームのブロックアドレス２番、（ｍ−１）を参照することにしている。すなわち、‘なし’は、運用ボリュームの更新（書き替え）が行われていないことを示す。
【００５３】
仮想ボリューム２の第１行に割り当てられた仮想ボリューム１のブロックアドレス０番は、差分ボリュームのブロックアドレス０番に対応している。運用ボリュームのブロックアドレス０番のデータが更新されるときブロックアドレス０番の更新前のデータが仮想ボリューム１のブロックアドレス０番に仮想的に書き込まれたこととし、運用ボリュームのブロックアドレス０番の更新前のデータの実体は差分ボリュームのブロックアドレス０番に書き込まれる。
【００５４】
上記仮想ボリューム２の第２行に割り当てられた仮想ボリューム２のブロックアドレス１番は、差分ボリュームのブロックアドレス２番に対応している。運用ボリュームのブロックアドレス１番のデータが更新されるとき、このブロックアドレス１番の更新前のデータが仮想ボリューム１のブロックアドレス１番に仮想的に書き込まれたこととし、運用ボリュームのブロックアドレス１番の更新前のデータの実体は差分ボリュームのブロックアドレス２番に書き込まれる。
【００５５】
上記仮想ボリューム２の第３行に割り当てられた仮想ボリューム２のブロックアドレス２番は、差分ボリュームのブロックアドレス４番に対応している。運用ボリュームのブロックアドレス２番のデータが更新されるとき、このブロックアドレス２番の更新前のデータが仮想ボリューム２のブロックアドレス２番に仮想的に書き込まれたこととし、運用ボリュームのブロックアドレス２番の更新前のデータの実体は差分ボリュームのブロックアドレス４番に書き込まれる。
【００５６】
上記仮想ボリューム２の第（ｍ−１）行に割り当てられた仮想ボリューム２のブロックアドレス（ｍ−１）番には、‘なし’が割り当てられており、‘なし’が割り当てられている場合には、運用ボリュームのブロックアドレス（ｍ−１）番を参照することにしている。
【００５７】
仮想ボリュームｎについての説明は、上記仮想ボリューム１、２についての説明と同様であるので、省略する。
【００５８】
列３１２は、Ｃｏｗビットマップであり、そのビット数は仮想ボリュームの数と同じてあり、この場合、仮想ボリュームの数はｎであるので、Ｃｏｗビットマップのビット数もｎである。Ｃｏｗビットマップの第１ビットは仮想ボリューム１に対応し、第２ビットは仮想ボリューム２に対応し、第ｎビットは仮想ボリュームｎに対応する。仮想ボリュームの第ｋ行のブロックアドレスに更新の登録がある場合には、この第ｋ行の仮想ボリュームに対応する第ｋ行のＣｏｗビットマップのビットは０とされ、この仮想ボリュームの第ｋ行のブロックアドレスに更新の登録がない場合、すなわち、‘なし’が割り当てられている場合には、この仮想ボリュームに対応する第ｋ行のＣｏｗビットマップのビットは１とされる。
【００５９】
図３の各仮想ボリュームの第１行のブロックアドレスには０が割り当てられているので、第１行のＣｏｗビットマップの各ビットは全て０になる。
【００６０】
また、図３の各仮想ボリュームの第ｍ行のブロックアドレスには‘なし’が割り当てられているので、第ｍ行のＣｏｗビットマップの各ビットは全て１になる。
【００６１】
ここでは、運用ボリュームのサイズをｍブロック、スナップショットの最大数をｎとしている。
【００６２】
たとえば、ブロックサイズを５１２バイト、運用ボリュームのサイズを１２８ギガバイト、スナップショットの最大数を６４とすると、ｍ＝２５０００００００、ｎ＝６４となる。
【００６３】
なお、ブロックサイズや運用ボリュームのサイズ、スナップショットの最大数は、本発明の効果に影響しないため、任意に設定してよい。
【００６４】
図３の３０１行は、３１１列が運用ボリュームのブロックアドレス０番を示し、３１２列からＣｏＷビットマップが００…０であることを示し、３１３列、３１４列、３１５列からスナップショット１、２、ｎ番に対応する仮想ボリューム１、２、ｎのブロックアドレス０番の内容（すなわち、運用ボリュームのブロックアドレス０番の更新が行われる前の内容（差分データ））が差分ボリュームのブロックアドレス０番に格納されている事を示す。
【００６５】
３０２行は、３１１列が運用ボリュームのブロックアドレス１番を示し、３１２列からＣｏＷビットマップが００…０であることを示し、３１３列からスナップショット１に対応する仮想ボリューム１のブロックアドレス１番の内容が差分ボリュームのブロックアドレス１番に格納されている事、３１４列からスナップショット２番に対応する仮想ボリューム２のブロックアドレス１番の内容が差分ボリュームのブロックアドレス２番に格納されている事、および、３１５列からスナップショットｎ番に対応する仮想ボリュームｎのブロックアドレス２番の内容が差分ボリュームのブロックアドレス３番に格納されている事を示す。
【００６６】
３０３行は、３１１列から運用ボリュームのブロックアドレス２番を示し、３１２列からＣｏＷビットマップが１０…０であることを示し、３１３列からスナップショット１番に対応する仮想ボリューム１のブロックアドレス２番の内容が運用ボリュームのブロックアドレス２番に格納されている事、３１４列、３１５列からスナップショット２、ｎ番に対応する仮想ボリューム２、ｎのブロックアドレス２番の内容が差分ボリュームのブロックアドレス４番に格納されている事を示す。
【００６７】
３１３列の仮想ボリューム１のブロックアドレス２番に‘なし’が割り当てられていることは、３１４列の仮想ボリューム２のブロックアドレス２番の内容が差分ボリュームのブロックアドレス４番に格納されて以後、運用ボリュームのブロックアドレス２番のデータの更新が行われていないことを示す。
【００６８】
３０４行は、３１１列から運用ボリュームのブロックアドレス（ｍ−１）番を示し、３１２列からＣｏＷビットマップが１１…１であることを示し、３１３列からスナップショット１、２、ｎ番に対応する仮想ボリューム１、２、ｎのブロックアドレス（ｍ−１）番の内容が、運用ボリュームのブロックアドレス（ｍ−１）番に格納されている事を示す。すなわち、運用ボリュームの更新（書き替え）が行われていないことを示す。
【００６９】
３１２列の各エントリに示しているＣｏＷビットマップは、少なくともスナップショットの最大数を示すｎビットを備える記憶領域であり、各ビットがスナップショットの番号と対応し、スナップショットを維持し始めてからの更新の有無を示す。図３の場合、０は更新あり、１は更新なしを示す。
【００７０】
書き込み処理サブプログラム２０１が、運用ボリュームにブロックデータを書き込む際、このＣｏＷビットマップを参照し、書き込むアドレスの更新前のデータを差分ボリュームにコピーするか否か、および、どのスナップショットの仮想ボリュームのブロックアドレスを書き換えるかを決定するために利用する。
【００７１】
図４に、差分ブロック管理テーブル２１２の詳細を示す。
【００７２】
差分ブロック管理テーブル２１２は、主に差分ボリューム１１６のブロックの使用状況を管理するため、差分ボリューム１１６上のブロックに対して、ブロックアドレス４１１列と所有ビットマップ４１２列の対応を示す。
【００７３】
４０１行は、差分ボリュームのアドレス０番ブロックが、所有ビットマップ１１…１を持つことを示している。
【００７４】
４０２行〜４０６行に関しても同様である。
【００７５】
４１２列の各エントリに示している所有ビットマップは、少なくともスナップショットの最大数を示すｎビットを備える記憶領域であり、各ビットがスナップショットの番号と対応し、スナップショットの仮想ボリュームを構成するブロックとして参照の有無を示す。図４の場合、１は参照あり、０は参照なしを示す。
【００７６】
書き込み処理サブプログラム２０１が、運用ボリュームへの書き込みで、差分ボリュームに運用ボリュームのブロックデータをコピーする際に、そのブロックを参照するスナップショット番号に対応するビットを１に更新する。
【００７７】
また、スナップショット削除サブプログラム２０４がスナップショットを削除する際、参照している全てのブロックの所有ビットマップの対応するビットを０に更新する。
【００７８】
差分ボリュームから空きブロックを得る際には、所有ビットマップの全てのビットが０のブロックを選択する。
【００７９】
以下、スナップショット管理プログラム１２４の各サブプログラムの処理フローに関して記述する。
【００８０】
図５は、スナップショット管理プログラム１２４の書き込み処理サブプログラム２０１の処理フローを示している。
【００８１】
ステップ５０１では、スナップショットへの書き込みか否かを判断し、すなわち、過去にスナップショットをとることにより得られている差分データへの書き込みであるか否かを判断し、運用ボリュームである場合にはステップ５０２に、スナップショットである場合にはステップ５１１に進む。ステップ５１１以降の処理は通常は行われない例外的な処理であり、ステップ５０２以降の処理が通常行われる処理である。
【００８２】
ステップ５０２では、スナップショット管理テーブル２１１の書き込みを行うブロック番号３１１列に対応するＣｏＷビットマップ３１２列を参照し、ビットが全て０であるか否かを判断し、０であればステップ５０７に、一つでも１があればステップ５０３に進む。
【００８３】
ステップ５０３では、書き込みを行うブロックのデータを差分ボリュームの空きブロック（所有ビットマップの全てのビットが０のブロック）にコピーする。
【００８４】
ステップ５０４では、差分ブロック管理テーブル２１２のステップ５０３にてコピーした差分ボリュームのブロックのアドレス４１１列に対応する所有ビットマップ４１２列に、ステップ５０２にて参照したＣｏＷビットマップの値を格納する。
【００８５】
ステップ５０５では、仮想ボリュームのブロックアドレスフィールド（３１３、３１４、３１５）のうち、ステップ５０２にて参照したＣｏＷビットマップのビットが１となっていたブロックアドレスフィールド全てに、ステップ５０３にてコピーした差分ボリュームのブロックアドレスを格納する。
【００８６】
ステップ５０６では、ステップ５０２にて参照したＣｏＷビットマップの全てのビットの値を０に更新する。
【００８７】
ステップ５０７では、運用ボリュームの指定されたブロックアドレスが示すブロックに、指定されたデータを書き込む。
【００８８】
ステップ５０２〜５０６の処理の実例を上げると、例えば、以下の通りになる。
【００８９】
ステップ５０２で、３１１の運用ボリュームのブロックアドレスの内のブロックアドレス２に書き込みを行う場合、ＣｏＷビットマップは１０…０であり、ビットのすべてが０であるわけでなく、１のビットがあるので、ステップ５０３に進み、ステップ５０３では差分ボリュームの空きブロック（所有ビットマップの全てのビットが０のブロック）として、例えば、差分ボリュームの（ｐ−１）番のブロックアドレスを選択し、この（ｐ−１）番ブロックに運用ボリュームのブロックアドレス２の更新前のデータをコピーする。
【００９０】
ステップ５０４では、運用ボリュームのブロックアドレス２に対するＣｏＷビットマップの値１０…０を、差分ブロック管理テーブルの（ｐ−１）番のブロックアドレスに対する所有ビットマップに格納する。
【００９１】
ステップ５０５では、運用ボリュームのブロックアドレス２に対する仮想ボリューム１のブロックアドレスを差分ボリュームの（ｐ−１）番のブロックアドレスに更新する。
【００９２】
ステップ５０６では、運用ボリュームのブロックアドレス２に対するＣｏＷビットマップの値１０…０を００…０にする。
【００９３】
ステップ５１１では、スナップショット管理テーブル２１１の書き込みを行う仮想ボリュームのブロックアドレス（３１３、３１４、３１５）の値を参照し、その値が「なし」を示しているか否かを判定し、「なし」であった場合にはステップ５１２に、「なし」ではなかった場合にはステップ５３１に進む。
【００９４】
ステップ５３１では、差分ブロック管理テーブル２１２のステップ５１１で参照したブロックアドレスの値に対応するアドレス４１１の所有ビットマップ４１２の値を参照し、書き込む仮想ボリュームを除く他の仮想ボリュームを示すビットの値全てが０である場合には、書き込む仮想ボリュームのブロックアドレスが示す差分ボリュームのブロックにはこの書き込む仮想ボリュームに係る差分データしかなく、他の仮想ボリュームに係る差分データは存在しないので、ステップ５３２に進み、ビット値の１つでも１である場合には、他の仮想ボリュームに係る差分データも存在するため、ステップ５２１に進む。
【００９５】
ステップ５３２では、ステップ５１１で参照したブロックアドレスが示す差分ボリュームのブロックに、指定されたデータを書き込む。
【００９６】
ステップ５２１では、ステップ５３１で参照した所有ビットマップ４１２の書き込む仮想ボリュームを示すビットの値を０に更新し、すなわち、自仮想ボリュームに係る差分データと他の仮想ボリュームに係る差分データが存在する差分ボリュームのブロックから自仮想ボリュームに係る差分データを除き、ステップ５１２に進む。
【００９７】
ステップ５１２では、差分ボリュームの空きブロック（所有ビットマップの全てのビットが０のブロック）に指定されたデータを書き込む。すなわち、過去の差分データへの書き込みであるため、運用ボリュームには書き込みできないため、このような処理が行われる。
【００９８】
ステップ５１３では、差分ブロック管理テーブル２１２のステップ５１２にてコピーした差分ボリュームのブロックアドレス４１１列に対応する所有ビットマップ４１２列の値に、書き込む仮想ボリュームを示すビットを１に更新する。
【００９９】
ステップ５１４では、ステップ５１１にて参照したブロックアドレスの値を、ステップ５１２にて書き込んだ差分ボリュームのブロックのアドレスに更新する。
【０１００】
ステップ５０８にて処理を終了する。
【０１０１】
図６は、スナップショット管理プログラム１２４の読み出し処理サブプログラム２０２の処理フローを示している。
【０１０２】
ステップ６０１では、スナップショットからの読み出しであるか否かを判断し、運用ボリューム１１５である場合にはステップ６０３に、スナップショットである場合にはステップ６０２に進む。
【０１０３】
ステップ６０２では、スナップショット管理テーブル２１１に記されている読み出す仮想ボリュームの指定されたブロックアドレスに対応する差分ボリューム１１６のブロックアドレスの値を参照し、その値が「なし」であるか否かを判定し、「なし」である場合にはステップ６０３に、「なし」で無い場合にはステップ６１１に進む。
【０１０４】
ステップ６０３では、運用ボリューム１１５の指定されたブロックアドレスが示すブロックから読み出したブロックデータを返す。
【０１０５】
ステップ６１１では、ステップ６０２にて参照した差分ボリューム１１６のブロックアドレスが示すブロックから読み出したブロックデータを返す。ステップ６０４にて処理を終了する。
【０１０６】
図７は、スナップショット管理プログラム１２４のスナップショット生成サブプログラム２０３の処理フローを示している。
【０１０７】
ステップ７０１では、スナップショット管理テーブル２１１の全てのブロックアドレス３１１列に対して、ＣｏＷビットマップ３１２列の生成するスナップショットに対応する仮想ボリュームに対するビットを１に更新するとともに、生成するスナップショットに対応する仮想ボリュームのブロックアドレスを全て「なし」に設定する。
【０１０８】
ステップ７０２にて処理を終了する。
【０１０９】
ステップ７０１では、スナップショット管理テーブル２１１の全てのブロックアドレス３１１列に対して、ＣｏＷビットマップ３１２列の値を更新しているが、ファイルシステムなどのように、未使用ブロックが存在する場合、未使用ブロックを除く全てのＣｏＷビットマップ３１２列の生成するスナップショットに対応するビットを１に更新するよう変更してもよい。未使用ブロックとは、ファイルやディレクトリなどのデータ格納のために割り当てていないブロックで、今後ファイルやディレクトリを新規作成したり、サイズを拡張したりする際にデータを格納するために用意しているブロックである。
【０１１０】
未使用ブロックに対する書込み要求が発行され、未使用ブロックに格納されているデータが更新されても、ファイルシステムのスナップショットは未使用ブロックのデータを参照することがないため、当該データの更新はファイルシステムのスナップショットには影響を与えない。従って、スナップショット生成後に未使用部分が更新された場合、スナップショット生成の際に未使用ブロックに対するＣｏＷビットが０になっていると差分ボリュームに更新前のデータがコピーされず、未使用ブロック内のデータ更新がスナップショットに反映され、スナップショット生成時と内容が変化してしまうが、当該スナップショットを用いたファイルシステムでは、ファイルシステム内のファイルやディレクトリの内容には影響がない。従って、スナップショットを生成する際、未使用ブロックに対するＣｏＷビットを０にしておけば、差分の発生量を削減することが可能となる。
【０１１１】
図８は、スナップショット管理プログラム１２４のスナップショット削除サブプログラム２０４の処理フローを示している。
【０１１２】
ステップ８０１では、スナップショット管理テーブル２１１の全てのブロックアドレス３１１列に対して、ＣｏＷビットマップ３１２列の削除するスナップショットに対応する仮想ボリュームに対するビットを０に更新する。
【０１１３】
ステップ７０２にて、スナップショット管理テーブル２１１の削除するスナップショットに対応する仮想ボリュームのブロックアドレス（たとえば３１４列）に記されている全ての差分ボリューム１１６上のブロックに対して、差分ブロック管理テーブル２１２の所有ビットマップ４１２列の削除するスナップショットに対応する仮想ボリュームに対するビットを０に更新する。
【０１１４】
ステップ８０３にて処理を終了する。
【０１１５】
本発明の実施の形態１では、たとえば、データ保護プログラム１２２がスナップショット管理プログラム１２４に運用ボリューム１１５のスナップショット１の生成を指示すると、スナップショット生成サブプログラム２０３が呼び出され、スナップショット管理テーブル２１１のＣｏＷビットマップ３１２の対応ビットを１に設定し、仮想ボリューム１（３１３）のブロックアドレスを全て「なし」に設定する。
【０１１６】
これ以降、運用ボリューム１１５に対してクライアント１３１などから書き込みが実行されたとしても、スナップショット管理プログラム１２４の書き込み処理サブプログラム２０１により、書き込み対象となったブロックのデータを差分ボリューム１１６にコピーすると共に、仮想ボリューム１（３１３）のブロックアドレスを更新し、スナップショット採取時と同じデータを維持することができる。
【０１１７】
データ保護プログラム１２２は、仮想ボリューム１（３１３）上のファイルを読み出すことにより、いつでもスナップショット採取時点のデータを得ることが可能となり、バックアップ装置１１７へのデータバックアップ中にファイルのデータが変更される事を回避することが可能となる。
【０１１８】
本発明の実施の形態１では、スナップショット管理テーブル２１１、および、差分ブロック管理テーブル２１２は、メモリ１１４上に確保しているが、これらを更新する度に差分ボリューム１１６にコピーする手順を加えることで、容易にサーバ装置１０１のメモリ破壊（電源断や、システム障害）が発生してもスナップショットを維持することが可能となる。
【０１１９】
また、本発明の実施の形態１では、運用ボリューム１１５にファイルシステムを作成しているが、たとえばデータベースが占有利用するボリュームなどに適用した場合でも、同様の効果を得ることが可能である。
【０１２０】
図９に、本発明の実施の形態２の一構成例を示す。
【０１２１】
サーバ装置１０１ａは、ネットワークＩ／Ｆ１１２を介して接続したクライアント１３１、１３２に対してファイル共有サービスを提供する。
【０１２２】
サーバ装置１０１ａは、一つ以上のＣＰＵ１１１、一つ以上のネットワークＩ／Ｆ１１２、一つ以上のＦＣ（Ｆｉｂｒｅ    Ｃｈａｎｎｅｌ）Ｉ／Ｆ９２１および、メモリ１１４を備える。
【０１２３】
メモリ１１４には、ファイルサーバプログラム１２１、データ保護プログラム１２２、ファイルシステム処理プログラム１２３を備える。
【０１２４】
ＦＣＩ／Ｆは、ＦＣスイッチなどで構成されるＳＡＮ（Ｓｔｏｒａｇｅ    Ａｒｅａ    Ｎｅｔｗｏｒｋ）９３１に接続し、ストレージ装置９０１に対する操作を可能にする。
【０１２５】
ストレージ装置９０１は、一つ以上のＣＰＵ９１１、一つ以上のＦＣＩ／Ｆ９１２、一つ以上のディスクアレイコントローラ９１３、メモリ９１４、および、一つ以上のディスク装置９１５を備える。
【０１２６】
メモリ９１４には、スナップショット管理プログラム１２４を備える。
【０１２７】
ディスクアレイコントローラ９１３は、一つ以上のディスク装置９１５を利用し、複数の論理的なディスク装置である論理ユニット９１６、９１７、９１８を提供する。
【０１２８】
スナップショット管理プログラム１２４は、たとえば論理ユニット９１６に運用ボリュームを、論理ユニット９１７に差分ボリュームを割り当てることにより、本発明の実施の形態１と同様に、スナップショットを利用する仮想ボリュームを提供することができる。
【０１２９】
この仮想ボリュームを仮想的な論理ユニットとして利用可能にすることで、ＳＡＮ９３１上の各装置に対してスナップショットを利用することが可能になる。
【０１３０】
サーバ装置１０１ａが、この仮想的な論理ユニットを利用することで、本発明の実施の形態１と同様に、データ保護プログラム１２２を実行することができる。
【０１３１】
さらに、サーバ装置１０１ａと同様の構成を持つ別のバックアップ用のサーバ装置１０１ｂもＳＡＮ９３１を経由して、ストレージ装置９０１が提供する仮想的な論理ユニットを利用することができる。
【０１３２】
これにより、バックアップ用のサーバ装置１０１ｂは、ストレージ装置９０１が提供する仮想的な論理ユニットの内容、即ちスナップショットイメージをＳＡＮ９３１に接続したバックアップ装置１１７ａに保存することができる。
【０１３３】
以下、本発明の実施の形態３を、図１０から図１５を用い詳細に説明する。
【０１３４】
図１０に本発明の実施形態３の一構成例を示す。
【０１３５】
サーバ装置１０１ｃは、ネットワークＩ／Ｆ１１２を介して接続したクライアント１３１、１３２に対してファイル共有サービスを提供する。
【０１３６】
サーバ装置１０１ｃは、一つ以上のＣＰＵ１１１、一つ以上のネットワークＩ／Ｆ１１２、一つ以上のストレージＩ／Ｆ１１３および、メモリ１１４を備える。
【０１３７】
メモリ１１４には、ファイルサーバプログラム１２１、データ保護プログラム１２２、スナップショット機能を備えるファイルシステム処理プログラム１００１を備える。
【０１３８】
ストレージＩ／Ｆには、ディスク装置１１５を接続している。
【０１３９】
図１１は、スナップショット機能を備えるファイルシステム処理プログラム１００１の構成を示している。
【０１４０】
スナップショット機能を備えるファイルシステム処理プログラム１００１は、ファイルシステム（ＦＳ）内書き込み処理サブプログラム２０１ａ、ＦＳ内読み出し処理サブプログラム２０２ａ、ＦＳ内スナップショット生成サブプログラム２０３ａ、ＦＳ内スナップショット削除サブプログラム２０４ａ、スナップショット管理テーブル２１１、および、差分ブロック管理テーブル２１２を備える。
【０１４１】
図１２は、スナップショット機能を備えるファイルシステム処理プログラム１００１のＦＳ内書き込み処理サブプログラム２０１ａの処理フローを示している。
【０１４２】
ステップ５０１では、スナップショットに対する書き込みであるかを判断し、ファイルシステム自身である場合にはステップ５０２に、スナップショットである場合にはステップ５１１に進む。
【０１４３】
ステップ５０２では、スナップショット管理テーブル２１１の書き込みを行うブロック番号３１１列に対応するＣｏＷビットマップ３１２列を参照し、ビットが全て０であるか否かを判断し、０であればステップ５０７ａに、一つでも１があればステップ５０３ａに進む。
【０１４４】
ステップ５０３ａでは、ファイルシステムの空きブロックを確保し、書き込みを行うブロックのデータを確保した空きブロックにコピーする。
【０１４５】
ステップ５０４ａでは、ステップ５０３ａにてコピーしたブロックを４１１列に持ち、かつ対応する所有ビットマップ４１２列にステップ５０２にて参照したＣｏＷビットマップの値を格納したエントリを、差分ブロック管理テーブル２１２に登録する。
【０１４６】
ステップ５０５ａでは、仮想ボリュームのブロックアドレスフィールド（３１３、３１４、３１５）のうち、ステップ５０２にて参照したＣｏＷビットマップのビットが１となっていたブロックアドレスフィールド全てに、ステップ５０３ａにて書き込みを行うブロックのデータをコピーしたブロックのブロックアドレスを格納する。
【０１４７】
ステップ５０６では、ステップ５０２にて参照したＣｏＷビットマップの全てのビットの値を０に更新する。
【０１４８】
ステップ５０７ａでは、指定されたブロックアドレスが示すブロックに、指定されたデータを書き込む。
【０１４９】
ステップ５１１では、スナップショット管理テーブル２１１の書き込みを行う仮想ボリュームのブロックアドレス（３１３、３１４、３１５）の値を参照し、その値が「なし」を示しているか否かを判定し、「なし」であった場合にはステップ５１２ａに、「なし」ではなかった場合にはステップ５３１に進む。
【０１５０】
ステップ５３１では、差分ブロック管理テーブル２１２のステップ５１１で参照したブロックアドレスの値に対応するアドレス４１１の所有ビットマップ４１２の値を参照し、書き込む仮想ボリュームを除く他の仮想ボリュームを示すビットの値全てが０である場合にはステップ５３２ａに進み、ビット値の１つでも１である場合にはステップ５２１に進む。
【０１５１】
ステップ５３２ａでは、ステップ５１１で参照したブロックアドレスが示すブロックに、指定されたデータを書き込む。
【０１５２】
ステップ５２１では、ステップ５３１で参照した所有ビットマップ４１２の書き込む仮想ボリュームを示すビットの値を０に更新し、ステップ５１２ａに進む。
【０１５３】
ステップ５１２ａでは、ファイルシステムの空きブロックを確保し、そのブロックに指定されたデータを書き込む。
【０１５４】
ステップ５１３ａでは、ステップ５１２ａにてコピーしたブロックアドレスを４１１列に持ち、かつ対応する所有ビットマップ４１２列に書き込む仮想ボリュームを示すビットのみ１である値を格納したエントリを、差分ブロック管理テーブル２１２に登録する。
【０１５５】
ステップ５１４では、ステップ５１１にて参照したブロックアドレスの値を、ステップ５１２ａにて書き込んだブロックのアドレスに更新する。
【０１５６】
ステップ５０８にて処理を終了する。
【０１５７】
図１３は、スナップショット機能を備えるファイルシステム処理プログラム１００１のＦＳ内読み出し処理サブプログラム２０２ａの処理フローを示している。
【０１５８】
ステップ６０１では、スナップショットからの読み出しであるか否かを判断し、ファイルシステムである場合にはステップ６０３ａに、スナップショットである場合にはステップ６０２に進む。
【０１５９】
ステップ６０２では、スナップショット管理テーブル２１１に記されている読み出す仮想ボリュームの指定されたブロックアドレスに対応するブロックアドレスの値を参照し、その値が「なし」であるか否かを判定し、「なし」である場合にはステップ６０３ａに、「なし」で無い場合にはステップ６１１ａに進む。
【０１６０】
ステップ６０３ａでは、指定されたブロックアドレスが示すブロックから読み出したブロックデータを返す。
【０１６１】
ステップ６１１ａでは、ステップ６０２にて参照したブロックアドレスが示すブロックから読み出したブロックデータを返す。
【０１６２】
ステップ６０４にて処理を終了する。
【０１６３】
図１４は、スナップショット機能を備えるファイルシステム処理プログラム１００１のＦＳ内スナップショット生成サブプログラム２０３ａの処理フローを示している。
【０１６４】
ステップ７０１ａでは、ファイルシステムの空きブロックと、差分ブロックを除く全てのブロックに対するスナップショット管理テーブル２１１のアドレス３１１列に対して、ＣｏＷビットマップ３１２列の生成するスナップショットに対応する仮想ボリュームに対するビットを１に更新するとともに、生成するスナップショットに対応する仮想ボリュームのブロックアドレスを全て「なし」に設定する。
【０１６５】
ステップ７０２にて処理を終了する。
【０１６６】
図１５は、スナップショット機能を備えるファイルシステム処理プログラム１００１のＦＳ内スナップショット削除サブプログラム２０４ａの処理フローを示している。
【０１６７】
ステップ８０１では、スナップショット管理テーブル２１１の全てのブロックアドレス３１１列に対して、ＣｏＷビットマップ３１２列の削除するスナップショットに対応する仮想ボリュームに対するビットを０に更新する。
【０１６８】
ステップ７０２ａにて、スナップショット管理テーブル２１１の削除するスナップショットに対応する仮想ボリュームのブロックアドレス（たとえば３１４列）に記されている全てのブロックに対して、差分ブロック管理テーブル２１２の所有ビットマップ４１２列の削除するスナップショットに対応する仮想ボリュームに対するビットを０に更新し、所有ビットマップ４１２列の全ビットが０となった場合、差分ブロック管理テーブル２１２からエントリを削除すると共に、当該ブロックをファイルシステムの空きブロックに解放する。
【０１６９】
ステップ８０３にて処理を終了する。
【０１７０】
本発明の実施の形態３は、ファイルのデータを更新する際、ファイルシステムがファイルを作成する際に割り当てたブロックを移動することなくスナップショットを維持する。
【０１７１】
ファイルシステムは、一般に、ファイルを作成する際、連続読み出しの効率を高めるため連続的にブロックを割り当てる。
【０１７２】
このため、本方法では、スナップショットを維持している場合でも、ブロックが不連続にならず、ファイル読み出しの効率を低下させることがない。
【０１７３】
本発明の実施の形態３では、差分ブロックをファイルシステムの空きブロックから確保する方法を示したが、本発明の実施の形態１と同様に、差分ボリュームを割り当て、差分ブロックを差分ボリュームに格納することも可能である。
【０１７４】
また、本発明の実施の形態３では、スナップショットをファイルシステム毎に管理しているが、スナップショット管理テーブル２１１をファイル毎に割り当てることにより、容易にファイル単位のスナップショットを実現することができる。
【０１７５】
本発明の実施の形態１〜３では、スナップショットを提供する仮想ボリュームに対する書き込みが可能である。
【０１７６】
スナップショットを提供する仮想ボリュームのボリュームイメージは、書き込みによって変化する。
【０１７７】
以下に示す手順により、スナップショットに対するスナップショットを採取することができる。
【０１７８】
スナップショット１を基となるスナップショット、スナップショット２を採取するスナップショットとすると、スナップショット管理テーブル２１１のスナップショット１に対応するＣｏＷビットの値と、仮想ボリューム１のブロックリスト３１３の値を、スナップショット２に対応するＣｏＷビットと仮想ボリューム２のブロックリスト３１４にコピーし、仮想ボリューム１のブロックリストにある全ての差分ブロックに対して、採取するスナップショットに対応する所有ビット４１２を１に更新する。
【０１７９】
これにより、スナップショット１のスナップショットを、スナップショット２に採取することが可能となる。
【０１８０】
本発明では、運用ボリュームとの差分をスナップショット毎に管理する管理テーブルを用い、一つの差分格納領域を用いて複数の運用ボリュームのスナップショット維持を実現している。
【０１８１】
管理テーブルは、運用ボリュームの各ブロックに対して、最大スナップショット数以上のＣｏＷ（Ｃｏｐｙ−ｏｎ−Ｗｒｉｔｅ）フラグと、スナップショット毎のブロックアドレスを持つテーブルと、差分がどのスナップショットから参照しているかを管理するテーブルを用い、スナップショットを採取する際には、管理テーブル上のＣｏＷフラグを立て、運用ボリュームを更新する際、管理テーブル上のＣｏＷフラグを参照し、ＣｏＷフラグが立ち、旧データのコピーを必要とするスナップショットがあれば、当該ブロックの旧データを差分格納領域にコピーするとともに、ＣｏＷフラグが立っていた全てのスナップショットのブロックアドレスとしてコピー先ブロックのアドレスを設定し、差分を参照するスナップショットとしてＣｏＷフラグが立っていたすべてのスナップショットを設定した後、ＣｏＷフラグをクリアする。
【０１８２】
これにより、スナップショット維持に必要な差分格納領域容量を、差分データと管理データに抑えるだけでなく、差分格納領域上、スナップショット間で差分を共有することができるため、差分格納領域の消費量を抑えることができる。
【０１８３】
各スナップショットは、スナップショット採取時の運用ボリュームのボリュームイメージを提供する仮想ボリュームを設け、仮想ボリュームは、読み出すブロックを差分格納領域から取り出すか、運用ボリュームから取り出すかを、管理テーブルを参照して決定している。
【０１８４】
以下、本発明の実施の形態４を、図１６から図２１を用い詳細に説明する。
【０１８５】
図１６は、本発明の実施形態４の一構成例を示す。図１６は、図１に示した本発明の実施形態１のスナップショット管理プログラム１２４を先行コピー付きスナップショット管理プログラム１７０１に置き換えたものである。
【０１８６】
以下、先行コピー付きスナップショット管理プログラム１７０１について説明する。
【０１８７】
図１７は、先行コピー付きスナップショット管理プログラム１７０１の構成を示している。
【０１８８】
先行コピー付きスナップショット管理プログラム１７０１は、ファイルシステム処理プログラム１２３が発行する処理要求に応じて先行コピー付き書き込み処理サブプログラム１７１１、先行コピー付き読み出し処理サブプログラム１７１２を呼び出すとともに、データ保護プログラム１２２が発行する処理要求に応じて先行コピー付きスナップショット生成サブプログラム１７１３、スナップショット削除サブプログラム２０４を呼び出す。
【０１８９】
先行コピー付きスナップショット管理テーブル１７２１は、スナップショットを維持するため、および、スナップショットを利用可能にするために保持するデータである。
【０１９０】
差分ブロック管理テーブル２１２は、差分ボリュームのブロック使用状況を管理するためのデータである。
【０１９１】
図１８に、先行コピー付きスナップショット管理テーブル１７２１の詳細を示す。
【０１９２】
先行コピー付きスナップショット管理テーブル１７２１の列３１１から列３１５は、図３に示したスナップショット管理テーブルと同様である。図１８の１８０１行は、３１１列が運用ボリュームのブロックアドレス０番を示し、３１２列はＣｏＷビットマップがなしである（存在しない）ことを示し、３１３列、３１４列、３１５列がそれぞれスナップショット１，２，ｎ番に対応する仮想ボリューム１，２，ｎ番のブロックアドレス０番の内容が差分ボリュームのブロックアドレス１００番、２００番、３００番に格納されていることを示す。図１８の１８０２行も１８０１行と同様である。図１８の１８０３行、１８０４行は、図３の３０１行から３０４行と同様である。
【０１９３】
図１８において、３１２列のＣｏＷビットマップがなしである運用ボリュームのブロックアドレス０番から（ｑ−１）番は、３１２列のＣｏＷビットマップを参照する事なく、運用ボリュームへの書き込みに先行し、スナップショット生成時点で、差分ボリュームにデータがコピーされていることを示す。
【０１９４】
以下、図１９から図２１を用い、先行コピー付きスナップショット管理プログラム１７０１の各サブプログラムの処理フローに関して記述する。
【０１９５】
図１９は、先行コピー付きスナップショット管理プログラム１７０１の先行コピー付きスナップショット生成サブプログラム１７１３の処理フローを示している。
【０１９６】
ステップ１９０１では、運用ボリュームのブロックアドレス０番から（ｑ−１）番のデータを差分ボリュームの空きブロックにコピーする。
【０１９７】
ステップ１９０２では、差分ブロック管理テーブル２１２において、ステップ１９０１で運用ボリュームのブロックアドレス０番から（ｑ−１）番のデータをコピーした差分ボリューム内の各ブロックのブロックアドレス４１１に対応する所有ビットマップ４１２の、生成しようとするスナップショットに対応するビットの値を１に更新する。
【０１９８】
ステップ１９０３では、先行コピー付きスナップショット管理テーブル１７２１の、生成しようとするスナップショットに対応する仮想ボリュームのブロックアドレス（例えば、スナップショット２を生成する場合であれば、３１４列）に、ステップ１９０１にて運用ボリュームのブロックアドレス０番から（ｑ−１）番のデータをコピーした差分ボリュームのブロックアドレスをそれぞれ格納する。
【０１９９】
ステップ１９０４では、先行コピー付きスナップショット管理テーブル１７２１の運用ボリュームのブロックアドレス３１１列のｑ番から（ｍ−１）番に対して、ＣｏＷビットマップ３１２列の生成するスナップショットに対応する仮想ボリュームに対するビットを１に更新するとともに、生成するスナップショットに対応する仮想ボリュームのブロックアドレスを「なし」に設定する。
【０２００】
ステップ１９０５にて処理を終了する。
【０２０１】
図２０は、先行コピー付きスナップショット管理プログラム１７０１の先行コピー付きスナップショット読み出し処理サブプログラム１７１２の処理フローを示している。
【０２０２】
この先行コピー付きスナップショット読み出し処理サブプログラム１７１２は、図６に示したスナップショット読み出し処理サブプログラム２０２に対して、ステップ６０１とステップ６０２の間にステップ２００１を挿入している以外に違いはない。
【０２０３】
ステップ２００１では、読み出す仮想ボリュームの指定されたブロックアドレスがｑ未満であるか否かを判定し、ｑ未満であればステップ６１１に、ｑ以上であればステップ６０２に進む。
【０２０４】
図２１は、先行コピー付きスナップショット管理プログラム１７０１の先行コピー付きスナップショット書き込み処理サブプログラム１７１１の処理フローを示している。
【０２０５】
この先行コピー付きスナップショット読み出し処理サブプログラム１７１１は、図５に示したスナップショット書き込み処理サブプログラム２０１に対して、ステップ５０１とステップ５０２の間にステップ２１０１を、ステップ５０１とステップ５１１の間にステップ２１０２をそれぞれ挿入している以外に違いはない。
【０２０６】
ステップ２１０１では、書き込みを行うブロックアドレスがｑ未満であるか否かを判定し、ｑ未満であればステップ５０７に、ｑ以上であればステップ５０２に進む。
【０２０７】
ステップ２１０２では、書き込みを行うブロックアドレスがｑ未満であるか否かを判定し、ｑ未満であればステップ５３２に、ｑ以上であればステップ５１１に進む。
【０２０８】
本発明の実施形態４は、本発明の実施形態１に対して、スナップショットを採取する際、運用ボリュームへの書き込みの有無に関わらず、予めブロックアドレス０番から（ｑ−１）番のブロックを差分ボリュームにコピーする機能を追加している。即ち、データ保護プログラムからスナップショット取得の指示が発行された際、先行コピー付スナップショット生成サブプログラムが実行されると、スナップショット取得指示発行後、運用ボリュームへの書込み要求が発行される前に、予め運用ボリュームのブロックアドレス０番から（ｑ−１）番のブロックが差分ボリュームにコピーされる。これは、ブロックアドレス０番から（ｑ−１）番にファイルシステムのスーパーブロックと呼ぶ管理テーブルや、ジャーナルログと呼ぶファイルシステムの管理情報の変更履歴格納領域など、運用ボリュームの更新が頻繁に行われる個所が知られているシステムにおいて、当該個所を先行してコピーを行っておくことにより、運用ボリュームの更新時に時間のかかるＣｏＷ処理の発生を抑止し、性能向上を可能にする効果がある。
【０２０９】
本発明の実施形態４の説明では、ブロックアドレスｑ番未満を先行コピーの対象としたが、先行コピーの対象ブロックをビットマップや、ブロックリストで管理することにより、任意のブロックを先行コピーの対象とすることは容易に実現できる。
【０２１０】
図２２は、本発明の実施形態４において図２１に示した先行コピー付きスナップショット書き込み処理サブプログラム１７１１の異なる実施の形態である先行コピー付きスナップショット書き込み処理サブプログラム（２）１７１１’の処理フローを示している。
【０２１１】
この先行コピー付きスナップショット書き込み処理サブプログラム（２）１７１１’は、図２１に示した先行コピー付きスナップショット書き込み処理サブプログラム１７１１に対して、ステップ２１０２以降の処理を変更している以外に違いはない。
【０２１２】
ステップ２１０２で、書き込みアドレスがｑ以上であった場合、ステップ２２０１に進み、エラーリターンする。
【０２１３】
これにより、スナップショットは、ブロックアドレスｑ番以降に対する書き換えを禁止することができる。
【０２１４】
図２３は、本発明の実施形態５の一構成例を示す。本発明の実施形態５は、図９に示した本発明の実施形態２のスナップショット管理プログラム１２４を先行コピー付きスナップショット管理プログラム１７０１に置き換えたものである。
【０２１５】
本発明の実施形態５は、本発明の実施形態４と同様の効果がある事に加え、ボリュームラベル書き換えを容易にすることが可能となる。
【０２１６】
図２３に示すサーバ装置１０１ａは、論理ボリュームの追加や削除などによって、論理ボリュームに格納したファイルシステム等が特定できなくなることを避けるため、論理ボリュームに、一意な識別子を与えている。サーバ装置１０１ａが論理ユニット９１６に割り当てた論理ボリュームのスナップショットを提供する仮想ボリュームを、ストレージ装置９０１が仮想的な論理ユニット９１８としてサーバ装置１０１ａに提供する場合、サーバ装置１０１ａからは、論理ユニット９１６と論理ユニット９１８が全く同一の識別子で認識されてしまう。サーバ装置１０１ａは、全く同一の識別子を持つ論理ユニットを扱えないものがあるため、このような場合、ボリュームラベル書き換えと呼ばれる識別子の変更が行われる。一方スナップショットは、過去のボリュームイメージを維持する機能であるため、書き換えが不能である方が都合の良い場合がある。そこで実施形態５の様では、ボリュームラベルが格納されている領域は先行コピー対象領域としておき、スナップショットを生成する際には、先行コピー対象領域については書き込み要求の有無に関わらず実際に当該領域に対するライト要求が発行される前に当該領域に格納されているデータを差分ボリュームにコピーしておく。更に先行コピー付きスナップショット書き込み処理サブプログラム（２）１７１１’を用いることにより、書込み要求がスナップショットに対するものでありかつ先行コピー対象領域に対するものであれば差分ボリュームへデータを書込み、書込み要求がスナップショットに対するものでありかつ先行コピー対象領域以外に対するものであれば、エラーを返す。係る処理によって、ボリュームラベルは書き換えつつ、スナップショットのボリュームラベル以外のデータ部は保護することが可能となる。
【０２１７】
また、ボリュームラベルの書き換え処理においてスナップショットボリュームのボリュームラベルを書き換える際、通常であれば運用ボリュームから差分ボリュームにボリュームラベルが格納されているブロックのデータをコピーした後、新しいボリュームラベルを差分ボリュームに書き込む必要がある。しかし、先行コピー付スナップショット管理プログラム１７０１を用いれば、スナップショットを取得する際にボリュームラベルは先行コピーによって運用ボリュームから差分ボリュームにコピーされているので、新しいボリュームラベルを差分ボリュームに書き込むだけでよく、ボリュームラベルの書き換え処理を高速に実行することが可能となる。
【０２１８】
【発明の効果】
本発明によればスナップショットの対象となる運用ボリュームに対して一つの差分ボリュームを用意することにより、複数のスナップショットを維持、提供することが可能になる。
【０２１９】
また、運用ボリュームのみで複数のスナップショットを維持、提供することが可能になる。
【０２２０】
さらに、スナップショットを採取しても、運用ボリュームや、ファイルシステムのブロック配置を変更しないため、連続アクセスの効率を維持することができる。
【図面の簡単な説明】
【図１】本発明が適用されるシステムのハードウェア構成の一例を示す図である。
【図２】本発明が適用されるシステムの、ソフトウェア及びデータの構成の一例を示す図である。
【図３】スナップショット管理テーブルの構成例を示す図である。
【図４】差分ブロック管理テーブルの構成例を示す図である。
【図５】書き込み処理サブプログラムの処理フローの一例を示す図である。
【図６】読み出し処理サブプログラムの処理フローの一例を示す図である。
【図７】スナップショット生成サブプログラムの処理フローの一例を示す図である。
【図８】スナップショット削除サブプログラムの処理フローの一例を示す図である。
【図９】本発明が適用されるシステムのハードウェア構成の他の一例を示す図である。
【図１０】本発明が適用されるシステムのハードウェア構成の他の一例を示す図である。
【図１１】本発明が適用されるシステムのソフトウェア及びデータの構成の他の一例を示す図である。
【図１２】ＦＳ内書き込み処理サブプログラムの処理フローの一例を示す図である。
【図１３】ＦＳ内読み出し処理サブプログラムの処理フローの一例を示す図である。
【図１４】ＦＳ内スナップショット生成サブプログラムの処理フローの一例を示す図である。
【図１５】ＦＳ内スナップショット削除サブプログラムの処理フローの一例を示す図である。
【図１６】本発明が適用されるシステムのハードウェア構成の他の一例を示す図である。
【図１７】先行コピー付スナップショット管理プログラムの一構成例を示す図である。
【図１８】先行コピー付スナップショット管理テーブルの一例を示す図である。
【図１９】先行コピー付スナップショット生成サブプログラムの処理フローの一例を示す図である。
【図２０】先行コピー付読み出し処理サブプログラムの処理フローの一例を示す図である。
【図２１】先行コピー付書き込み処理サブプログラムの処理フローの一例を示す図である。
【図２２】先行コピー付書き込み処理サブプログラムの処理フローの他の一例を示す図である。
【図２３】本発明が適用されるシステムのハードウェア構成の他の一例を示す図である。
【符号の説明】
１０１    サーバ装置
１１１    ＣＰＵ
１１２    ネットワークＩ／Ｆ
１１３    ストレージＩ／Ｆ
１１４    メモリ
１１５    ディスク装置１
１１６    ディスク装置２
１１７    バックアップ装置
１２１    ファイルサーバプログラム
１２２    データ保護プログラム
１２３    ファイルシステム処理プログラム
１２４    スナップショット管理プログラム
１３１    クライアント
１３２    クライアント
２０１    書き込み処理サブプログラム
２０２    読み出し処理サブプログラム
２０３    スナップショット生成サブプログラム
２０４    スナップショット削除サブプログラム
２１１    スナップショット管理テーブル
２１２    差分ブロック管理テーブル
【図１】
2004342050.tif 000003
【図２】
2004342050.tif 000004
【図３】
2004342050.tif 000005
【図４】
2004342050.tif 000006
【図５】
2004342050.tif 000007
【図６】
2004342050.tif 000008
【図７】
2004342050.tif 000009
【図８】
2004342050.tif 000010
【図９】
2004342050.tif 000011
【図１０】
2004342050.tif 000012
【図１１】
2004342050.tif 000013
【図１２】
2004342050.tif 000014
【図１３】
2004342050.tif 000015
【図１４】
2004342050.tif 000016
【図１５】
2004342050.tif 000017
【図１６】
2004342050.tif 000018
【図１７】
2004342050.tif 000019
【図１８】
2004342050.tif 000020
【図１９】
2004342050.tif 000021
【図２０】
2004342050.tif 000022
【図２１】
2004342050.tif 000023
【図２２】
2004342050.tif 000024
【図２３】
2004342050.tif 000025