(57)【要約】【課題】通常動作中におけるオーバーヘッドの低減を図ると共に、指定された任意の時点のスナップショットを効率よく作成する。【解決手段】ブロックを更新する際に、更新対象のブロックの更新前データが、当該ブロックを含むファイルまたはディレクトリを識別するための識別子（ｉノード番号）および当該ブロックのブロック番号と共にログ記憶領域１１３に更新前イメージとして書き出され、そしてその後にファイルシステム上の更新対象のブロックが更新される。スナップショットは、ログ記憶領域１１３に蓄積されている更新前イメージとファイルシステムの現在のイメージとに基づいて、更新されたブロックを含むファイル／ディレクトリの更新前の内容と、その更新前のファイル／ディレクトリを含む上位ディレクトリのディレクトリ情報とを復元することによって生成される。【選択図】  図３
2004157958.tif 000002
【特許請求の範囲】
【請求項１】
２次記憶装置上でファイルを階層構造で管理するファイルシステムを有する計算機システムにおいて、
前記ファイルシステムの更新履歴を蓄積するためのログ記憶手段と、
前記ファイルシステムで使用される前記２次記憶装置上のブロックの内容を更新する際に、そのブロックの更新前の内容を、当該ブロックを含むファイルまたはディレクトリを識別するための識別子および当該ブロックのブロック番号と共に前記ログ記憶手段に更新前イメージとして格納する更新前イメージ格納手段と、
前記更新前イメージを前記ログ記憶手段に格納した後、前記ブロックを更新する手段と、
前記ログ記憶手段に蓄積されている更新前イメージと前記ファイルシステムの現在のイメージとに基づいて、前記更新されたブロックを含むファイルまたはディレクトリの更新前の内容と、当該更新前のファイルまたはディレクトリを含む上位ディレクトリのディレクトリ情報とを復元することにより、過去の所定の時点における前記ファイルシステムのイメージを示すスナップショットを生成するスナップショット生成手段とを具備することを特徴とする計算機システム。
【請求項２】
前記ログ記憶手段は不揮発性の記憶装置から構成されていることを特徴とする請求項１記載の計算機システム。
【請求項３】
前記更新前イメージ格納手段は、
前記ファイルシステムで使用される前記２次記憶装置上のブロックの内容を更新する際に、その更新が、前記スナップショットを生成すべき所定の時点以降における当該ブロックに対する最初の更新であるかどうかを判別する手段と、
前記更新が前記スナップショットを生成すべき所定の時点以降における当該ブロックに対する最初の更新である場合にのみ、当該ブロックに関する更新前イメージを前記ログ記憶手段に格納する処理を実行する手段とを含むことを特徴とする請求項１記載の計算機システム。
【請求項４】
前記スナップショット生成手段は、
前記更新されたブロックの更新前の内容を保持する第１の代替ブロックを前記２次記憶装置の空きブロックを用いて新たに生成する手段と、
前記更新されたブロックを含むファイルまたはディレクトリを管理するための管理情報を保持する前記ファイルシステム上の現在のイメージ上における管理情報ブロックの内容と前記第１の代替ブロックのブロック番号とに基づいて、前記管理情報が前記更新されたブロックの代わりに前記第１の代替ブロックへのリンク情報を持つように前記管理情報を修正し、当該修正された管理情報を保持する第２の代替ブロックを前記２次記憶装置の空きブロックを用いて新たに生成する手段と、
前記更新されたブロックのファイルまたはディレクトリが属する上位ディレクトリを保持する前記ファイルシステム上の現在のイメージ上におけるブロックの内容と前記第２の代替ブロックのブロック番号とに基づいて、前記上位ディレクトリが前記管理情報ブロックの代わりに前記第２の代替ブロックへのリンク情報を持つように前記上位ディレクトリのディレクトリ情報を修正し、当該修正されたディレクトリ情報を保持する第３の代替ブロックを前記２次記憶装置の空きブロックを用いて新たに生成する手段とを含むことを特徴とする請求項１記載の計算機システム。
【請求項５】
２次記憶装置上でファイルを階層構造で管理するファイルシステムを有する計算機システムにおいて、
前記ファイルシステムの更新履歴を蓄積するためのログ記憶手段と、
前記ファイルシステムのファイルまたはディレクトリを更新する度にその更新前イメージを前記ログ記憶手段に順次格納する更新前イメージ格納手段であって、更新対象のファイルまたはディレクトリを示す識別子および前記更新対象のファイルまたはディレクトリ内における更新対象ブロックを示すブロック番号を、前記更新対象ブロックの更新前データと共に、前記ログ記憶手段に前記更新前イメージとして格納する更新前イメージ格納手段と、
前記更新前イメージを前記ログ記憶手段に格納した後、前記ファイルシステムの前記更新対象ブロックを更新する手段と、
前記ログ記憶手段に蓄積されている更新前イメージと前記ファイルシステムの現在のイメージとに基づいて、前記蓄積されている更新前イメージ毎に、その識別子およびブロック番号で指定されるファイルまたはディレクトリ内における前記更新されたブロックの更新前の内容を含むブロックと、当該ファイルまたはディレクトリからルートディレクトリに至るまでの各ディレクトリの情報を含むブロックを、前記２次記憶装置の空きブロック番号を用いて新たに生成することにより、過去の所定の時点における前記ファイルシステムのイメージを示すスナップショットを生成するスナップショット生成手段とを具備することを特徴とする計算機システム。
【請求項６】
前記更新前イメージ格納手段は、
前記ファイルシステムで使用される前記２次記憶装置上のブロックの内容を更新する際に、その更新が、前記スナップショットを生成すべき所定の時点以降における当該ブロックに対する最初の更新であるかどうかを判別する手段と、
前記更新が前記スナップショットを生成すべき所定の時点以降における当該ブロックに対する最初の更新である場合にのみ、当該ブロックに関する更新前イメージを前記ログに格納する処理を実行する手段とを含むことを特徴とする請求項５記載の計算機システム。
【請求項７】
２次記憶装置上でファイルを階層構造で管理する計算機システム内のファイルシステムに関する過去の所定の時点におけるスナップショットを生成するためのファイル管理方法であって、
前記ファイルシステムで使用される前記２次記憶装置上のブロックの内容を更新する際に、そのブロックの更新前の内容を、当該ブロックを含むファイルまたはディレクトリを識別するための識別子および当該ブロックのブロック番号と共に、更新前イメージとして前記ファイルシステムの更新履歴を蓄積するためのログ記憶手段に格納する更新前イメージ格納ステップと、
前記更新前イメージを前記ログ記憶手段に格納した後、前記ブロックを更新するステップと、
前記ログ記憶手段に蓄積されている更新前イメージと前記ファイルシステムの現在のイメージとに基づいて、前記更新されたブロックを含むファイルまたはディレクトリの更新前の内容と、当該更新前のファイルまたはディレクトリを含む上位ディレクトリのディレクトリ情報とを復元することにより、過去の所定の時点における前記ファイルシステムのイメージを示すスナップショットを生成するスナップショット生成ステップとを具備することを特徴とするファイル管理方法。
【請求項８】
前記ログ記憶手段は不揮発性の記憶装置から構成されていることを特徴とする請求項７記載のファイル管理方法。
【請求項９】
前記更新前イメージ格納ステップは、
前記ファイルシステムで使用される前記２次記憶装置上のブロックの内容を更新する際に、その更新が、前記スナップショットを生成すべき所定の時点以降における当該ブロックに対する最初の更新であるかどうかを判別するステップと、
前記更新が前記スナップショットを生成すべき所定の時点以降における当該ブロックに対する最初の更新である場合にのみ、当該ブロックに関する更新前イメージを前記ログ記憶手段に格納する処理を実行するステップとを含むことを特徴とする請求項７記載のファイル管理方法。
【請求項１０】
前記スナップショット生成ステップは、
前記更新されたブロックの更新前の内容を保持する第１の代替ブロックを前記２次記憶装置の空きブロックを用いて新たに生成するステップと、
前記更新されたブロックを含むファイルまたはディレクトリを管理するための管理情報を保持する前記ファイルシステム上の現在のイメージ上における管理情報ブロックの内容と前記第１の代替ブロックのブロック番号とに基づいて、前記管理情報が前記更新されたブロックの代わりに前記第１の代替ブロックへのリンク情報を持つように前記管理情報を修正し、当該修正された管理情報を保持する第２の代替ブロックを前記２次記憶装置の空きブロックを用いて新たに生成するステップと、
前記更新されたブロックのファイルまたはディレクトリが属する上位ディレクトリを保持する前記ファイルシステム上の現在のイメージ上におけるブロックの内容と前記第２の代替ブロックのブロック番号とに基づいて、前記上位ディレクトリが前記管理情報ブロックの代わりに前記第２の代替ブロックへのリンク情報を持つように前記上位ディレクトリのディレクトリ情報を修正し、当該修正されたディレクトリ情報を保持する第３の代替ブロックを前記２次記憶装置の空きブロックを用いて新たに生成するステップとを含むことを特徴とする請求項７記載のファイル管理方法。
【請求項１１】
２次記憶装置上でファイルを階層構造で管理する計算機システム内のファイルシステムに関する過去の所定の時点におけるスナップショットを生成するためのファイル管理方法であって、
前記ファイルシステムのファイルまたはディレクトリを更新する度にその更新前イメージを、前記ファイルシステムの更新履歴を蓄積するためのログ記憶手段に順次格納する更新前イメージ格納ステップであって、更新対象のファイルまたはディレクトリを示す識別子および前記更新対象のファイルまたはディレクトリ内における更新対象ブロックを示すブロック番号を、前記更新対象ブロックの更新前データと共に、前記ログ記憶手段に前記更新前イメージとして格納する更新前イメージ格納ステップと、
前記更新前イメージを前記ログ記憶手段に格納した後、前記ファイルシステムの前記更新対象ブロックを更新するステップと、
前記ログ記憶手段に蓄積されている更新前イメージと前記ファイルシステムの現在のイメージとに基づいて、前記蓄積されている更新前イメージ毎に、その識別子およびブロック番号で指定されるファイルまたはディレクトリ内における前記更新されたブロックの更新前の内容を含むブロックと、当該ファイルまたはディレクトリからルートディレクトリに至るまでの各ディレクトリの情報を含むブロックを、前記２次記憶装置の空きブロック番号を用いて新たに生成することにより、過去の所定の時点における前記ファイルシステムのイメージを示すスナップショットを生成するスナップショット生成ステップとを具備することを特徴とするファイル管理方法。
【請求項１２】
前記更新前イメージ格納ステップは、
前記ファイルシステムで使用される前記２次記憶装置上のブロックの内容を更新する際に、その更新が、前記スナップショットを生成すべき所定の時点以降における当該ブロックに対する最初の更新であるかどうかを判別するステップと、
前記更新が前記スナップショットを生成すべき所定の時点以降における当該ブロックに対する最初の更新である場合にのみ、当該ブロックに関する更新前イメージを前記ログ記憶手段に格納する処理を実行するステップとを含むことを特徴とする請求項１１記載のファイル管理方法。
【請求項１３】
ディレクトリを含むファイルを階層構造で管理する計算機システム内のファイルシステムに関する過去の所定の時点におけるスナップショットを生成するためのプログラムであって、
前記ファイルシステムで使用される前記２次記憶装置上のブロックの内容を更新する際に、そのブロックの更新前の内容を、当該ブロックを含むファイルまたはディレクトリを識別するための識別子および当該ブロックのブロック番号と共に、更新前イメージとして前記ファイルシステムの更新履歴を蓄積するためのログ記憶手段に格納する更新前イメージ格納手順と、
前記更新前イメージを前記ログ記憶手段に格納した後、前記ブロックを更新する手順と、
前記ログ記憶手段に蓄積されている更新前イメージと前記ファイルシステムの現在のイメージとに基づいて、前記更新されたブロックを含むファイルまたはディレクトリの更新前の内容と、当該更新前のファイルまたはディレクトリを含む上位ディレクトリのディレクトリ情報とを復元することにより、過去の所定の時点における前記ファイルシステムのイメージを示すスナップショットを生成するスナップショット生成手順とを前記計算機システムに実行させることを特徴とするプログラム。
【請求項１４】
前記更新前イメージ格納手順は、
前記ファイルシステムで使用される前記２次記憶装置上のブロックの内容を更新する際に、その更新が、前記スナップショットを生成すべき所定の時点以降における当該ブロックに対する最初の更新であるかどうかを判別する手順と、
前記更新が前記スナップショットを生成すべき所定の時点以降における当該ブロックに対する最初の更新である場合にのみ、当該ブロックに関する更新前イメージを前記ログ記憶手段に格納する処理を実行する手順とを含むことを特徴とする請求項１３記載のプログラム。
【請求項１５】
前記スナップショット生成手順は、
前記更新されたブロックの更新前の内容を保持する第１の代替ブロックを前記２次記憶装置の空きブロックを用いて新たに生成する手順と、
前記更新されたブロックを含むファイルまたはディレクトリを管理するための管理情報を保持する前記ファイルシステム上の現在のイメージ上における管理情報ブロックの内容と前記第１の代替ブロックのブロック番号とに基づいて、前記管理情報が前記更新されたブロックの代わりに前記第１の代替ブロックへのリンク情報を持つように前記管理情報を修正し、当該修正された管理情報を保持する第２の代替ブロックを前記２次記憶装置の空きブロックを用いて新たに生成する手順と、
前記更新されたブロックのファイルまたはディレクトリが属する上位ディレクトリを保持する前記ファイルシステム上の現在のイメージ上におけるブロックの内容と前記第２の代替ブロックのブロック番号とに基づいて、前記上位ディレクトリが前記管理情報ブロックの代わりに前記第２の代替ブロックへのリンク情報を持つように前記上位ディレクトリのディレクトリ情報を修正し、当該修正されたディレクトリ情報を保持する第３の代替ブロックを前記２次記憶装置の空きブロックを用いて新たに生成する手順とを含むことを特徴とする請求項１３記載のプログラム。
【請求項１６】
ディレクトリを含むファイルを階層構造で管理する計算機システム内のファイルシステムに関する過去の所定の時点におけるスナップショットを生成するためのプログラムであって、
前記ファイルシステムのファイルまたはディレクトリを更新する度にその更新前イメージを、前記ファイルシステムの更新履歴を蓄積するためのログ記憶手段に順次格納する更新前イメージ格納手順であって、更新対象のファイルまたはディレクトリを示す識別子および前記更新対象のファイルまたはディレクトリ内における更新対象ブロックを示すブロック番号を、前記更新対象ブロックの更新前データと共に、前記ログ記憶手段に前記更新前イメージとして格納する更新前イメージ格納手順と、
前記更新前イメージを前記ログ記憶手段に格納した後、前記ファイルシステムの前記更新対象ブロックを更新する手順と、
前記ログ記憶手段に蓄積されている更新前イメージと前記ファイルシステムの現在のイメージとに基づいて、前記蓄積されている更新前イメージ毎に、その識別子およびブロック番号で指定されるファイルまたはディレクトリ内における前記更新されたブロックの更新前の内容を含むブロックと、当該ファイルまたはディレクトリからルートディレクトリに至るまでの各ディレクトリの情報を含むブロックを、前記２次記憶装置の空きブロック番号を用いて新たに生成することにより、過去の所定の時点における前記ファイルシステムのイメージを示すスナップショットを生成するスナップショット生成手順とを前記計算機システムに実行させるプログラム。
【請求項１７】
前記更新前イメージ格納手順は、
前記ファイルシステムで使用される前記２次記憶装置上のブロックの内容を更新する際に、その更新が、前記スナップショットを生成すべき所定の時点以降における当該ブロックに対する最初の更新であるかどうかを判別する手順と、
前記更新が前記スナップショットを生成すべき所定の時点以降における当該ブロックに対する最初の更新である場合にのみ、当該ブロックに関する更新前イメージを前記ログ記憶手段に格納する処理を実行する手順とを含むことを特徴とする請求項１６記載のプログラム。
【請求項１８】
２次記憶装置上でファイルを階層構造で管理するファイルシステムを有する計算機システムにおいて、
前記ファイルシステムの更新履歴を蓄積するためのログ記憶手段と、
前記ファイルシステムで使用される前記２次記憶装置上のブロックの内容を更新する際に、そのブロックの更新前の内容を、当該ブロックのブロック番号と共に前記ログ記憶手段に更新前イメージとして格納する更新前イメージ格納手段と、
前記更新前イメージを前記ログ記憶手段に格納した後、前記ブロックを更新する手段と、
過去の所定の時点における前記ファイルシステムのイメージを示すスナップショットを生成する際、読み出し要求されたブロック毎に、その読み出し要求で指定されるブロック番号に対応するブロックの更新前イメージが前記ログ記憶手段に蓄積されているか否かに応じて当該ブロックに関する更新前イメージまたは前記ファイルシステムにおける現在のイメージを選択的に読み出すことにより、前記更新されたブロックを含むファイルまたはディレクトリの更新前の内容を復元するスナップショット生成手段とを具備することを特徴とする計算機システム。
【請求項１９】
２次記憶装置上でファイルを階層構造で管理する計算機システム内のファイルシステムに関する過去の所定の時点におけるスナップショットを生成するためのファイル管理方法であって、
前記ファイルシステムで使用される前記２次記憶装置上のブロックの内容を更新する際に、そのブロックの更新前の内容を、当該ブロックのブロック番号と共にログ記憶手段に更新前イメージとして格納する更新前イメージ格納ステップと、
前記更新前イメージを前記ログ記憶手段に格納した後、前記ブロックを更新するステップと、
過去の所定の時点における前記ファイルシステムのイメージを示すスナップショットを生成する際、読み出し要求されたブロック毎に、その読み出し要求で指定されるブロック番号に対応するブロックの更新前イメージが前記ログ記憶手段に蓄積されているか否かに応じて当該ブロックに関する更新前イメージまたは前記ファイルシステムにおける現在のイメージを選択的に読み出すことにより、前記更新されたブロックを含むファイルまたはディレクトリの更新前の内容を復元するスナップショット生成ステップとを具備することを特徴とするファイル管理方法。
【請求項２０】
ディレクトリを含むファイルを階層構造で管理する計算機システム内のファイルシステムに関する過去の所定の時点におけるスナップショットを生成するためのプログラムであって、
前記ファイルシステムで使用される前記２次記憶装置上のブロックの内容を更新する際に、そのブロックの更新前の内容を、当該ブロックのブロック番号と共にログ記憶手段に更新前イメージとして格納する更新前イメージ格納手順と、
前記更新前イメージを前記ログ記憶手段に格納した後、前記ブロックを更新する手順と、
過去の所定の時点における前記ファイルシステムのイメージを示すスナップショットを生成する際、読み出し要求されたブロック毎に、その読み出し要求で指定されるブロック番号に対応するブロックの更新前イメージが前記ログ記憶手段に蓄積されているか否かに応じて当該ブロックに関する更新前イメージまたは前記ファイルシステムにおける現在のイメージを選択的に読み出すことにより、前記更新されたブロックを含むファイルまたはディレクトリの更新前の内容を復元するスナップショット生成手順とを前記計算機システムに実行させることを特徴とするプログラム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は計算機システムおよび同計算機システムで用いられるファイル管理方法に関し、特に過去のある所定の時点におけるファイルシステムのイメージを示すスナップショットを生成可能な計算機システムおよびファイル管理方法に関する。
【０００２】
【従来の技術】
一般に、サーバコンピュータなどとして利用される計算機システムにおいては、その計算機システムに障害が発生した場合でも、ファイルシステムの一貫性を保持することが必要とされる。また、ファイルシステムの容量が大きい場合でも、障害からの復旧に時間がかからないことも要求される。
【０００３】
近年、これらの要求を満たすファイルシステムが幾つか提案されている。例えば、従来では、コピーオンライト（ＣＯＷ）技術とロギング技術を用いることにより、システム障害時におけるファイルシステムの一貫性の保持と高速なリカバリを実現するファイルシステムが知られている（例えば、非特許文献１参照。）。
【０００４】
また、コピーオンライト（ＣＯＷ）技術とロギング技術に加え、ｉノードをファイルとしてディスク上の任意の位置に記録することによって、前述の特徴の他に、指定した時点でのファイルシステムのイメージを記録する技術も知られている（例えば、特許文献１参照。）。
【０００５】
これら従来の方法で使用されているコピーオンライト技術では、ｉノードなどのメタデータブロックやデータブロックを変更する時点でメタデータブロックやデータブロックを新規に作成し、作成したブロックに以前のブロックの内容をコピーし、コピーしたブロックの内容を変更するという方式を採用している。
【０００６】
【非特許文献１】
“Ｔｈｅ  Ｅｐｉｓｏｄｅ  Ｆｉｌｅ  Ｓｙｓｔｅｍ”  Ｓａｉｌｅｓｈ  Ｃｈｕｔａｎｉ，  Ｏｗｅｎ  Ｔ．  Ａｎｄｅｒｓｏｎ，  Ｍｉｃｈａｅｌ  Ｌ．  Ｋａｚａｒ，  Ｂｒｕｃｅ  Ｗ．  Ｌｅｖｅｒｅｔｔ，  Ｗ．  Ａｎｔｈｏｎｙ  Ｍａｓｏｎ，  Ｒｏｂｅｒｔ  Ｎ．  Ｓｉｄｅｂｏｔｈａｍ  Ｐｒｏｃｅｅｄｉｎｇｓ  ｏｆ  ｔｈｅ  Ｗｉｎｔｅｒ  ＵＳＥＮＩＸ  １９９２  Ｔｅｃｈｎｉｃａｌ  Ｃｏｎｆｅｒｅｎｃｅ，  Ｊａｎ  １９９２，  ｐ．４３−５９
【０００７】
【特許文献１】
特表平８−５１１３６７号公報
【０００８】
【発明が解決しようとする課題】
しかし、この方式では、元のブロックの内容は変更されずにそのまま保持されるため、過去の時点のスナップショットを容易に保存することができる反面、ファイルシステムの通常動作中に新たなブロックの生成やデータのコピーといった煩雑な処理を行うことが必要となる。
【０００９】
また実際には、更新対象のブロックのみならず、そのブロックを含むファイルまたはディレクトリの階層構造上の上位ディレクトリのブロックをも含めてコピーすることが必要となり、ファイル書き込み時のオーバーヘッドは非常に大きなものとなる。
【００１０】
さらに、ディスク上には、現在のファイルシステムのディレクトリ／ファイルに関する情報のみならず、ファイルシステムの更新処理の進行に伴って何世代にも渡るファイルシステムそれぞれに対応したディレクトリ／ファイルに関する情報が存在することとなる。よって、スナップショットを保存するためにファイルシステム上の多くのブロックを消費するという問題がある。
【００１１】
本発明は上述の事情を考慮してなされたものであり、通常動作中におけるオーバーヘッドの低減を図ることができ、且つ何世代にも渡るファイルシステムそれぞれに対応したディレクトリ／ファイルに関する情報をファイルシステム内に構築することなく、指定された任意の時点のスナップショットを作成することが可能な計算機システムおよびファイル管理方法を提供することを目的とする。
【００１２】
【課題を解決するための手段】
上述の課題を解決するため、本発明は、２次記憶装置上でファイルを階層構造で管理するファイルシステムを有する計算機システムにおいて、前記ファイルシステムの更新履歴を蓄積するためのログ記憶手段と、前記ファイルシステムで使用される前記２次記憶装置上のブロックの内容を更新する際に、そのブロックの更新前の内容を、当該ブロックを含むファイルまたはディレクトリを識別するための識別子および当該ブロックのブロック番号と共に前記ログ記憶手段に更新前イメージとして格納する更新前イメージ格納手段と、前記更新前イメージを前記ログ記憶手段に格納した後、前記ブロックを更新する手段と、前記ログ記憶手段に蓄積されている更新前イメージと前記ファイルシステムの現在のイメージとに基づいて、前記更新されたブロックを含むファイルまたはディレクトリの更新前の内容と、当該更新前のファイルまたはディレクトリを含む上位ディレクトリのディレクトリ情報とを復元することにより、過去の所定の時点における前記ファイルシステムのイメージを示すスナップショットを生成するスナップショット生成手段とを具備することを特徴とする。
【００１３】
この計算機システムにおいては、ブロックを更新する際に、更新対象のブロックの更新前データが、当該ブロックを含むファイルまたはディレクトリを識別するための識別子および当該ブロックのブロック番号と共にログ記憶手段に書き出され、そしてその後に更新対象のブロックが更新される。このようにして、ファイルシステムのブロック更新の度に、どのファイルまたはディレクトリ内のどのブロックが更新されたかを示す管理情報と更新前の内容とを含む更新前イメージがログ記憶手段に順次書き込まれていく。
【００１４】
ファイルシステムのブロックは更新され、ファイルシステムには最新の状態に対応するファイル／ディレクトリのブロックだけが存在することとなる。スナップショットは、ログ記憶手段に蓄積されている更新前イメージとファイルシステムの現在のイメージとに基づいて生成される。更新されたブロックの更新前の内容とそのブロックがどのファイルまたはディレクトリ内のどのブロックであるかが各更新前イメージから判り、またファイルシステムの現在のイメージから当該ファイルまたはディレクトリを構成する現在のブロックの内容および当該ファイルまたはディレクトリと上位ディレクトリとの関係が判る。よって、ログ記憶手段に蓄積されている更新前イメージとファイルシステムの現在のイメージとに基づいて、更新されたブロックを含むファイルまたはディレクトリの更新前の内容と、当該更新前のファイルまたはディレクトリを含む上位ディレクトリのディレクトリ情報とを復元することにより、過去の所定の時点におけるファイルシステムのイメージを示すスナップショットを生成することが可能となる。
【００１５】
したがって、何世代にも渡るファイルシステムそれぞれに対応したディレクトリ／ファイルに関する情報をファイルシステム内に構築することなく、必要なときにのみ、指定された任意の時点のスナップショットを作成することが可能となる。
【００１６】
また、本発明は、２次記憶装置上でファイルを階層構造で管理するファイルシステムを有する計算機システムにおいて、前記ファイルシステムの更新履歴を蓄積するためのログ記憶手段と、前記ファイルシステムで使用される前記２次記憶装置上のブロックの内容を更新する際に、そのブロックの更新前の内容を、当該ブロックのブロック番号と共に前記ログ記憶手段に更新前イメージとして格納する更新前イメージ格納手段と、前記更新前イメージを前記ログ記憶手段に格納した後、前記ブロックを更新する手段と、過去の所定の時点における前記ファイルシステムのイメージを示すスナップショットを生成する際、読み出し要求されたブロック毎に、その読み出し要求で指定されるブロック番号に対応するブロックの更新前イメージが前記ログ記憶手段に蓄積されているか否かに応じて当該ブロックに関する更新前イメージまたは前記ファイルシステムにおける現在のイメージを選択的に読み出すことにより、前記更新されたブロックを含むファイルまたはディレクトリの更新前の内容を復元するスナップショット生成手段とを具備することを特徴とする。
【００１７】
この構成においても、読み出し要求されたブロックに関する更新前イメージまたはファイルシステムにおける現在のイメージを選択的に読み出すことにより、更新されたブロックを含むファイルまたはディレクトリの更新前の内容を復元することができる。
【００１８】
【発明の実施の形態】
以下、図面を参照して本発明の実施形態を説明する。
図１には、本発明の第１実施形態に係る計算機システムの構成が示されている。この計算機システムは、例えばサーバコンピュータなどのコンピュータシステムとして使用されるものである。以下、このコンピュータシステム１１のファイルシステムについて説明する。
【００１９】
ファイル管理システム１１１はディスク記憶装置（ＤＩＳＫ）などの２次記憶装置１１２上でファイルシステムを管理するためのものであり、コンピュータプログラムによって実現されている。ここで、ファイルシステムとは、２次記憶装置１１２上でファイルを階層構造で管理するためのデータ構造を意味する。２次記憶装置１１２上の記憶領域は物理的なブロックに分割されている。各ブロックのデータサイズは例えば５１２バイトである。以下では、ＵＮＩＸ（Ｒ）のファイルシステムを例示してその構成を説明することとする。
【００２０】
ファイルシステムを管理するために、２次記憶装置１１２上には、図示のように、ブートブロック、スーパーブロック、ｉノードリスト領域、およびデータ領域が割り当てられている。ブートブロックは、ブートローダプログラムの格納に使用される領域である。スーパーブロックは、空きブロックのリストなどの情報を格納するために利用される。
【００２１】
ｉノードリスト領域は、ファイルシステム内の個々のファイル／ディレクトリに関する情報を保持するｉノードの集合を格納するためのブロック群である。ｉノードは、それに対応する個々のファイル／ディレクトリを管理するためのデータ構造である。ｉノードには、それに対応するファイル（ディレクトリもファイルの一種である）に関する管理情報として、１）ファイルの種類（通常ファイル、ディレクトリファイル等）、２）アクセス権、３）ファイルを構成する個々のブロックのブロック番号を示すアドレス情報、等が保持されている。
【００２２】
ｉノードが格納された個々のｉノードブロックは、それに対応するｉノード番号によって参照される。ｉノード番号はファイルシステム内の個々のファイル／ディレクトリを一意に識別するためのファイル識別子であり、対応するファイル／ディレクトリのｉノードを索引するためのインデックスとして使用される。
【００２３】
データ領域は、ファイル／ディレクトリの実体が保持されるブロック群である。ディレクトリを保持するブロックには、当該ディレクトリに対応するｉノード番号、およびその上位ディレクトリに対応するｉノード番号に加え、当該ディレクトリ内に属する各ファイルまたはディレクトリに対応するｉノード番号がディレクトリ情報として含まれている。
【００２４】
ファイル管理システム１１１は、上述のような２次記憶装置１１２上のデータ構造を用いてファイルを階層構造で管理する。このファイル管理システム１１１は、過去の任意の時点のファイルシステムのイメージであるスナップショットを必要に応じて作成できるようにするために、更新前情報取得部２０１、およびスナップショット生成部２０２を備えている。
【００２５】
更新前情報取得部２０１は、ファイルシステムの更新履歴をログ記憶領域１１３にシーケンシャルに蓄積する。ログ記憶領域１１３は不揮発性の記憶装置であり、本コンピュータシステム１１がパワーオフされてもその記憶内容は消失されない。ログ記憶領域１１３は、例えば、２次記憶装置１１２とは異なる専用の記憶装置、またはファイルシステムとして利用されていない２次記憶装置１１２上の記憶領域を用いて実現されている。ログ記憶領域１１３は、管理情報記憶領域と、更新前データイメージ記憶領域とに分割されている。
【００２６】
更新前情報取得部２０１は、２次記憶装置１１２上のブロックの内容が更新される際に、そのブロックの更新前の内容を、当該ブロックを含むファイルまたはディレクトリを識別するための識別子（ｉノード番号）および当該ブロックのブロック番号と共に、ログ記憶領域１１３に書き出す。この場合、ｉノード番号およびブロック番号は、ブロックの更新種別（変更、削除、追加等）を示すフラグと共に管理情報記憶領域に更新管理情報として格納され、またブロックの更新前の内容は、更新前データイメージ記憶領域に格納される。このようにして、ファイルシステムのブロック更新の度に、どのファイルまたはディレクトリ内のどのブロックが更新されたかを示す更新管理情報と更新前のデータ内容とを含む更新前イメージがログ記憶領域１１３に順次書き込まれていく。
【００２７】
スナップショット生成部２０２は、ログ記憶領域１１３に蓄積されている更新前イメージとファイルシステムの現在のイメージとに基づいて、指定された過去の任意の時点のファイルシステムのイメージを示すスナップショットを生成する。この場合、スナップショットを生成すべき時点から現在までの間にログ記憶領域１１３に蓄積された更新前イメージが利用される。ログ記憶領域１１３内の最後尾の更新前イメージから順次参照しながら、更新されたファイル／ディレクトリの更新前の内容と、その更新前のファイル／ディレクトリを含む上位ディレクトリのディレクトリ情報とを復元していくことにより、指定された過去の任意の時点のスナップショットのイメージを作成することが出来る。
【００２８】
スナップショットのイメージは２次記憶装置１１２上で復元することも可能であるが、通常、コンピュータシステム１１の主記憶上には、ｉノードリスト領域のコピーであるｉノードリスト２０３と各ディレクトリの情報のコピーであるディレクトリ情報２０４とが存在しており、それら情報からフィルシステムの現在のイメージを認識することが出来る。よって、主記憶上の情報を用いて、その主記憶上で過去の任意の時点のファイルシステムのイメージをスナップショットとして生成することも可能である。
【００２９】
次に、図２および図３を参照して、ファイル管理システム１１１が更新前情報取得部２０１を用いて実行する更新前イメージの書き出し処理について説明する。
【００３０】
ここでは、図２のようなツリー構造のファイルシステムにおいて、ディレクトリａの配下に存在するファイルｂの内容を更新する場合について説明する。
【００３１】
図３は、２次記憶装置１１２上に構築されたファイルシステムのデータ構造を示している。
ｉノードリスト領域には、ルートディレクトリのｉノード、ディレクトリａのｉノード、ファイルｂのｉノード、等が存在し、またデータ領域には、ルートディレクトリ、ディレクトリａ、ファイルｂそれぞれの実体を記憶したデータブロックが存在する。
【００３２】
通常、ファイルは１以上のデータブロックから構成されており、ファイルｂの管理情報を保持する管理情報ブロックであるｉノードブロックには、ファイルｂのデータの実体を構成しているデータブロックそれぞれのブロック番号（ここでは、ブロック番号９８、１００、１１０）へのリンクを持つポインタがアドレス情報として含まれている。
【００３３】
同様に、ルートディレクトリのｉノードブロックにはルートディレクトリのディレクトリ情報を保持するデータブロックを示すブロック番号が含まれており、そのルートディレクトリのデータブロック内にはそのカレントディレクトリであるルートディレクトリのｉノードブロックを示すｉノード番号（ここでは、３）と、その配下に存在するディレクトリａのｉノードブロックを示すｉノード番号（ここでは、４）がディレクトリ情報として含まれている。
【００３４】
また、ディレクトリａの管理情報を保持するｉノードブロックにはディレクトリａのデータブロックを示すブロック番号が含まれており、そのディレクトリａのデータブロック内には、その上位ディレクトリであるルートディレクトリのｉノードブロックを示すｉノード番号（ここでは、３）と、カレントディレクトリであるディレクトリａのｉノードブロックを示すｉノード番号（ここでは、４）と、ディレクトリａ配下のファイルｂのｉノードブロックを示すｉノード番号（ここでは、５）がディレクトリ情報として含まれている。
【００３５】
いま、ｉノード番号５に対応するファイルｂ内のブロック１００を更新する場合を考える。この場合、ブロック１００の更新に先立ち、ファイルｂのｉノード番号５、更新対象のブロック番号１００、および更新種別が変更であることを示すフラグ情報（Ｍ）からなる更新管理情報と、ブロック１００の更新前データとがログ記憶領域１１３に格納される。
【００３６】
図４のフローチャートには、ファイル／ディレクトリの更新時にファイル管理システム１１１によって実行される一連の処理手順が示されている。
【００３７】
ファイル管理システム１１１は、オペレーティングシステムやアプリケーションプログラムからのファイル操作要求等によってファイル／ディレクトリの内容を更新する必要が生じた場合（ステップＳ１０１のＹＥＳ）、まず、当該更新対象のファイル／ディレクトリのファイル／ディレクトリ名からそれに対応するｉノード番号をサーチし、その更新対象のファイル／ディレクトリのｉノードブロックを取得する（ステップＳ１０２）。
【００３８】
次いで、ファイル管理システム１１１は、取得したｉノードブロックに含まれるアドレス情報から更新対象のファイル／ディレクトリの実体を保持する各データブロックを認識する（ステップＳ１０３）。ｉノード番号５に対応するファイルｂ内のブロック１００を更新する場合を考える。この場合、ファイル管理システム１１１は、更新前情報取得部２０１を用いて、更新管理情報（ｉノード番号＝５、ブロック番号＝１００、フラグ情報＝Ｍ）と、ブロック番号１００のブロックの更新前の内容とを、更新前イメージとしてログ記憶領域１１３に書き込む（ステップＳ１０４，Ｓ１０５）。ログ記憶領域１１３に書き出している途中でブロック１００の内容が変更されるのを防ぐため、ログ記憶領域１１３への書き込みを実行する前にブロック１００をロックする。ログ記憶領域１１３への書き込みが終了すると、ブロック１００のロックを解除する。
【００３９】
この後、ファイル管理システム１１１は、ブロック番号１００のブロックの内容を例えばｂからｂ’に更新する（ステップＳ１０６）。この更新により、ファイルシステムは常に最新の状態に維持される。
【００４０】
図５には、ログ記憶領域１１３に多数の更新前イメージ（更新前情報）が蓄積されている様子が示されている。
【００４１】
スナップショットを作成可能な時点をＴＩＭＥ１，ＴＩＭＥ２，ＴＩＭＥ３，…とする。例えば、２４時間ノンストップで稼働するコンピュータシステムにおいて、毎日１２：００の時点におけるスナップショットを生成可能にする場合、２４時間間隔でＴＩＭＥ１，ＴＩＭＥ２，ＴＩＭＥ３が設定される。本日の１２：００の時点におけるスナップショットを生成する場合には、ＴＩＭＥ３以降からカレントタイムまでに蓄積された更新前イメージ（更新前情報）が最後尾から順に用いられる。また、昨日の１２：００の時点におけるスナップショットを生成する場合にはＴＩＭＥ２以降からカレントタイムまでに蓄積された更新前イメージ（更新前情報）が最後尾から順に用いられ、一昨日の１２：００の時点におけるスナップショットを生成する場合にはＴＩＭＥ１以降からカレントタイムまでに蓄積された更新前イメージ（更新前情報）が最後尾から順に用いられることとなる。
【００４２】
次に、図６を参照して、ファイルシステムの現在のイメージとログ記憶領域１１３の更新前イメージとを利用してスナップショットを作成する処理について説明する。
【００４３】
ログ記憶領域１１３に蓄積されている更新前イメージの更新管理情報から、ｉノード番号５に対応するファイルｂのブロック１００が更新されたことが判る。
【００４４】
（１）変更前のファイルｂ用のデータブロックの作成
ここでは、更新されたブロック１００に代わる新たなブロックを作成するために、データ領域上に空きブロック（ここでは、ブロック番号１７０）を確保し、ログ記憶領域１１３に記憶されているブロック１００の更新前データｂをブロック番号１７０にコピーする。
【００４５】
（２）変更前のファイルｂ用のｉノードブロックの作成
次いで、変更前のファイルｂに対応する新たなｉノードブロックを生成するために、ｉノードリスト領域上に空きブロックを確保する。そして、更新されたファイルｂを管理するための管理情報を保持するファイルｂの現在のｉノードブロックの内容をカレントファイルシステムから取得する。取得したファイルｂのｉノードブロックに含まれる管理情報の内、更新されたブロック１００へのリンクを示すアドレス情報は修正され、ブロック番号１７０へのリンクを示すように書き換えられる。修正された管理情報は、ｉノードリスト領域上に確保された空きブロックに書き込まれ、これによってブロック番号９８、１７０、１１０から構成される変更前のファイルｂを管理するためのｉノードブロック、つまり現在のファイルｂのｉノードブロックに代わる、１世代前のファイルｂ（−）に対応するｉノードブロック、が生成される。１世代前のファイルｂ（−）には新たなｉノード番号（ここでは、３０）が割り当てられる。
【００４６】
（３）（４）変更前のファイルｂを含む上位ディレクトリのディレクトリ情報の復元
次に、変更前のファイルｂを含む上位ディレクトリａのディレクトリ情報の復元が行われる。まず、上位ディレクトリａのディレクトリ情報を保持する現在のディレクトリａのデータブロックに代わる新たなデータブロックを作成するために、データ領域上に空きブロックを確保する。そして、ディレクトリａの現在のデータブロックの内容をカレントファイルシステムから取得する。取得したディレクトリａのディレクトリ情報の内、その配下に存在する現在のファイルｂのｉノードブロックへのリンクを示すアドレス情報については修正され、変更前のファイルｂ（−）のｉノードブロックへのリンクを示すように書き換えられる。すなわち、現在のファイルｂのｉノードブロックを示すｉノード番号５から、１世代前のｂ（−）のｉノードブロックを示すｉノード番号３０に変更される。
【００４７】
修正されたディレクトリ情報は、データ領域上の空きブロックに書き込まれ、これによって変更前のファイルｂ（−）を含む上位ディレクトリａ（−）のデータブロックが生成される。
【００４８】
また、ｉノードリスト領域上の空きブロックを用いて、上位ディレクトリａ（−）のｉノードブロックも生成される。この場合、ディレクトリａの現在のｉノードブロックの管理情報をカレントファイルシステムから取得する。取得したディレクトリａの管理情報の内、現在のディレクトリａのブロックへのリンクを示すアドレス情報については修正され、ディレクトリａ（−）のデータブロックへのリンクを示すように書き換えられる。修正された管理情報は、ｉノードリスト領域上に確保された空きブロックに書き込まれ、これによって１世代前のディレクトリａ（−）のｉノードブロックが生成される。この１世代前のディレクトリａ（−）には、新たなｉノード番号（ここでは、２９）が割り当てられる。
【００４９】
ディレクトリａ（−）のデータブロックに保持されているカレントディレクトリのｉノード番号は、現在のディレクトリａのｉノード番号４から、ディレクトリａ（−）のｉノード番号２９に変更される。
【００５０】
（５）（６）次に、最上位のディレクトリである現在のルートディレクトリに代わる新たなルートディレクトリのデータブロックを作成するために、データ領域上に空きブロックを確保する。そして、ルートディレクトリの現在のデータブロックの内容をカレントファイルシステムから取得する。取得したルートディレクトリのディレクトリ情報の内、その配下に存在する現在のディレクトリａのｉノードブロックへのリンクを示すアドレス情報については修正され、１世代前のディレクトリａ（−）のｉノードブロックへのリンクを示すように書き換えられる。すなわち、現在のディレクトリａのｉノードブロックを示すｉノード番号４から、１世代前のａ（−）のｉノードブロックを示すｉノード番号２９に変更される。修正されたディレクトリ情報は、データ領域上の空きブロックに書き込まれ、これによって１世代前のルートディレクトリ（−）のブロックが生成される。
【００５１】
また、ｉノードリスト領域上の空きブロックを用いて、１世代前のルートディレクトリ（−）のｉノードブロックも生成される。この場合、現在のルートディレクトリのｉノードブロックの管理情報をカレントファイルシステムから取得する。取得したルートディレクトリの管理情報の内、現在のルートディレクトリのブロックへのリンクを示すアドレス情報については修正され、１世代前のルートディレクトリ（−）のブロックへのリンクを示すように書き換えられる。修正された管理情報は、ｉノード領域上の空きブロックに書き込まれ、これによって１世代前のルートディレクトリ（−）のｉノードブロックが生成される。この１世代前のルートディレクトリ（−）には、新たなｉノード番号（ここでは、２８）が割り当てられる。ルートディレクトリ（−）のデータブロックに保持されているカレントディレクトリのｉノード番号は、現在のルートディレクトリのｉノード番号３から、ルートディレクトリ（−）のｉノード番号２９に変更される。
【００５２】
このようにして、空きブロックを用いて変更前のファイルに対応するブロックとその上位ディレクトリに関するブロックとを作成することによって、更新されたファイルの更新前の内容と、当該変更前のファイルを含む上位ディレクトリのディレクトリ情報とを復元することにより、現在のファイルシステムのイメージをそのまま維持した状態で、過去の任意の時点のファイルシステムのイメージを示すスナップショットを生成することが可能となる。
【００５３】
図７のフローチャートには、スナップショット生成時にスナップショット生成部２０２によって実行される一連の処理手順が示されている。
【００５４】
スナップショット生成部２０２は、ログ記憶領域１１３の最後尾から更新前イメージを順に取得し（ステップＳ１１１）、そして指定された時点のスナップショットに関する全ての更新前イメージに対する処理が完了するまで、各更新前イメージ毎に以下の処理を再帰的に実行する（ステップＳ１１２）。
【００５５】
まず、スナップショット生成部２０２は、最後尾の更新前イメージの内容から、どのファイル／ディレクトリにおけるどのブロックが更新されたのかを認識し、その更新されたファイル／ディレクトリに対応する変更前のファイル／ディレクトリを復元するためのデータブロック（変更前ファイル／ディレクトリ用データブロック）をデータ領域上に新規作成する（ステップＳ１１３）。
【００５６】
例えば、上述の例では、ｉノード番号５に関連するファイルｂのブロック１００の内容が更新されたことがわかるので、更新されたブロック１００に代わる変更前ファイル／ディレクトリ用データブロックを空きブロックを利用して新規に作成し、ログ記憶領域１１３に記録されているブロック１００の更新前データの内容をこの新規作成した変更前ファイル／ディレクトリ用データブロックにコピーする。
【００５７】
次に、スナップショット生成部２０２は、更新されたファイル／ディレクトリに対応する変更前のファイル／ディレクトリを復元するためのｉノードブロック（変更前ファイル／ディレクトリ用ｉノードブロック）をｉノードリスト領域上に新規作成する（ステップＳ１１４）。
【００５８】
すなわち、スナップショット生成部２０２は、ファイルｂの現在のｉノードブロックの内容とステップＳ１１３で新規作成したデータブロックのブロック番号１７０とを使用して、変更されたファイルｂのｉノードの管理情報を修正し、それをｉノードリスト領域上に新規作成した変更前ファイル／ディレクトリ用ｉノードブロックにコピーする。
【００５９】
以上のステップＳ１１３，Ｓ１１４の処理は、上述の（１）（２）の処理に相当しており、これによって変更前のファイル／ディレクトリの内容が復元される。
【００６０】
この後、スナップショット生成部２０２は、変更前ファイル／ディレクトリを含む上位ディレクトリａ（−）用のデータブロックをデータ領域上に新規作成する（ステップＳ１１５）。ここでは、スナップショット生成部２０２は、更新されたファイルｂの上位ディレクトリａの現在のデータブロックの内容とステップＳ１１４で作成した変更前ファイル／ディレクトリ用ｉノードブロックのｉノード番号とに基づいて、上位ディレクトリａの現在のデータブロックの内容を修正し、それを新規作成したディレクトリａ（−）用のデータブロックにコピーする。
【００６１】
そして、スナップショット生成部２０２は、変更前ファイル／ディレクトリを含む上位ディレクトリａ（−）用のｉノードブロックをｉノードリスト領域上に新規作成する（ステップＳ１１６）。ここでは、スナップショット生成部２０２は、更新されたファイルｂの上位ディレクトリａの現在のｉノードブロックの内容とステップＳ１１５で作成した上位ディレクトリａ（−）用のデータブロックのブロック番号とに基づいて、上位ディレクトリａの現在のｉノードブロックの内容を修正し、それを新規作成したディレクトリａ（−）用のｉノードブロックにコピーする。
【００６２】
以上のステップＳ１１５，Ｓ１１６の処理は、上述の（３）（４）の処理に相当しており、これによって変更前のファイル／ディレクトリを含む上位ディレクトリの内容が復元される。そして、ルートディレクトリに遡るまで、ステップＳ１１５，Ｓ１１６の処理が各上位ディレクトリ毎に実行される（ステップＳ１１７）。これにより、更新前のファイル／ディレクトリからルートディレクトリに至るまでの各ディレクトリの情報を含むブロック（データブロック、ｉノードブロック）が新規作成され、変更前のファイルまたはディレクトリをルートディレクトリから参照するためのリンク情報が復元される。
【００６３】
次に、図８を参照して、スナップショットを作成すべき時点とログ記憶領域１１３に記録すべき更新前イメージとの関係について説明する。
【００６４】
スナップショットを作成すべき時点は１つのファイル更新タイミング毎に設定してもよいが、通常は、ある一定の時間間隔毎に設定される。この場合、同一のファイル／ディレクトリ内の同一ブロックの更新に際してはその更新前イメージをログ記憶領域１１３に逐次採取する必要はなく、スナップショットを作成すべき各時点を基準に、それ以降に最初に更新が行われる際にのみ当該更新に関する更新前イメージをログ記憶領域１１３に採取すればよい。
【００６５】
図８においては、ファイルｂのブロック１００の更新を○、ファイルｂのブロック９８の更新を△、ファイルＸのブロックＮの更新を□で示している。スナップショットを作成すべき時点ＴＩＭＥ１と次の時点ＴＩＭＥ２との間のファイル更新において、ファイルｂのブロック１００の更新が何度か繰り返された場合を想定する。復元すべきファイルイメージはＴＩＭＥ１であるので、ログ記憶領域１１３に更新前イメージを採取するのは、ＴＩＭＥ１以降における最初の更新時のみでよい。ＴＩＭＥ１の時点におけるファイルｂのブロック１００の内容をログ記憶領域１１３に採取することにより、ファイルｂのブロック１００の内容をＴＩＭＥ１の時点に復元することが出来るからである。他のファイル／ブロックについても同様である。
【００６６】
更新前イメージを採取すべきかどうかは、例えば、スナップショットを作成すべき前回の時点以降において、更新対象ブロックに対応する更新前イメージをログ記憶領域１１３に採取したかどうかを示す識別情報を該当するファイル／ディレクトリのｉノード構造体の中に保持したり、更新前イメージをログ記憶領域１１３に採取したブロックの一覧をテーブルに登録することによって、判断することが出来る。ファイル／ディレクトリの更新時における一連の処理手順を図９に示す。以下では、ｉノード構造体の中に識別情報を保持する場合を想定する。
【００６７】
ファイル管理システム１１１は、オペレーティングシステムやアプリケーションプログラムからのファイル操作要求等によってファイル／ディレクトリの内容を更新する必要が生じた場合（ステップＳ１２１のＹＥＳ）、まず、当該更新対象のファイル／ディレクトリのファイル／ディレクトリ名からそれに対応するｉノード番号をサーチし、その更新対象のファイル／ディレクトリのｉノードブロックを取得する（ステップＳ１２２）。
【００６８】
次いで、ファイル管理システム１１１は、取得したｉノードブロックに含まれるアドレス情報から更新対象のファイル／ディレクトリの実体を保持する各データブロックを認識する（ステップＳ１２３）。ｉノード番号５に対応するファイルｂ内のブロック１００を更新する場合を考える。この場合、ファイル管理システム１１１は、ｉノードブロックに含まれるｉノード構造体内に保持されている上述の識別情報から、スナップショットを作成すべき直前の時点以降において既に当該更新対象ブロックに関する更新前イメージがログ記憶領域１１３に記録済みであるかどうかを判断する（ステップＳ１２４）。
【００６９】
もし既に記録済みであるならば（ステップＳ１２４のＹＥＳ）、当該ブロックの更新は２回目以降の更新であるので、更新前イメージの採取は行わず、当該ブロックの更新処理を実行する（ステップＳ１２８）。
【００７０】
一方、記録されていない場合には（ステップＳ１２４のＮＯ）、当該ブロックの更新は最初の更新であるので、以下の処理を実行する。
【００７１】
すなわち、ファイル管理システム１１１は、更新前情報取得部２０１を用いて、更新管理情報（ｉノード番号＝５、ブロック番号＝１００、フラグ情報＝Ｍ）と、ブロック番号１００のブロックの更新前の内容とを、更新前イメージとしてログ記憶領域１１３に書き込む（ステップＳ１２５，Ｓ１２６）。次いで、ファイル管理システム１１１は、ブロック番号１００に関する更新前イメージが採取済みであることを示す識別情報をファイルｂのｉノード構造体に記録する（ステップＳ１２７）。
【００７２】
ログ記憶領域１１３に書き出している途中でブロック１００の内容が変更されるのを防ぐため、ログ記憶領域１１３への書き込みを実行する前にブロック１００をロックする。ログ記憶領域１１３への書き込みおよび識別情報の記録が終了すると、ブロック１００のロックを解除する。この後、ファイル管理システム１１１は、ブロック番号１００のブロックの内容を例えばｂからｂ’に更新する（ステップＳ１２８）。
【００７３】
なお、ｉノード構造体への識別情報の記録は、例えば、メモリ上に存在するｉノードリスト２０３上で行えば良い。ｉノードリスト２０３上の識別情報の内容は、次のスナップショットを作成すべき時点が到来した時にクリアされる。
【００７４】
次に、図１０乃至図１２を参照して、ファイルを削除するファイル更新処理を行った際におけるスナップショットの復元動作について説明する。
【００７５】
ここでは、図１０のようなツリー構造のファイルシステムにおいて、ディレクトリａの配下に存在するファイルｂ全体を削除する場合について説明する。
【００７６】
図１１は、２次記憶装置１１２上に構築されたファイルシステムのデータ構造を示している。ここでは、簡単のために、ファイルｂの実体が一つのデータブロックから構成されている場合を例示する。
【００７７】
ｉノード番号５に対応するファイルｂ全体を削除するファイル更新処理では、ファイルｂのデータブロック（ブロック番号１００）が削除されると共に、ファイルｂのｉノードブロック（ここでは、ブロック番号７とする）も削除される。これに伴い、ディレクトリａのデータブロック（ここでは、ブロック番号９０とする）に保持されているディレクトリ情報もａからａ’に更新され、ファイルｂのｉノードブロックへのリンク情報が削除される。このような一連のファイル更新処理操作の実行に先立ち、ログ記憶領域１１３への更新前イメージの登録処理が以下のように行われる。
【００７８】
まず、ファイルｂのデータブロック（ブロック番号１００）の更新に関する更新前イメージとして、ファイルｂのｉノード番号５、更新対象のブロック番号１００、および更新種別が削除であることを示すフラグ情報（Ｄ）からなる更新管理情報と、ブロック１００の更新前データとがログ記憶領域１１３に格納される。次に、ファイルｂのｉノードブロック（ブロック番号７）の更新に関する更新前イメージとして、ファイルｂのｉノード番号５、更新対象のブロック番号７、および更新種別が削除であることを示すフラグ情報（Ｄ）からなる更新管理情報と、ブロック７の更新前データとがログ記憶領域１１３に格納される。さらに、ディレクトリａの更新に関する更新前イメージとして、ディレクトリａのｉノード番号４、更新対象のブロック番号９０、および更新種別が変更であることを示すフラグ情報（Ｍ）からなる更新管理情報と、ブロック９０の更新前データとがログ記憶領域１１３に格納される。これら３つの更新前イメージは、ファイルｂの削除に関する１組の更新前イメージを構成する。
【００７９】
図１２には、ファイルシステムの現在のイメージとログ記憶領域１１３の更新前イメージとを利用してスナップショットが作成される様子が示されている。
【００８０】
ログ記憶領域１１３に蓄積されている３つの更新前イメージそれぞれ更新管理情報から、ｉノード番号５に対応するファイルｂが削除され、そのファイル削除に伴ってディレクトリａの内容が変更されたことが判る。
【００８１】
また、ログ記憶領域１１３には、更新前データとして、ファイルｂの変更前のデータ内容、ファイルｂの変更前のｉノードの内容、およびディレクトリａの変更前のデータ内容が蓄積されているので、それら変更前のデータの内容と、現在のファイルシステムイメージとから、図６と同様の手順で、削除前のファイルｂのデータブロック及びｉノードブロックと、削除前のファイルｂを含むディレクトリａのデータブロックおよびｉノードブロックと、そのディレクトリａを含むルートディレクトリのデータブロックおよびｉノードブロックを空き領域に新規作成することにより、ファイルｂの削除前のスナップショットを復元することが出来る。
【００８２】
以上のように、本第１実施形態によれば、ファイル／ディレクトリの変更前イメージをログ領域にシーケンシャルに書き込むことで、特定の時点でのファイルシステムのスナップショットイメージを復元することが可能になる。しかも、通常動作中のブロック更新時には、そのブロックのツリー構造の上位ディレクトリの内容をコピーする必要がないため、それによるオーバーヘッドを無くすことが出来る。
【００８３】
また、第１実施形態では、ファイルシステムのスナップショットイメージを２次記憶装置１１２上に復元することを前提としたが、読み出し要求されたブロックに関する更新前イメージまたはファイルシステムにおける現在のイメージを選択的に主記憶装置上に読み出すことにより、更新されたブロックを含むファイルまたはディレクトリの更新前の内容を復元することもできる。以下、この場合の例を本発明の第２実施形態として説明する。以下では、第１実施形態と異なる部分を主として説明することとする。
【００８４】
本第２実施形態においては、図１３に示されているように、読み出し要求されたブロックに関する更新前イメージをログ記憶領域１１３から高速に読み出せるようにするために、スナップショット用バッファ３０１と、このスナップショット用バッファ３０１を管理するためのスナップショット用バッファ管理テーブル３０２を使用する。
【００８５】
スナップショット用バッファ３０１は主記憶上に割り当てられたバッファエリアであり、ここにはログ記憶領域１１３に蓄積された更新前イメージが読み出される。
【００８６】
ここで、スナップショットイメージ生成部２０２によって実行されるスナップショットイメージ生成処理の原理について説明する。
【００８７】
本第２実施形態においては、過去の任意の時点のスナップショットイメージを生成する際には、そのスナップショットイメージの作成に必要な更新前イメージがログ記憶領域１１３から読み出されて、スナップショット用バッファ３０１に格納される。そして、ブロックの読み出し要求を受けるたびに、その読み出し要求で指定されたブロック番号のブロックに対応する更新前イメージが存在するか否かを判別することによって、カレントファイルシステムまたはスナップショット用バッファ３０１から該当するブロックが選択的に読み出される。
【００８８】
例えば、上述したようにファイルｂがブロック番号９８，１００，１１０の３つのデータブロックから構成されており、ブロック番号１００のブロックが更新されている場合を想定する。
【００８９】
ファイルｂの更新前イメージを復元することが利用者によって指定された場合、カレントファイルシステムで管理されているファイルｂのｉノードの内容に基づいて、ブロック番号９８，１００，１１０に対する読み出し要求が順次発行される。ブロック番号９８のブロックは更新されていないので、そのブロック番号９８に対応するブロックのデータが２次記憶装置１１２上のカレントファイルシステムから主記憶上に読み出される。ブロック番号１００のブロックは更新されているので、そのブロック番号１００のブロックの更新前データがスナップショット用バッファ３０１から主記憶上に読み出される。そして、ブロック番号１１０のブロックは更新されていないので、そのブロック番号１１０に対応するブロックのデータは２次記憶装置１１２上のカレントファイルシステムから主記憶上に読み出される。このようにして、ファイルｂの更新前の内容が復元される。
【００９０】
次に、図１５を参照して、スナップショット用バッファ管理テーブル３０２の具体的な構成例について説明する。
【００９１】
スナップショット用バッファ管理テーブル３０２には、ログ記憶領域１１３からスナップショット用バッファ３０１に読み出す各更新前イメージ毎に、ｉノード番号、ブロック番号、バッファのサイズ、更新前データの含まれるログ記憶領域１１３のオフセット、更新前データの含まれるバッファのアドレス、等を管理するためのエントリが存在する。
【００９２】
バッファのサイズは更新前データのデータサイズに相当するものであり、図１６に示すように、スナップショット用バッファ３０１上に確保される当該更新前データを保持するためのバッファエリアのサイズを示す。更新前データの含まれるバッファのアドレスは、図１６に示すように、スナップショット用バッファ３０１上に確保される当該更新前データを保持するためのバッファエリアのアドレスを示す。また、ログ記憶領域１１３のオフセットは、当該更新前データが記憶されているログ記憶領域１１３の先頭アドレスからのオフセット値を示す。
【００９３】
以下、これらスナップショット用バッファ３０１およびスナップショット用バッファ管理テーブル３０２を用いて実行される具体的な処理手順について説明する。
【００９４】
更新前情報取得部２０１によって実行されるログ記憶領域１１３への更新前イメージの書き出し処理については、第１実施形態と同様に、上述の図４のフローチャートに示す手順によって実行される。
【００９５】
スナップショットイメージを生成する際には、まず、スナップショット用バッファ管理テーブル３０２を作成する処理が実行される。図１７のフローチャートにはその手順が示されている。
【００９６】
すなわち、スナップショット生成部２０２は、ログ記憶領域１１３の最後尾から更新前イメージを順に取得し（ステップＳ２０１）、そして指定された時点のスナップショットに関する全ての更新前イメージに対する処理が完了するまで、各更新前イメージ毎に以下の処理を再帰的に実行する（ステップＳ２０２）。
【００９７】
まず、スナップショット生成部２０２は、最後尾の更新前イメージの内容から、更新されたブロックのｉノード番号、ブロック番号、更新前データのデータサイズ、およびその更新前データが記憶されているログ記憶領域１１３のオフセット値を取得し、それらをスナップショット用バッファ管理テーブル３０２に登録する（ステップＳ２０３）。
【００９８】
この時点ではログ記憶領域１１３にある更新前データは読み出さない。そして、ログ記憶領域１１３に記憶された更新前イメージを一つずつ遡りながら（ステップＳ２０４）、ステップＳ２０３の処理を順次実行する。これにより、復元すべき所定の過去の時点までの全ての更新前イメージに関する管理情報がスナップショット用バッファ管理テーブル３０２に登録される。
【００９９】
次に、図１８のフローチャートを参照して、スナップショット用バッファ管理テーブル３０２を用いて実行されるスナップショットイメージ生成処理の手順を説明する。
【０１００】
スナップショットイメージ生成処理は、個々のファイル／ディレクトリの過去のイメージの読み出し要求が発行される度にその都度実行される。すなわち、スナップショットイメージ上のファイルやディレクトリに対する読み出し要求が発生した場合には、カレントファイルシステムで管理されているファイルやディレクトリのｉノードを参照することにより、当該ファイル／ディレクトリを構成する各ブロックのブロック番号が取得される。そしてそのブロック番号に対するデータの読み出し要求がスナップショット生成部２０２に発行される。
【０１０１】
スナップショット生成部２０２は、データ読み出し要求を受け付けると（ステップＳ２１１）、スナップショット用バッファ管理テーブル３０２を検索して、読み出し要求で指定されたブロック番号のブロックがスナップショット用バッファ管理テーブル３０２に登録されているかどうかを判断する（ステップＳ２１２）。読み出し要求で指定されたブロック番号のブロックがスナップショット用バッファ管理テーブル３０２に登録されていないならば（ステップＳ２１２のＮＯ）、当該ブロックは更新されていないので、スナップショット生成部２０２はファイルシステムから現在のブロックを読み出し、それを要求元に返却する（ステップＳ２１３）。
【０１０２】
一方、読み出し要求で指定されたブロック番号のブロックがスナップショット用バッファ管理テーブル３０２に登録されているならば（ステップＳ２１２のＹＥＳ）、スナップショット生成部２０２は、以下の処理を実行する。
【０１０３】
すなわち、スナップショット生成部２０２は、スナップショット用バッファ管理テーブル３０２の該当するエントリにバッファアドレスが登録されているかどうかを調べることにより、読み出し要求で指定されたブロック番号の更新前データがスナップショット用バッファ３０１上に既に存在するか否かを判断する（ステップＳ２１４）。スナップショット用バッファ３０１上に既に存在する場合には（ステップＳ２１４のＹＥＳ）、スナップショット生成部２０２は、該当する更新前データをスナップショット用バッファ３０１から即座に読み出し、それを要求元に返却する（ステップＳ２１８）。
【０１０４】
スナップショット用バッファ３０１上に存在しない場合には（ステップＳ２１４のＮＯ）、スナップショット生成部２０２は、スナップショット用バッファ３０１上にバッファエリアを確保した後（ステップＳ２１５）、該当する更新前データをログ記憶領域１１３から読み出してバッファエリア上に書き込む（ステップＳ２１６）。そして、スナップショット生成部２０２は、バッファアドレスをスナップショット用バッファ管理テーブル３０２の該当するエントリに登録した後（ステップＳ２１７）、更新前データをスナップショット用バッファ３０１から読み出し、それを要求元に返却する（ステップＳ２１８）。
【０１０５】
以上のように、第２実施形態においては、読み出し要求されたブロックに関する更新前データまたはカレントファイルシステムにおける現在のデータを選択的に読み出すことにより、更新されたブロックを含むファイルまたはディレクトリの更新前の内容を復元することができる。
【０１０６】
また、上記第１実施形態では、２次記憶装置１１２上に用意した新たなブロックを用いて更新前データのブロックを復元しているので、復元されたスナップショットではｉノード番号が元のｉノード番号とは異なる結果となったが、第２実施形態においては、ブロック読み出し要求に応じてオンデマンドで更新前データを返却する仕組みであるので、更新前のファイルシステムのスナップショットイメージを、ｉノード番号を変更することなく復元することが可能となる。また、スナップショットイメージを２次記憶装置１１２上に作成する場合には、多くのディスクＩ／Ｏが発生するため、スナップショットイメージの復元に時間がかかるが、第２実施形態の方式によれば、読み出し要求されたファイル／ディレクトリの更新前イメージを高速に復元することができる。
【０１０７】
なお、以上の第２実施形態の説明においては、ブロックを変更する場合を例に取って説明したが、ブロックを追加または削除した場合についても同様にその復元を行うことが出来る。例えば、ファイルｂが削除された場合、ファイルｂの全データブロックおよびｉノードブロックそれぞれに関する更新前データと、上位ディレクトリａのデータブロックに関する更新前データとがログ記憶領域１１３に蓄積される。ディレクトリａの読み出し要求が発生すると、スナップショット用バッファ３０１を通じてログ記憶領域１１３からディレクトリａの更新前データが読み出される。ディレクトリａの更新前データには、削除されたファイルｂのｉノード番号が含まれており、そのｉノード番号からファイルｂのｉノードブロックのブロック番号が判る。ファイルｂのｉノードブロックに対する読み出し要求が発生すると、スナップショット用バッファ３０１を通じてログ記憶領域１１３からファイルｂのｉノードブロックに関する更新前データが読み出される。この更新前データにはファイルｂの全データブロックそれぞれのブロック番号が含まれているので、それらブロック番号に対する読み出し要求を発行することにより、ファイルｂの更新前イメージが復元されることとなる。
【０１０８】
また、第２実施形態の方式においては、更新対象のブロックに対応するｉノード番号についてはログ記憶領域１１３に蓄積せずとも、スナップショットイメージを生成することが出来る。
【０１０９】
また、スナップショット用バッファ管理テーブル３０２としては、配列を利用して実現する他、リンクリストやハッシュテーブルなどを利用して実現することもできる。さらに、スナップショット用バッファ管理テーブル３０２とスナップショット用バッファ３０１はログ記憶領域１１３に対するデータ読み出し速度の高速化を図るために設けたものであるので、これらスナップショット用バッファ管理テーブル３０２とスナップショット用バッファ３０１を用いずとも、読み出し要求されたブロックがログ記憶領域１１３に存在するかどうかを判別する事によって、スナップショットイメージを生成することが出来る。
【０１１０】
さらに、上記第１実施形態および第２実施形態それぞれに係るファイル管理システム１１１の機能はすべてコンピュータプログラムによって実現されているので、このプログラムをコンピュータ読み取り可能な記憶媒体を通じて通常のコンピュータに導入して実行するだけで、本第１実施形態および第２実施形態それぞれと同様の効果を得ることが出来る。
【０１１１】
また、本発明は、上記各実施形態に限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で種々に変形することが可能である。更に、上記各実施形態には種々の段階の発明が含まれており、開示される複数の構成要件における適宜な組み合わせにより種々の発明が抽出され得る。例えば、実施形態に示される全構成要件から幾つかの構成要件が削除されても、発明が解決しようとする課題の欄で述べた課題が解決でき、発明の効果の欄で述べられている効果が得られる場合には、この構成要件が削除された構成が発明として抽出され得る。
【０１１２】
【発明の効果】
以上詳述した如く本発明によれば、通常動作中におけるオーバーヘッドの低減を図ることができ、且つ何世代にも渡るファイルシステムそれぞれに対応したディレクトリ／ファイルに関する情報をファイルシステム内に構築することなく、指定された任意の時点のスナップショットを作成することが可能となる。
【図面の簡単な説明】
【図１】本発明の第１実施形態に係る計算機システムの構成を示すブロック図。
【図２】同第１実施形態の計算機システムで管理されているファイルシステムのツリー構造の例を示す図。
【図３】図２のファイルシステムが更新される場合における更新前イメージの記録動作を説明するための図。
【図４】同第１実施形態の計算機システムにおいてファイル更新処理時に実行される一連の処理手順を示すフローチャート。
【図５】同第１実施形態の計算機システムに設けられたログ記憶領域に多数の更新前イメージが蓄積された様子を示す図。
【図６】同第１実施形態の計算機システムにおけるスナップショットの作成処理の様子を示す図。
【図７】同第１実施形態の計算機システムにおけるスナップショット作成処理の手順を示すフローチャート。
【図８】同第１実施形態の計算機システムにおける更新前イメージの記録動作とスナップショットを作成すべき時点との関係を示す図。
【図９】同第１実施形態の計算機システムにおいてファイル更新処理時に実行される一連の処理手順を示すフローチャート。
【図１０】同第１実施形態の計算機システムで管理されているファイルシステムのツリー構造の例を示す図。
【図１１】図１０のファイルシステムが更新される場合における更新前イメージの記録動作を説明するための図。
【図１２】同第１実施形態の計算機システムにおけるスナップショットの作成処理の様子を示す図。
【図１３】本発明の第２実施形態に係る計算機システムで使用されるスナップショット用バッファとスナップショット用バッファ管理テーブルを説明するための図。
【図１４】同第２実施形態におけるスナップショットイメージ生成処理の原理を説明するための図。
【図１５】同第２実施形態で用いられるスナップショット用バッファ管理テーブルの構成例を示す図。
【図１６】同第２実施形態で用いられるスナップショット用バッファ上に確保されるバッファエリアを示す図。
【図１７】同第２実施形態においてスナップショット用バッファ管理テーブルを作成する処理の手順を示すフローチャート。
【図１８】同第２実施形態におけるスナップショットイメージ生成処理の手順を示すフローチャート。
【符号の説明】
１１…コンピュータシステム、１１１…ファイル管理システム、１１２…２次記憶装置、１１３…ログ記憶領域、２０１…更新前情報取得部、２０２…スナップショット生成部、２０３…ｉノードリスト、２０４…ディレクトリ情報、３０１…スナップショット用バッファ、３０２…スナップショット用バッファ管理テーブル。
【図１】
2004157958.tif 000003
【図２】
2004157958.tif 000004
【図３】
2004157958.tif 000005
【図４】
2004157958.tif 000006
【図５】
2004157958.tif 000007
【図６】
2004157958.tif 000008
【図７】
2004157958.tif 000009
【図８】
2004157958.tif 000010
【図９】
2004157958.tif 000011
【図１０】
2004157958.tif 000012
【図１１】
2004157958.tif 000013
【図１２】
2004157958.tif 000014
【図１３】
2004157958.tif 000015
【図１４】
2004157958.tif 000016
【図１５】
2004157958.tif 000017
【図１６】
2004157958.tif 000018
【図１７】
2004157958.tif 000019
【図１８】
2004157958.tif 000020