(57)【要約】  実施形態によれば、ファイルシステムは、ハッシュ値算出部とアクセスコントローラと重複排除コントローラとを備える。前記ハッシュ値算出部は、ストレージに格納されるべきファイルを構成する少なくとも１つのデータブロックのハッシュ値を算出する。前記アクセスコントローラは、前記少なくとも１つのデータブロックが第１のデータブロックを含み、且つ前記第１のデータブロックの第１のキャッシュ値が算出された場合、前記第１のハッシュ値を識別子として用いて、前記第１のハッシュ値に基づいて決定される前記ストレージの第１のロケーションに、前記第１のデータブロックを格納する。前記重複排除コントローラは、前記第１のロケーションに有効なデータブロックが既に格納されている場合、前記第１のデータブロックが前記第１のロケーションに格納されるのを抑止する。
2016038714.tif 000002
【特許請求の範囲】
【請求項１】
ストレージに格納されるべきファイルを構成する少なくとも１つのデータブロックのハッシュ値を算出するハッシュ値算出部と、
前記少なくとも１つのデータブロックが第１のデータブロックを含み、且つ前記第１のデータブロックの第１のキャッシュ値が算出された場合、前記第１のハッシュ値を識別子として用いて、前記第１のハッシュ値に基づいて決定される前記ストレージの第１のロケーションに、前記第１のデータブロックを格納するアクセスコントローラと、
前記第１のロケーションに有効な第２のデータブロックが既に格納されている場合、前記第１のデータブロックが前記第１のロケーションに格納されるのを抑止する重複排除コントローラと
を具備するファイルシステム。
【請求項２】
前記アクセスコントローラは、前記ファイルを、前記第１のデータブロックを含む複数のデータブロックに分割し、
前記ハッシュ値算出部は、前記複数のデータブロックそれぞれのハッシュ値を算出し、
前記重複排除コントローラは、前記複数のデータブロックそれぞれの算出されたハッシュ値に基づいて決定される前記ストレージのロケーションに、有効なデータブロックが格納されているかに基づいて、前記複数のデータブロックそれぞれの重複排除が必要であるかを判定し、
前記アクセスコントローラは、前記第１のデータブロックの重複排除が必要でないと判定された場合、前記第１のロケーションに前記第１のデータブロックを格納する
請求項１記載のファイルシステム。
【請求項３】
前記ファイルの前記複数のデータブロックそれぞれが格納される前記ストレージのロケーションを、前記ファイルに対応付けられたｉノードを用いて管理するファイル管理部を更に具備し、
前記アクセスコントローラは、前記ファイルの読み出しが必要な場合、前記ファイルに対応付けられた前記ｉノードに基づいて前記ファイルの前記複数のデータブロックそれぞれが格納される前記ストレージのロケーションを特定することにより、前記ストレージから前記複数のデータブロックを読み出す
請求項２記載のファイルシステム。
【請求項４】
前記ファイルに対応付けられたｉノードは、前記複数のデータブロックそれぞれの算出されたハッシュ値が記録されるブロック表を含む請求項３記載のファイルシステム。
【請求項５】
前記ハッシュ値算出部は、前記第１のロケーションから前記第１のデータブロックが読み出された場合に、当該読み出された第１のデータブロックのハッシュ値を算出し、
前記アクセスコントローラは、前記第１のデータブロックの前記重複排除が必要でないと判定された場合、前記第１のハッシュ値を含む前記第１のデータブロックのメタデータと前記第１のデータブロックとの組を前記第１のロケーションに格納し、前記第１のロケーションから前記第１のデータブロックが読み出され、且つ当該読み出された第１のデータブロックのハッシュ値が算出された場合、前記算出されたハッシュ値を前記第１のデータブロックの前記メタデータに含まれている前記第１のハッシュ値と比較することにより、前記第１のデータブロックの読み出しにおけるエラーを検出する
請求項３記載のファイルシステム。
【請求項６】
前記アクセスコントローラは、前記第２のデータブロックを前記第１のロケーションに格納する必要がある場合、前記第２のデータブロックのハッシュ値と同一のハッシュ値を持つデータブロックの数を示すのに用いられる重複カウントを含む前記第２のデータブロックのメタデータと前記第２のデータブロックとの組を前記第１のロケーションに格納し、
前記重複排除コントローラは、前記第１のデータブロックの前記重複排除が必要であると判定された場合、前記第１のロケーションに格納されている前記第２のデータブロックの前記メタデータ中の前記重複カウントを１増加する
請求項２記載のファイルシステム。
【請求項７】
前記ストレージに格納されたデータブロックそれぞれの複製を生成する複製コントローラを更に具備し、
前記複製コントローラは、前記第２のデータブロックの複製の数を、前記第２のデータブロックの前記メタデータ中の前記重複カウントに基づいて決定する請求項６記載のファイルシステム。
【請求項８】
前記アクセスコントローラは、前記第１のデータブロックの前記重複排除が必要でないと判定された場合、前記第１のデータブロックのハッシュ値と同一のハッシュ値を持つデータブロックの数を示すのに用いられる重複カウントを含む前記第１のデータブロックのメタデータと前記第１のデータブロックとの組を前記第１のロケーションに格納する請求項２記載のファイルシステム。
【請求項９】
前記ストレージはオブジェクトストレージであり、
前記オブジェクトストレージの前記第１のロケーションは、前記第１のデータブロックのメタデータと前記第１のデータブロックとの組を含む第１のオブジェクトのオブジェクト識別子に基づいて決定され、
前記アクセスコントローラは、前記第１のデータブロックの前記第１のハッシュ値を、前記第１のオブジェクトのオブジェクト識別子として用いて、前記第１のオブジェクトの前記オブジェクト識別子に基づいて決定される前記オブジェクトストレージの前記第１のロケーションに、前記第１のオブジェクトを格納する
請求項１記載のファイルシステム。
【請求項１０】
前記ストレージはブロックストレージであり、
前記ブロックストレージの前記第１のロケーションを指定する第１のアドレスは、前記第１のデータブロックの前記第１のハッシュ値の所定の一部を用いて表され、
前記アクセスコントローラは、前記第１のデータブロックのメタデータと前記第１のデータブロックとの組を、前記第１のアドレスで指定される前記ブロックストレージの前記第１のロケーションに格納する
請求項１記載のファイルシステム。
【請求項１１】
ファイルシステムに適用されるデータ重複排除方法であって、
ストレージに格納されるべきファイルを構成する少なくとも１つのデータブロックのハッシュ値を算出することと、
前記少なくとも１つのデータブロックが第１のデータブロックを含み、且つ前記第１のデータブロックの第１のキャッシュ値が算出された場合、前記第１のハッシュ値を識別子として用いて、前記第１のハッシュ値に基づいて決定される前記ストレージの第１のロケーションに、前記第１のデータブロックを格納することと、
前記第１のロケーションに有効な第２のデータブロックが既に格納されている場合、前記第１のデータブロックが前記第１のロケーションに格納されるのを抑止することと
を具備するデータ重複排除方法。
【請求項１２】
コンピュータに、
ストレージに格納されるべきファイルを構成する少なくとも１つのデータブロックのハッシュ値を算出することと、
前記少なくとも１つのデータブロックが第１のデータブロックを含み、且つ前記第１のデータブロックの第１のキャッシュ値が算出された場合、前記第１のハッシュ値を識別子として用いて、前記第１のハッシュ値に基づいて決定される前記ストレージの第１のロケーションに、前記第１のデータブロックを格納することと、
前記第１のロケーションに有効な第２のデータブロックが既に格納されている場合、前記第１のデータブロックが前記第１のロケーションに格納されるのを抑止することと
を実行させるためのファイルシステムのためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、ファイルシステム、データ重複排除方法、及びファイルシステムのためのプログラムに関する。
【背景技術】
【０００２】
近年、ストレージ装置に格納されるべきデータの量は増大の一途をたどっている。このため、ストレージ装置の限られた記憶容量を有効に利用する技術が要求されている。このような技術の１つとして、重複排除技術が注目されている。重複排除技術によれば、同一内容のデータが重複してストレージ装置に格納されるのを防止する。【０００３】
重複排除技術は、一般に、重複排除を実行する主体の違いにより２つに大別される。第１の重複排除技術はファイルシステムで適用され、第２の重複排除技術はストレージ装置で適用される。第１の重複排除技術は、内容の一致するファイルの全体もしくは一部を、ストレージ装置の同一ロケーションに記録する手法として知られている。一方、第２の重複排除技術は、内容の一致するブロックを一つにまとめてストレージ装置内に格納し、異なるアクセスパスから同一のブロックを参照させる手法として知られている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２００９−２５１７２５号公報
【特許文献２】特開２０１２−９３８２７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
第１の重複排除技術によれば、重複排除がファイルシステムによって実行されるため、ストレージ装置は重複排除のための特別な機能を必要としない。一方、第２の重複排除技術によれば、重複排除がストレージ装置（より詳細には、ストレージ装置のコントローラ）によって実行されるため、ファイルシステムは重複排除のための特別な機能を必要としない。【０００６】
しかし、第１の重複排除技術では、ファイルシステムにおいて重複排除のためのオーバヘッドが発生する。一方、第２の重複排除技術では、ストレージ装置において重複排除のためのオーバヘッドが発生する。しかも第２の重複排除技術では、ストレージ装置による重複の判定のために、全てのデータがファイルシステムによりストレージ装置に転送されることから、データ転送量は削減されない。【０００７】
本発明が解決しようとする課題は、重複排除に伴うオーバヘッドとデータ転送量とを減らすことができる、ファイルシステム、データ重複排除方法、及びファイルシステムのためのプログラムを提供することにある。
【課題を解決するための手段】
【０００８】
実施形態によれば、ファイルシステムは、ハッシュ値算出部と、アクセスコントローラと、重複排除コントローラとを具備する。前記ハッシュ値算出部は、ストレージに格納されるべきファイルを構成する少なくとも１つのデータブロックのハッシュ値を算出する。前記アクセスコントローラは、前記少なくとも１つのデータブロックが第１のデータブロックを含み、且つ前記第１のデータブロックの第１のキャッシュ値が算出された場合、前記第１のハッシュ値を識別子として用いて、前記第１のハッシュ値に基づいて決定される前記ストレージの第１のロケーションに、前記第１のデータブロックを格納する。前記重複排除コントローラは、前記第１のロケーションに有効な第２のデータブロックが既に格納されている場合、前記第１のデータブロックが前記第１のロケーションに格納されるのを抑止する。
【図面の簡単な説明】
【０００９】
【図１】図１は、１つの実施形態に係るコンピュータシステムの典型的な構成を示すブロック図である。
【図２】図２は、図１に示されるファイルシステムの主要な機能の概要を説明するための図である。
【図３】図３は、同実施形態においてファイルを構成する複数のブロックの管理に用いられるｉノードの構造の例を示す図である。
【図４】図４は、同実施形態で適用される、ブロックのオブジェクトのデータ構造例を示す図である。
【図５】図５は、同実施形態で適用される、タイプがディレクトリの２つのｉノードの例を示す図である。
【図６】図６は、同実施形態で適用されるファイル書き込み処理の典型的な手順を示すフローチャートである。
【図７】図７は、同実施形態で適用されるファイル読み出し処理の典型的な手順を示すフローチャートである。
【図８】図８は、同実施形態で適用されるファイル削除処理の典型的な手順を示すフローチャートである。
【発明を実施するための形態】
【００１０】
以下、種々の実施の形態につき図面を参照して説明する。  
図１は、１つの実施形態に係るコンピュータシステムの典型的な構成を示すブロック図である。図１に示されるコンピュータシステムは、ホストコンピュータ（以下、ホストと称する）１０と、ストレージ装置２０とから構成される。本実施形態において、ホスト１０及びストレージ装置２０は、ネットワーク３０を介して接続されている。
【００１１】
ホスト１０は、ファイルシステム１１及びオブジェクトコントローラ１２を備えている。本実施形態において、ファイルシステム１１及びオブジェクトコントローラ１２は、ＣＰＵ１０１、メモリ１０２及びローカルハードディスクドライブ（ＨＤＤ）１０３を含む共通のハードウェア構成を有している。しかし、ファイルシステム１１及びオブジェクトコントローラ１２が、それぞれ、ＣＰＵ、メモリ及びローカルＨＤＤを含む固有のハードウェア構成を有しても構わない。
【００１２】
ＣＰＵ１０１は、ファイルシステムプログラム及びオブジェクト制御プログラムを例えば時分割で実行することにより、ファイルシステム１１及びオブジェクトコントローラ１２それぞれの主コントローラとして機能する。ファイルシステムプログラム及びオブジェクト制御プログラムは予めローカルＨＤＤ１０３に格納されている。本実施形態では、ホスト１０の起動時にＣＰＵ１０１によって実行されるイニシャルプログラムローダ（ＩＰＬ）に従って、上述の両プログラムの少なくとも一部がメモリ１０２にロードされて、当該ＣＰＵ１０１によって用いられる。図１では省略されているが、ＩＰＬは、フラッシュＲＯＭのような不揮発性メモリに予め格納されている。
【００１３】
ストレージ装置２０は、ストレージ２１及びストレージコントローラ２２を備えている。本実施形態においてストレージ２１は、ＨＤＤアレイ、例えば複数のＨＤＤを用いて構成されるＲＡＩＤ（Redundant Arrays of Inexpensive DisksまたはRedundant Arrays of Independent Disks）アレイから構成される。なお、ストレージ２１が、複数のフラッシュメモリを用いて構成されるフラッシュアレイ（つまり、ＨＤＤアレイよりもアクセス速度が高速なフラッシュアレイ）であっても構わない。更にストレージ２１が、低速ストレージ（例えば、ＨＤＤアレイ）及び高速ストレージ（例えば、フラッシュアレイ）から構成される階層化ストレージであっても構わない。また、フラッシュアレイが、ＨＤＤとの互換性を有する複数のソリッドステートドライブ（ＳＳＤ）から構成されても構わない。更に、ストレージ２１が、必ずしもアレイ構造を有していなくても構わない。
【００１４】
ストレージコントローラ２２は、ホスト１０（より詳細には、ホスト１０のオブジェクトコントローラ１２）からのアクセス要求を受けて、ストレージ２１にアクセスする。ストレージコントローラ２２はまた、ストレージ２１の領域をブロックと呼ばれる塊を単位に管理する。ストレージコントローラ２２は更に、各ブロックの論理アドレス（論理ブロックアドレス）と、当該論理ブロックアドレスに割り当てられる物理アドレスとの対応を管理する。
【００１５】
次に、図１に示されるファイルシステム１１の主要な機能について、図２を参照して説明する。図２は、ファイルシステム１１の主要な機能の概要を説明するための図である。本実施形態においてストレージ装置２０のストレージ２１は、ファイルシステム１１からはオブジェクトストレージ２１０として認識されるものとする。オブジェクトストレージ２１０は一種の論理的なストレージであり、データ（例えば、ファイルのデータ）をオブジェクトを単位に格納するのに用いられる。本実施形態においてオブジェクトのサイズ（データ長）は可変長である。しかし、オブジェクトのサイズが固定長であっても構わない。
【００１６】
図２は、ホスト１０上で動作するアプリケーションからファイルシステム１１に対して、ファイルＦをオブジェクトストレージ２１０に格納することが要求された場合を前提とする。この場合、ファイルシステム１１の主コントローラ（つまり、ＣＰＵ１０１）は、ファイルＦを、図２において矢印Ａ１で示されるように、複数のデータブロック、例えば４つのデータブロック（以下、単にブロックと称する）Ｂ１，Ｂ２，Ｂ３及びＢ４に分割する。本実施形態においてブロックＢ１乃至Ｂ４のサイズは、固定長であるものとする。しかし後述のように、ブロックのサイズが可変長であっても構わない。
【００１７】
次にＣＰＵ１０１は、例えばＳＨＡ−２５６のような周知のハッシュ関数ＨＦを用いて、図２において矢印Ａ２で示されるように、ブロックＢ１，Ｂ２，Ｂ３及び至Ｂ４それぞれのハッシュ値Ｈ１，Ｈ２，Ｈ３及びＨ４を算出する。ハッシュ関数ＨＦがＳＨＡ−２５６である場合、ハッシュ値Ｈ１，Ｈ２，Ｈ３及びＨ４をそれぞれ構成するビットの数は２５６である。図２の例では、ハッシュ値Ｈ１，Ｈ２，Ｈ３及びＨ４は、それぞれ１２３４，３４５６，１２３４，及び５６２８である。つまり、ハッシュ値Ｈ１及びＨ３は同一である。
【００１８】
ここで、ハッシュ値Ｈ１及びＨ３に対応するブロックＢ１及びＢ３の内容が異なっていると仮定する。この場合、ハッシュ値を構成するビットの数を本実施形態のように十分大きく取るならば、ブロックＢ１及びＢ３のハッシュ値が同一となるような、いわゆるハッシュ値の衝突の可能性を限りなくゼロに近づけることができる。つまり、ストレージ装置２０の故障や当該ストレージ装置２０内でのデータ化けが発生する可能性と比較して、ハッシュ値の衝突の可能性は無視できるほど小さくできる。そこでＣＰＵ１０１は、上述のようにハッシュ値Ｈ１及びＨ３が同一である場合、ブロックＢ１及びＢ３の内容は同一であり、データが重複していると判定する。
【００１９】
ＣＰＵ１０１は、重複判定の結果に基づき、ハッシュ値Ｈ１（＝Ｈ３），Ｈ２及びＨ４をそれぞれ識別子（ＩＤ）として用いて、当該それぞれのＩＤに対応するブロックＢ１，Ｂ２及びＢ４を、図２において矢印Ａ３（より詳細には、矢印Ａ３１，Ａ３２及びＡ３４）に示されるように、オブジェクトストレージ２１０に格納する。このように、ブロックの格納にオブジェクトストレージが用いられる技術は、オブジェクトストレージ技術と呼ばれる。オブジェクトストレージ技術では、上述のＩＤ及びブロックは、それぞれ、オブジェクトＩＤ及びオブジェクトとして処理される。このオブジェクトは、ブロックに対応するオブジェクト、ブロックのオブジェクト、またはデータオブジェクトとも呼ばれる。本実施形態の特徴は、ＣＰＵ１０１が、ブロックのハッシュ値を、当該ブロックのオブジェクトを指し示すオブジェクトＩＤとして用いる点にある。
【００２０】
さて、上述のブロック格納においてＣＰＵ１０１は重複排除のために、同一ＩＤ（オブジェクトＩＤ）に対応するブロックを同一オブジェクトとして扱う。つまり、ＣＰＵ１０１は、同一内容のブロックＢ１及びＢ３を重複してオブジェクトストレージ２１０に格納するのを抑止する。図２の例では、オブジェクトストレージ２１０へのブロックの格納が、ファイルＦの先頭のブロックＢ１から開始されるものとする。この場合、ＣＰＵ１０１は、ブロックＢ３をオブジェクトストレージ２１０に格納するのを抑止する。これにより、オブジェクトストレージ２１０内でのブロックＢ１及びＢ３の重複が排除される。
【００２１】
次に、本実施形態で適用される、ファイルを構成するブロックを管理する仕組みについて説明する。本実施形態では、各ファイルは、Ｌｉｎｕｘ（登録商標）の仮想ファイルシステム（ＶＦＳ）の形式に従い、ｉノードを用いて管理される。
【００２２】
図３は、本実施形態において、ファイルＦｐを構成するｍ個のブロックＢｑ（ｑ＝０，１，…，ｍ−１）の管理に用いられるｉノードｉＮｐの構造の例を示す。説明の簡略化のために、ブロックＢｑそれぞれのサイズは一定であり、例えば４キロバイト（ＫＢ）であるものとする。ｉノードｉＮｐも、１つのオブジェクト（つまり、ｉノードｉＮｐのオブジェクト）として管理される。図３において、ｉノードｉＮｐは、ブロック表３１０を含む。ｉノードｉＮｐは更に、ファイルＦｐの属性を表す属性情報３２０を含む。ファイルＦｐの属性情報３２０は、ファイルＦｐのメタデータとも呼ばれる。ファイルＦｐの属性は、当該ファイルＦｐのサイズ、当該ファイルＦｐへのアクセスの権限、及びタイムスタンプを含む。タイムスタンプは、ファイルＦｐが最後にアクセスされた日時、ファイルＦｐが最後に変更された日時、及びファイルＦｐが作成された日時を含む。
【００２３】
ブロック表３１０は、ブロックＢｑのロケーションを示す情報（以下、ブロックロケーション情報と称する）を記録するのに用いられる。従来技術では、ブロックロケーション情報としてブロックＢｑのアドレスが用いられる。これに対して本実施形態では、ブロックロケーション情報としてブロックＢｑのハッシュ値Ｈｑが用いられる。
【００２４】
このため、本実施形態においてブロックＢｑは、当該ブロックＢｑのハッシュ値ＨｑをオブジェクトＩＤとして一意に決定される、オブジェクトストレージ２１０のロケーションに論理的に格納される。つまり本実施形態では、ブロックＢｑのハッシュ値Ｈｑが、当該ブロックＢｑのオブジェクトＯＢｑのオブジェクトＩＤとして用いられる。これにより、ブロックＢｑのオブジェクトＯＢｑは、当該オブジェクトＯＢｑのオブジェクトＩＤ（＝当該ブロックＢｑのハッシュ値Ｈｑ）によって一意に決定されるロケーションに論理的に格納される。
【００２５】
さて本実施形態では、ストレージ２１の物理記憶領域の少なくとも一部（以下、物理ボリュームと称する）は、一定サイズの小領域を単位に、ホスト１０によって認識される論理ボリュームにマッピングされる。そのためストレージコントローラ２２は、論理ボリューム内の小領域の論理アドレス（例えば、論理ブロックアドレス）と物理ボリューム内の小領域の物理アドレスとの対応を、アドレス管理テーブルを用いて管理する。
【００２６】
また本実施形態では、オブジェクトＯＢｑのオブジェクトストレージ２１０におけるロケーションは、論理ボリューム内の小領域列にマッピングされる。上述のように、このロケーションは、オブジェクトＯＢｑのオブジェクトＩＤによって指し示される。そのためオブジェクトコントローラ１２は、オブジェクトＯＢｑのオブジェクトＩＤと論理ボリューム内の小領域列の先頭小領域の論理ブロックアドレスＬＢＡｑとの対応を、オブジェクト管理テーブルを用いて管理する。オブジェクト管理テーブルは、例えばホスト１０のローカルＨＤＤ１０３に格納されている。論理ブロックアドレスＬＢＡｑを構成するビットの数は６４であるものとする。
【００２７】
ファイルシステム１１は、ブロックＢｑのオブジェクトＯＢｑの読み出し（または書き込み）を、オブジェクトコントローラ１２を介して次のように実行する。まずファイルシステム１１は、ブロックＢｑのハッシュ値Ｈｑを、当該ブロックＢｑのオブジェクトＯＢｑを指し示すオブジェクトＩＤとして用いて、当該オブジェクトＯＢｑの読み出し（または書き込み）をオブジェクトコントローラ１２に要求する。この要求に応じて、オブジェクトコントローラ１２は、ハッシュ値Ｈｑ（オブジェクトＩＤ）で一意に決定されるオブジェクトストレージ２１０のロケーションから（またはロケーションに）、オブジェクトＯＢｑを論理的に読み出す（または書き込む）。
【００２８】
但し、オブジェクトＯＢｑ（より詳細には、オブジェクトＯＢｑの内容）は、物理的には、ストレージ装置２０のストレージ２１から読み出される（またはストレージ２１に書き込まれる）必要がある。そこで、この物理的な読み出し（または書き込み）のために、オブジェクトコントローラ１２は、ブロックＢｑのオブジェクトＯＢｑのオブジェクトＩＤ（つまり、ブロックＢｑのハッシュ値Ｈｑ）に基づいてオブジェクト管理テーブルを参照する。これによりオブジェクトコントローラ１２は、オブジェクトＯＢｑのオブジェクトＩＤに対応付けられた論理ブロックアドレスＬＢＡｑを取得する。そしてオブジェクトコントローラ１２は、取得された論理ブロックアドレスＬＢＡｑとオブジェクトＯＢｑのサイズとに基づいて、当該オブジェクトＯＢｑの内容の読み出し（または書き込み）を、ストレージ装置２０のストレージコントローラ２２に要求する。
【００２９】
ストレージコントローラ２２はオブジェクトコントローラ１２からの要求に応じ、論理ブロックアドレスＬＢＡｑに基づいてアドレス管理テーブルを参照する。これによりストレージコントローラ２２は、論理ブロックアドレスＬＢＡｑに対応付けられた物理アドレスを取得する。そしてストレージコントローラ２２は、取得された物理アドレスとオブジェクトＯＢｑのサイズとで示される、ストレージ２１内のロケーションから（またはロケーションに）、当該オブジェクトＯＢｑの内容を読み出す（または書き込む）。以降の説明では、簡略化のために、オブジェクトの物理的な読み出しまたは書き込みに関する記載は省略する。
【００３０】
本実施形態において、ｉノードｉＮｐ（より詳細には、ｉノードｉＮｐのオブジェクト）のサイズは可変長であるものとする。このため本実施形態では、ファイルＦｐを構成する全てのブロックＢｑ（Ｂ０乃至Ｂｍ−１）のハッシュ値をｉノードｉＮｐのブロック表３１０に記録することが可能である。つまり図３では、例えばブロックＢ０，Ｂ１，…，Ｂｍ−２，Ｂｍ−１それぞれのハッシュ値Ｈ０，Ｈ１，…，Ｈｍ−２，Ｈｍ−１は、ブロック表３１０に記録される。この場合、ブロックＢ０，Ｂ１，…，Ｂｍ−２，Ｂｍ−１は、ブロック表３１０に記録されているハッシュ値Ｈ０，Ｈ１，…，Ｈｍ−２，Ｈｍ−１をＩＤとして決定されるロケーションに直接格納される。
【００３１】
なお、ｉノードｉＮｐのサイズが固定長であつても構わない。ここで、ファイルＦｐを構成するブロックＢｑの数をＮｐ、ブロック表３１０に記録可能なハッシュ値の数をＮｑと表記するものとする。まず、Ｎｐ≦Ｎｑであるならば、ＣＰＵ１０１は、全てのブロックＢｑを、ブロック表３１０を用いて直接管理することができる。これに対してＮｐ＞Ｎｑであるならば、ＣＰＵ１０１は、一部のブロックＢｑを、周知の間接ブロックを用いて管理すれば良い。ここで、ブロックＢｎ及びＢｎ＋１のハッシュ値Ｈｎ及びＨｎ＋１が間接ブロックＩＢｘを用いて管理されるものとする。この場合、ブロックＢｎ及びＢｎ＋１のハッシュ値Ｈｎ及びＨｎ＋１は、間接ブロックＩＢｘに記録され、ブロック表３１０には当該間接ブロックＩＢｘのハッシュ値Ｈｘが記録される。なお、従来技術では、ブロックＢｎ及びＢｎ＋１のアドレスが間接ブロックＩＢｘに記録され、当該間接ブロックＩＢｘのアドレスがブロック表３１０に記録される。
【００３２】
もし、間接ブロックＩＢｘを用いても、ｉノードｉＮｐのブロック表３１０で全てのブロックＢｑを管理できない場合、ＣＰＵ１０１は、例えば２段間接ブロック、或いは３段間接ブロックを利用すれば良い。この場合、ＣＰＵ１０１は、２段間接ブロック、或いは３段間接ブロックに、次段の間接ブロックのアドレスではなくて、次段の間接ブロックのハッシュ値を記録する。
【００３３】
図４は、本実施形態で適用される、上述のブロックＢｑのオブジェクトＯＢｑのデータ構造例を示す。オブジェクトＯＢｑは、オブジェクトストレージ２１０内のデータ領域に格納される。本実施形態では、データ領域は、ファイルシステム１１に割り当てられており、当該ファイルシステム１１により使用される。ホスト１０がファイルシステム１１を含む複数のファイルシステムを備えている場合、データ領域が、当該複数のファイルシステムにより共有されても良い。
【００３４】
なお、オブジェクトストレージ２１０内に複数のデータ領域、例えば、第１及び第２のデータ領域が用意されても良い。ここで、第１のファイルシステム（または、第１のファイルシステムの集合）が第１のデータ領域を利用し、第２のファイルシステム（または、第２のファイルシステムの集合）が第２のデータ領域を利用するものとする。また、第１のデータ領域に格納されるべき第１のオブジェクトのハッシュ値が、第２のデータ領域に既に格納されている第２のオブジェクトのハッシュ値と同一であるものとする。この場合、第１のファイルシステム（または各第１のファイルシステム）は、同一のハッシュ値であっても、第１のオブジェクトを第２のオブジェクトとは別のオブジェクトとして処理する。つまり、第２のオブジェクトが存在しても、第１のオブジェクトは重複排除の対象から外される。
【００３５】
一方、例えば、図３に示されるｉノードｉＮｐは、ｉノードオブジェクトとも呼ばれ、オブジェクトストレージ２１０内のｉノード領域に格納される。本実施形態では、ｉノード領域は、ファイルシステム１１に割り当てられており、当該ファイルシステム１１により使用される。ホスト１０がファイルシステム１１を含む複数のファイルシステムを備えている場合、当該複数のファイルシステムによりそれぞれ個別のｉノード領域が使用されても良い。
【００３６】
オブジェクトＯＢｑは、メタデータ４１０と実データ４２０とから構成される。オブジェクトＯＢｑの実データ４２０は、当該オブジェクトＯＢｑの実体である。オブジェクトＯＢｑが本実施形態のようにファイルＦｐのブロックＢｑに対応する場合、実データ４２０は、当該ブロックＢｑの内容に一致する。
【００３７】
一方、オブジェクトＯＢｑのメタデータ４１０は、当該オブジェクトＯＢｑに関する管理情報を示し、重複カウントＤＣＮＴｑを含む。重複カウントＤＣＮＴｑは参照カウントとも呼ばれ、実データ４２０に一致するブロックＢｑの数を示す。つまり重複カウントＤＣＮＴｑは、実データ４２０（ブロックＢｑ）のハッシュ値Ｈｑと同一のハッシュ値を持つブロックの数を示す。メタデータ４１０は更に、オブジェクトＯＢｑに固有のオブジェクトＩＤ、実データ４２０のサイズを示す情報、及び実データ４２０の格納先を示すアドレス（例えば、論理ブロックアドレス）を含む。オブジェクトＯＢｑのオブジェクトＩＤには、当該オブジェクトＯＢｑに対応するブロックＢｑのハッシュ値Ｈｑが用いられる。
【００３８】
ｉノードは、一般に複数のタイプに分類される。ｉノードの代表的なタイプとして、ファイル（より詳細には、通常ファイル）、及びディレクトリが知られている。タイプがファイルのｉノードは、ファイルを管理するのに用いられる。図３に示されるｉノードｉＮｐのタイプは、ファイルである。以下の説明では、タイプがファイルのｉノードがファイルｉノードと表記され、タイプがディレクトリのｉノードがディレクトリｉノードと表記されることもある。ｉノードは、当該ｉノードのタイプに無関係に、当該ｉノードに固有のｉノード番号を持つ。ｉノード（つまり、ｉノードオブジェクト）のｉノード番号は、当該ｉノードオブジェクトのオブジェクトＩＤとして用いられる。
【００３９】
図５は、本実施形態で適用される、タイプがディレクトリのｉノード５００の例を示す。ｉノード５００のサイズは、ｉノードｉＮｐのそれと同様に可変長であるものとする。ｉノード５００も、１つのオブジェクト（つまり、ｉノード５００のオブジェクト）として管理される。このため、ｉノード５００がｉノードオブジェクト５００と表記されることもある。ｉノード５００は、例えばｉノード番号ｉＮｄｎを持ち、ディレクトリエントリ表（以下、エントリ表と称する）５１０及び属性情報５２０を含む。エントリ表５１０は、ｉノード５００が指し示すディレクトリに含まれる全てのファイルの、ｉノード番号及びファイル名の組を記録するのに用いられる。ファイルが新規に作成される場合、当該ファイルが対応するｉノードのｉノード番号及び当該ファイルのファイル名の組が、ファイルシステム１１によって、例えばｉノード５００のエントリ表５１０の空きエントリに追加される。
【００４０】
なお、ファイルは通常のファイルではなく、ディレクトリであっても構わない。この場合、タイプがディレクトリのｉノード番号とディレクトリ名とをエントリ表５１０に記録する。また、ｉノード（ディレクトリｉノード）５００のサイズが固定長であっても構わない。この場合、ファイルシステム１１（ＣＰＵ１０１）は、ｉノード５００のエントリ表５１０に保持されるべきｉノード番号及びファイル名の組の集合を別の複数のオブジェクトに分散して記録し、当該別の複数のオブジェクトのＩＤ（つまり、ディレクトリエントリのリスト）をｉノード５００に記録しても良い。
【００４１】
ファイルシステム１１は、当該ファイルシステム１１の管理に特別のブロックを利用する。この特別のブロックは、スーパーブロックと呼ばれ、ファイルシステム１１が生成された際に生成される。スーパーブロックは、ファイルシステム１１の管理情報（以下、ファイルシステム管理情報と称する）を記録するのに用いられ、例えば、オブジェクトストレージ２１０内の、ｉノード領域に格納される。スーパーブロックも、オブジェクトとして管理される。このため、スーパーブロックには、特別のオブジェクトＩＤが割り当てられる。
【００４２】
ファイルシステム管理情報は、ｉノードリスト情報を含む。ｉノードリスト情報は、オブジェクトストレージ２１０のｉノード領域内に予め確保されるｉノード毎の格納先に関する情報（以下、ｉノード管理情報と称する）を含む。ｉノード管理情報は、対応するｉノードに固有のｉノード番号を含む。ファイルシステム１１は、ファイルシステム管理情報に含まれているｉノード管理情報を参照することにより、目的のｉノード番号をＩＤとして持つｉノードを特定することができる。
【００４３】
次に、本実施形態の動作について説明する。まず、ファイルシステム１１のＣＰＵ１０１によって実行されるファイル書き込み処理について、ファイルＦｐの書き込みを例に、図６を参照して説明する。図６は、本実施形態で適用されるファイル書き込み処理の典型的な手順を示すフローチャートである。ここでは説明の簡略化のために、ファイルＦｐのサイズは、４ＫＢの整数倍であるものとする。
【００４４】
今、ホスト１０内で実行されるアプリケーションプログラムからファイルシステム１１に対して、ファイルＦｐの書き込みが要求されたものとする。するとファイルシステム１１のＣＰＵ１０１は、ファイル書き込み処理を開始する。まずＣＰＵ１０１はファイルアクセスコントローラとして機能して、ファイルＦｐを、例えば４ＫＢのサイズを有する複数のブロックＢｑ（ｑ＝０，１，…）に分割する（ステップＳ１）。複数のブロックＢｑは、例えばメモリ１０２に格納される。ここでは、ブロックＢｑの数がｍであるものとする。
【００４５】
次にＣＰＵ１０１は、変数ｑ及びＱを、それぞれ０及びｍに初期設定する（ステップＳ２）。変数ｑは、ファイルＦｐにおけるブロックＢｑの相対位置を示す。変数Ｑは、分割されたブロックＢｑの数を示す。次にＣＰＵ１０１は、変数ｑ（＝０）で示されるブロックＢｑ（第１のブロック）をローカルＨＤＤ１０３から選択して、当該選択されたブロックＢｑをメモリ１０２のワーク領域に格納する。そしてＣＰＵ１０１はハッシュ値算出部として機能して、メモリ１０２のワーク領域に格納されたブロックＢｑの内容のハッシュ値Ｈｑを算出する（ステップＳ３）。するとＣＰＵ１０１は、ステップＳ４に進む。
【００４６】
ステップＳ４においてＣＰＵ１０１はファイル管理部として機能して、算出されたハッシュ値Ｈｑを、ファイルＦｐのファイル名と対応付けられたｉノード番号ｉＮｐｎを持つｉノードｉＮｐのブロック表３１０に、以下に述べるように記録する。まずＣＰＵ１０１は、ファイルＦｐのファイル名に基づいて、ｉノード５００ａのエントリ表５１０ａを参照する。これによりＣＰＵ１０１は、ファイルＦｐのファイル名と対応付けられたｉノード番号ｉＮｐｎを取得する。即ちＣＰＵ１０１は、ファイルＦｐのファイル名と対応付けられたｉノード番号ｉＮｐｎを、ｉノード５００ａのエントリ表５１０ａから探索する。
【００４７】
次にＣＰＵ１０１は、探索されたｉノード番号ｉＮｐｎをＩＤとして用いることにより、当該ｉノード番号ｉＮｐｎを持つｉノードｉＮｐを、オブジェクトストレージ２１０のｉノード領域から、オブジェクトコントローラ１２を介して読み出す。ＣＰＵ１０１は、読み出されたｉノードｉＮｐをメモリ１０２のワーク領域に格納する。そしてＣＰＵ１０１は、メモリ１０２のワーク領域に格納されたｉノードｉＮｐのブロック表３１０に、ブロックＢｑのハッシュ値Ｈｑを記録する。
【００４８】
次にＣＰＵ１０１は重複排除コントローラとして機能する。そしてＣＰＵ１０１は、ブロックＢｑのハッシュ値ＨｑをオブジェクトＩＤとして用いて、当該オブジェクトＩＤと同一のオブジェクトＩＤを持つオブジェクトＯＢｑの存在を次のように確認する（ステップＳ５）。即ちＣＰＵ１０１は、ブロックＢｑのハッシュ値ＨｑをオブジェクトＩＤとして用いて、当該ハッシュ値Ｈｑで一意に決まるオブジェクトストレージ２１０内のロケーションからのオブジェクトの読み出しを、オブジェクトコントローラ１２を介して実行する。そしてＣＰＵ１０１は、上述のロケーションに有効なオブジェクトが格納されていることを条件に、目的のオブジェクトＯＢｑが存在することを確認する。
【００４９】
次にＣＰＵ１０１は、目的のオブジェクトＯＢｑの確認の結果を判定する。即ちＣＰＵ１０１は、目的のオブジェクトＯＢｑが上述のロケーションに存在するかを判定する（ステップＳ６）。ここでは、目的のオブジェクトＯＢｑが上述のロケーションに存在しないものとする（ステップＳ６のＮｏ）。つまり、ブロックＢｑのハッシュ値Ｈｑで一意に決まるロケーション（第１のロケーション）に、当該ブロックＢｑと同一内容の有効なブロックが存在しないものとする。この場合、ＣＰＵ１０１は、ファイルシステム１１によって利用されるオブジェクトストレージ２１０内のデータ領域に格納されているブロックのいずれともブロックＢｑが重複しておらず、したがってブロックＢｑに関する重複排除は不要であると判断する。
【００５０】
するとＣＰＵ１０１は再びファイルアクセスコントローラとして機能する。そしてＣＰＵ１０１は、ブロックＢｑ（第１のブロック）を、ハッシュ値ＨｑをオブジェクトＩＤとして持つオブジェクトＯＢｑとして、上述のロケーションに書き込む（ステップＳ７）。この書き込みは、ＣＰＵ１０１からオブジェクトコントローラ１２にオブジェクトＯＢｑの書き込みを要求することにより、当該オブジェクトコントローラ１２によって実行される。
【００５１】
オブジェクトＯＢｑは、図４に示されるように、メタデータ４１０と実データ４２０とを含む。メタデータ４１０は、ハッシュ値Ｈｑに一致するオブジェクトＩＤを含む。オブジェクトＯＢｑのメタデータ４１０は更に、値が０（初期値）の重複カウントＤＣＮＴｑを含む。実データ４２０は、ブロックＢｑの内容に一致する。ＣＰＵ１０１は、ステップＳ７を実行すると重複排除コントローラとして機能して、ステップＳ８に進む。
【００５２】
一方、上述の例とは異なって、目的のオブジェクトＯＢｑ（より詳細には、ブロックＢｑと同一内容のブロックを持つオブジェクト）が上述のロケーションに存在するものとする（ステップＳ６のＹｅｓ）。つまり、ブロックＢｑのハッシュ値Ｈｑで一意に決まるロケーションに、当該ブロックＢｑと同一内容の有効なブロック（第２のブロック）が既に存在しているものとする。この場合、ＣＰＵ１０１は、ブロックＢｑが、上述のロケーションに存在する有効なブロックと重複しており、したがってブロックＢｑに関する重複排除が必要であると判断する。そこでＣＰＵ１０１は重複排除コントローラとして機能して、重複排除のためにステップＳ７をスキップし、しかる後にステップＳ８に進む。即ちＣＰＵ１０１は、ブロックＢｑがオブジェクトＯＢｑとして上述のロケーションに書き込まれるのを、重複排除のために抑止して、ステップＳ８に進む。
【００５３】
ステップＳ８においてＣＰＵ１０１は、オブジェクトＯＢｑのメタデータ４１０中の重複カウントＤＣＮＴｑを１増加する。これにより、目的のオブジェクトＯＢｑが存在しないと判定された場合であるならば（ステップＳ６のＮｏ）、重複カウントＤＣＮＴｑは初期値０から１に更新される。重複カウントＤＣＮＴｑ＝１は、オブジェクトＯＢｑの実データ４２０に一致するブロックＢｑの数が１であることを示す。これに対し、目的のオブジェクトＯＢｑ存在すると判定された場合であるならば（ステップＳ６のＹｅｓ）、重複カウントＤＣＮＴｑは１以上の整数であることから、当該重複カウントＤＣＮＴｑは２以上の値に更新される。
【００５４】
次にＣＰＵ１０１はファイルアクセスコントローラとして機能して、変数ｑを１増加する（ステップＳ９）。そしてＣＰＵ１０１は、１増加された変数ｑが変数Ｑ（＝ｍ）に等しいかを判定する（ステップＳ１０）。もし、１増加された変数ｑが変数Ｑに等しくないならば（ステップＳ１０のＮｏ）、ＣＰＵ１０１は、処理されるべきブロックＢｑが残っていると判断する。この場合、ＣＰＵ１０１はステップＳ３に戻る。そしてＣＰＵ１０１は、ステップＳ３乃至Ｓ１０、またはステップＳ３乃至Ｓ６及びＳ８乃至Ｓ１０を、前述の場合と同様に実行する。なお、ステップＳ１０において、１増加された変数ｑが、変数Ｑ以上であるか、或いはＱ−１を超えているかを判定しても構わない。
【００５５】
さて、ＣＰＵ１０１が上述の動作をＱ（＝ｍ）回繰り返すと、１増加された変数ｑが変数Ｑに等しくなる（ステップＳ１０のＹｅｓ）。この場合、ＣＰＵ１０１は、処理されるべきブロックＢｑは残っていないと判断する。すると、ＣＰＵ１０１はステップＳ１１に進む。
【００５６】
ステップＳ１１においてＣＰＵ１０１はファイル管理部として機能して、メモリ１０２のワーク領域に格納されているｉノードｉＮｐに、ファイルＦｐの新たな属性情報３２０を記録する。即ちＣＰＵ１０１は、ｉノードｉＮｐの旧属性情報３２０を新たな属性情報３２０に更新する。
【００５７】
次にＣＰＵ１０１は、新たなブロック表３１０及び属性情報３２０を含む新たなｉノードｉＮｐを、ｉノード番号ｉＮｐｎをＩＤとして持つオブジェクトＯｉＮｐとして、オブジェクトストレージ２１０内のｉノード領域に書き込む（ステップＳ１２）。即ちＣＰＵ１０１は、旧ｉノードｉＮｐ（旧オブジェクトＯｉＮｐ）を新たなｉノードｉＮｐ（新たなオブジェクトＯｉＮｐ）に更新する。これにより、ファイル書き込み処理は終了する。なお、ステップＳ１２におけるオブジェクトＯｉＮｐの書き込みは、ＣＰＵ１０１からオブジェクトコントローラ１２にオブジェクトＯｉＮｐの書き込みを要求することにより、当該オブジェクトコントローラ１２によって実行される。
【００５８】
次に、ファイルシステム１１のＣＰＵ１０１によって実行されるファイル読み出し処理について、ファイルＦｐの読み出しを例に、図７を参照して説明する。図７は、本実施形態で適用されるファイル読み出し処理の典型的な手順を示すフローチャートである。
【００５９】
今、アプリケーションプログラムからファイルシステム１１に対して、ファイルＦｐの読み出しが要求されたものとする。するとファイルシステム１１のＣＰＵ１０１は、ファイル読み出し処理を開始する。まずＣＰＵ１０１はファイルアクセスコントローラとして機能して、ファイルＦｐに対応付けられたｉノード番号ｉＮｐｎをＩＤとして用いて、ｉノードｉＮｐのオブジェクトＯｉＮｐをオブジェクトストレージ２１０から読み出す（ステップＳ２１）。この読み出しは、ＣＰＵ１０１からオブジェクトコントローラ１２にオブジェクトＯｉＮｐの読み出しを要求することにより、当該オブジェクトコントローラ１２によって実行される。
【００６０】
読み出されたｉノードｉＮｐのオブジェクトＯｉＮｐは、メモリ１０２のワーク領域に格納される。ｉノード番号ｉＮｐｎは、前述のファイル書き込み処理と同様に、ＣＰＵ１０１が、ファイルＦｐのファイル名に基づいて、ｉノード５００ａのエントリ表５１０ａを参照することにより取得される。
【００６１】
次にＣＰＵ１０１は、読み出されたオブジェクトＯｉＮｐに含まれているｉノードｉＮｐのブロック表３１０から、未だ選択されていないブロックＢｑのハッシュ値Ｈｑを選択する（ステップＳ２２）。ここでは、ブロック表３１０のｑ（＝０）番目のエントリから、ブロックＢｑのハッシュ値Ｈｑが選択される。
【００６２】
次にＣＰＵ１０１は、選択されたハッシュ値Ｈｑを、オブジェクトＩＤとして用いて、ブロックＢｑのオブジェクトＯＢｑをオブジェクトストレージ２１０から読み出す（ステップＳ２３）。即ちＣＰＵ１０１は、選択されたハッシュ値ＨｑをオブジェクトＩＤとして持つオブジェクトＯＢｑを読み出す。読み出されたオブジェクトＯＢｑは、メモリ１０２のワーク領域に格納される。
【００６３】
次にＣＰＵ１０１は、ステップＳ２１において読み出されたオブジェクトＯｉＮｐに含まれているｉノードｉＮｐのブロック表３１０に記録された全てのハッシュ値Ｈｑが選択されたかを判定する（ステップＳ２４）。もし、未だ選択されていないハッシュ値ＨｑがｉノードｉＮｐのブロック表３１０に存在するならば（ステップＳ２４のＮｏ）、ＣＰＵ１０１はステップＳ２２に戻る。そしてＣＰＵ１０１は、ステップＳ２２乃至Ｓ２４を、前述の場合と同様に実行する。
【００６４】
さて、ｉノードｉＮｐのブロック表３１０に記録されている全てのハッシュ値Ｈｑについて、ステップＳ２２乃至Ｓ２４が繰り返し実行されたものとする（ステップＳ２４のＹｅｓ）。この場合、ＣＰＵ１０１はステップＳ２５に進む。
【００６５】
ステップＳ２５においてＣＰＵ１０１はファイル管理部として機能して、メモリ１０２のワーク領域に格納されたオブジェクトＯｉＮｐに含まれているｉノードｉＮｐに、ファイルＦｐの新たな属性情報３２０を記録する。即ちＣＰＵ１０１は、ｉノードｉＮｐの旧属性情報３２０を新たな属性情報３２０に更新する。
【００６６】
次にＣＰＵ１０１は、新たなブロック表３１０及び属性情報３２０を含む新たなｉノードｉＮｐを、ｉノード番号ｉＮｐｎをＩＤとして持つオブジェクトＯｉＮｐとして、オブジェクトストレージ２１０内のｉノード領域にオブジェクトコントローラ１２を介して書き込む（ステップＳ２６）。これにより、旧ｉノードｉＮｐ（旧オブジェクトＯｉＮｐ）は新たなｉノードｉＮｐ（新たなオブジェクトＯｉＮｐ）に更新され、ファイル読み出し処理は終了する。
【００６７】
次に、ファイルシステム１１のＣＰＵ１０１によって実行されるファイル削除処理について、ファイルＦｐの削除を例に、図８を参照して説明する。図８は、本実施形態で適用されるファイル削除処理の典型的な手順を示すフローチャートである。
【００６８】
今、アプリケーションプログラムからファイルシステム１１に対して、ファイルＦｐの削除が要求されたものとする。するとファイルシステム１１のＣＰＵ１０１は、ファイル削除処理を開始する。まずＣＰＵ１０１はファイルアクセスコントローラとして機能して、ファイルＦｐに対応付けられたｉノード番号ｉＮｐｎをＩＤとして用いて、ｉノードｉＮｐのオブジェクトＯｉＮｐをオブジェクトストレージ２１０から読み出す（ステップＳ３１）。読み出されたｉノードｉＮｐのオブジェクトＯｉＮｐは、メモリ１０２のワーク領域に格納される。
【００６９】
次にＣＰＵ１０１は、読み出されたオブジェクトＯｉＮｐに含まれているｉノードｉＮｐのブロック表３１０から、未だ選択されていないブロックＢｑのハッシュ値Ｈｑを選択する（ステップＳ３２）。ここでは、ブロック表３１０のｑ（＝０）番目のエントリから、ブロックＢｑのハッシュ値Ｈｑが選択される。
【００７０】
次にＣＰＵ１０１は、選択されたハッシュ値Ｈｑを、オブジェクトＩＤとして用いて、ブロックＢｑのオブジェクトＯＢｑのメタデータ４１０をオブジェクトストレージ２１０から読み出す（ステップＳ３３）。読み出されたオブジェクトＯＢｑのメタデータ４１０は、メモリ１０２のワーク領域に格納される。
【００７１】
次にＣＰＵ１０１はファイル削除コントローラとして機能して、ステップＳ３３において読み出されたオブジェクトＯＢｑに含まれているメタデータ４１０中の重複カウントＤＣＮＴｑを１減らす（ステップＳ３４）。そしてＣＰＵ１０１は、１減らされた重複カウントＤＣＮＴｑが０に等しいかを判定する（ステップＳ３５）。
【００７２】
もし、１減らされた重複カウントＤＣＮＴｑが０に等しいならば（ステップＳ３５のＹｅｓ）、ＣＰＵ１０１は、オブジェクトＯＢｑに含まれている実データ４２０に一致するブロックＢｑの数が、今回のファイルＦｐの削除でゼロになると判断する。この場合、ＣＰＵ１０１は、オブジェクトストレージ２１０からオブジェクトＯＢｑを削除する（ステップＳ３６）。そしてＣＰＵ１０１は、ステップＳ３７に進む。
【００７３】
これに対し、１減らされた重複カウントＤＣＮＴｑが０に等しくないならば（ステップＳ３５のＮｏ）、ＣＰＵ１０１は、オブジェクトＯＢｑに含まれている実データ４２０に一致するブロックＢｑの数は、今回のファイルＦｐの削除でもゼロにならないと判断する。この場合、ＣＰＵ１０１はステップＳ３６をスキップして、ステップＳ３７に進む。
【００７４】
ステップＳ３７においてＣＰＵ１０１は、上述のファイル読み出し処理におけるステップＳ２４と同様に、読み出されたオブジェクトＯｉＮｐに含まれているｉノードｉＮｐのブロック表３１０に記録された全てのハッシュ値Ｈｑが選択されたかを判定する。もし、未だ選択されていないハッシュ値ＨｑがｉノードｉＮｐのブロック表３１０に存在するならば（ステップＳ３７のＮｏ）、ＣＰＵ１０１はステップＳ３２に戻る。そしてＣＰＵ１０１は、ステップＳ３２乃至Ｓ３７、またはステップＳ３２乃至３５及びＳ３７を、前述の場合と同様に実行する。
【００７５】
さて、ｉノードｉＮｐのブロック表３１０に記録されている全てのハッシュ値Ｈｑについて、ステップＳ３２乃至Ｓ３７、またはステップＳ３２乃至３５及びＳ３が繰り返し実行されたものとする（ステップＳ３７のＹｅｓ）。この場合、ＣＰＵ１０１は、オブジェクトストレージ２１０からオブジェクトＯｉＮｐを削除する（ステップＳ３８）。なお、ステップＳ３８におけるオブジェクトＯｉＮｐの削除は、ＣＰＵ１０１からオブジェクトコントローラ１２に当該オブジェクトＯｉＮｐの削除を要求することにより、当該オブジェクトコントローラ１２によって実行される。
【００７６】
次にＣＰＵ１０１は、ｉノード（ディレクトリｉノード）５００ａのｉノード番号ｉＮｄｎをＩＤとして用いて、当該ｉノード（ｉノードオブジェクト）５００ａを読み出す（Ｓ３９）。読み出されたｉノード５００ａはメモリ１０２のワーク領域に格納される。
【００７７】
次にＣＰＵ１０１は、ステップＳ３９において読み出されたｉノード５００ａのエントリ表５１０ａから、ｉノード番号ｉＮｐｎとファイルＦｐのファイル名との組を削除する（ステップＳ４０）。ＣＰＵ１０１は、ｉノード番号ｉＮｐｎとファイルＦｐのファイル名との組が削除されたエントリ表５１０ａを含むｉノード５００ａを、当該ｉノード５００ａのｉノード番号ｉＮｄｎをＩＤとして持つオブジェクトとして、オブジェクトストレージ２１０内のｉノード領域に書き込む（ステップＳ４１）。これにより、ファイル削除処理は終了する。
【００７８】
次に、本実施形態で適用される周知のファイル作成処理について簡単に説明する。今、ホスト１０上で動作するアプリケーションからファイルシステム１１に対して、ファイルＦｐを新規に作成することが要求されたものとする。この場合、ファイルシステム１１のＣＰＵ１０１はファイル管理部として機能して、未使用のｉノード番号を取得する。ここでは、ｉノード番号ｉＮｐｎが取得されたものとする。
【００７９】
次にＣＰＵ１０１は、メモリ１０２のワーク領域内にファイルｉノードｉＮｐを作成し、当該ファイルｉノードｉＮｐにファイルＦｐの属性情報を記録する。ＣＰＵ１０１は、ファイルＦｐの属性情報が記録されたファイルｉノードｉＮｐを、ｉノード番号ｉＮｐｎをＩＤとして用いて、オブジェクトストレージ２１０のｉノード領域に書き込む。
【００８０】
次にＣＰＵ１０１は、ｉノード（ディレクトリｉノード）５００ａのｉノード番号ｉＮｄｎをＩＤとして用いて、当該ｉノード（ｉノードオブジェクト）５００ａを読み出す。ＣＰＵ１０１は、読み出されたｉノード５００ａのエントリ表５１０に、ｉノード番号ｉＮｐｎとファイルＦｐのファイル名との組を追加する。ＣＰＵ１０１は、ｉノード番号ｉＮｐｎとファイルＦｐのファイル名との組が追加されたエントリ表５１０ａを含むｉノード５００ａを、ｉノード番号ｉＮｄｎをＩＤとして持つオブジェクトとして、オブジェクトストレージ２１０内のｉノード領域に書き込む。これにより、ファイル作成処理は終了する。
【００８１】
上述のように、本実施形態においてファイルシステム１１は、オブジェクトストレージ２１０に書き込まれるべきブロックの内容（つまり、データ）から算出された当該ブロックのハッシュ値をＩＤ（オブジェクトＩＤ）として用いて、当該ブロックのロケーションを決定（または特定）する。そこでファイルシステム１１は、例えばブロックＢｑをオブジェクトストレージ２１０に書き込む必要がある場合に、当該ブロックＢｑのハッシュ値ＨｑをＩＤとして用いて上述のロケーションにアクセスする。このアクセスだけで、ファイルシステム１１は、ハッシュ値Ｈｑと同一のＩＤを持つブロックが既にストレージ装置２０に格納されているかを簡単に判定することができる。つまり、上述のロケーションに有効なブロックが格納されている場合、上述の判定のためにファイルシステム１１が、当該有効なブロックのハッシュ値を算出して、当該算出されたハッシュ値をブロックＢｑのハッシュ値Ｈｑと比較することは必ずしも必要ない。
【００８２】
このように本実施形態によれば、ファイルシステム１１側では、ブロックＢｑのロケーションを示す情報が、従来技術におけるアドレスから当該ブロックＢｑのハッシュ値Ｈｑに変わるだけである。このため、重複排除のためのオーバヘッドを低減できる。またストレージ装置２０側では、ストレージコントローラ２２は、ブロックＢｑを、ファイルシステム１１側からの要求に応じて、当該ブロックＢｑのハッシュ値Ｈｑで一意に決まるロケーションに格納すれば良く、重複の判定は不要である。
【００８３】
ところで前記実施形態では、ファイルＦｐを分割して得られるＱ（＝ｍ）個のブロック（データブロック）Ｂｑのサイズは固定長である。Ｑ個のブロックＢｑそれぞれのサイズは、当該ブロックＢｑそれぞれのオブジェクトＯＢｑのメタデータ４１０に含まれているサイズ情報により示される。このため、Ｑ個のブロックＢｑそれぞれが可変長であっても構わない。また、オブジェクトストレージ２１０に既に格納されているブロックの内容と同一内容のブロックを含むように、ファイルＦｐが複数のブロックに分割されても構わない。
【００８４】
ここで、複数のファイルがいずれも、内容が同一の連続する複数のブロック、例えば２つのブロックＢａ及びＢｂを含むものとする。このような場合に、ブロックＢａ及びＢｂのオブジェクトＯＢａ及びＯＢｂが、１つのオブジェクトＯＢａｂにまとめられても構わない。つまり、ブロックＢａ及びＢｂが１つのブロックＢａｂにまとめられても構わない。
【００８５】
このように、ＣＰＵ１０１がファイル管理部として機能して、ブロックのサイズを可変長とすることで、重複排除率を向上することができる。また、連続する複数のブロックをまとめることで、アクセス性能を向上することができる。
【００８６】
ここで、ＣＰＵ１０１がファイルアクセスコントローラとして機能した結果、例えばステップＳ２２またはＳ３２で選択されたハッシュ値ＨｑをＩＤとして、ブロックＢｑのオブジェクトＯＢｑを読み出したものとする（ステップＳ２３またはＳ３３）。この場合に、ＣＰＵ１０１が、読み出されたオブジェクトＯＢｑ中の実データ４２０のハッシュ値、つまりブロックＢｑのハッシュ値を算出し、算出されたハッシュ値を選択されたハッシュ値Ｈｑと比較しても良い。ＣＰＵ１０１は、この比較の結果に基づき、ブロックＢｑのオブジェクトＯＢｑの読み出しにおけるエラーを検出する。つまりＣＰＵ１０１は、算出されたハッシュ値がハッシュ値Ｈｑに等しくない場合、ブロックＢｑのオブジェクトＯＢｑの読み出しでエラーが発生したと判断する。このような構成によれば、計算量を増やすことなく、エラーチェックを実現できる。
【００８７】
また、ストレージ装置２０のストレージ２１が、前記実施形態と異なって、アクセス性能の異なる２種類のストレージ、例えば高速ストレージ及び低速ストレージから構成される階層化ストレージであるものとする。この場合、オブジェクトＯＢｑそれぞれのメタデータ４１０が、当該オブジェクトＯＢｑそれぞれへのアクセスの回数（アクセスカウント）を含んでも構わない。このような構成において、ＣＰＵ１０１が階層化管理部として機能して、アクセスカウントが例えば閾値を超えるオブジェクトを高速ストレージに格納し、アクセスカウントが閾値以下のオブジェクトを低速ストレージ格納しても良い。これにより、各オブジェクトを、アクセスカウント（つまり、アクセス頻度）に応じて階層化することができる。
【００８８】
ところで、オブジェクトストレージシステムでは、信頼性と性能の向上のために、オブジェクトＯＢｑを複数の記憶媒体、例えばストレージ２１を構成する複数のＨＤＤのディスクに複製して記録することが一般的である。このようなオブジェクトＯＢｑの複製を必要とするシステムでは、当該オブジェクトＯＢｑのメタデータ４１０中の重複カウントＤＣＮＴｑに基づいて、当該オブジェクトＯＢｑの複製の数が決定されても良い。つまり、ＣＰＵ１０１が複製コントローラとして機能して、重複カウントＤＣＮＴｑの値が大きいオブジェクトＯＢｑほど、当該オブジェクトＯＢｑの複製を多く生成しても良い。このように、重複数の多いオブジェクトの複製数を増やすことでアクセス性能を向上できる。
【００８９】
＜変形例＞
次に前記実施形態の変形例について説明する。前記実施形態では、ストレージ装置２０のストレージ２１は、ファイルシステム１１からはオブジェクトストレージ２１０として認識される。つまり前記実施形態は、ファイルシステム１１がオブジェクトストレージを利用する構成を有している場合を前提としている。このためホスト１０は、オブジェクトコントローラ１２を必要とする。これに対して本変形例では、ストレージ装置２０のストレージ２１が、ファイルシステム１１からブロックストレージとして認識される。つまり本変形例は、ファイルシステム１１が、ブロックストレージを利用するものの、オブジェクトストレージを利用しない構成を有している場合を前提としている。
【００９０】
このような構成において、ファイルシステム１１のＣＰＵ１０１が、ブロックＢｑをブロックストレージに格納する必要があるものとする。この場合、ＣＰＵ１０１はファイルアクセスコントローラとして機能して、ブロックＢｑのオブジェクトＯＢｑのメタデータ４１０に相当するメタデータ（以下、ブロック管理メタデータと称する）と、ブロックＢｑの内容との組（以下、メタデータ・ブロック組と称する）を、ブロックストレージに格納すれば良い。ブロック管理メタデータは、オブジェクトＯＢｑのメタデータ４１０と同様に、重複カウントＤＣＮＴｑを含む。ブロック管理メタデータは、更に、ブロックＢｑのハッシュ値Ｈｑ（＝オブジェクトＯＢｑのオブジェクトＩＤ）、メタデータ・ブロック組全体のサイズＳＺｑを示す情報を含む。
【００９１】
ＣＰＵ１０１は、ブロックＢｑの内容を含むメタデータ・ブロック組をブロックストレージに書き込むために、当該メタデータ・ブロック組の書き込み先を示すアドレス、例えば論理ブロックアドレスＬＢＡｑを次のように決定する。本実施形態では、ハッシュ値Ｈｑを構成するビットの数は２５６である。一方、論理ブロックアドレスＬＢＡｑを構成するビットの数は６４である。つまり、ハッシュ値Ｈｑの長さは、論理ブロックアドレスＬＢＡｑの長さよりも長い。そこで、ＣＰＵ１０１は、ハッシュ値Ｈｑの予め定められた６４ビットの部分、例えば先頭の６４ビットを、論理ブロックアドレスＬＢＡｑとして決定する。
【００９２】
ＣＰＵ１０１は、決定された論理ブロックアドレスＬＢＡｑとメタデータ・ブロック組のサイズＳＺｑとに基づいて、当該メタデータ・ブロック組の書き込みを、ストレージ装置２０のストレージコントローラ２２に要求する。これによりＣＰＵ１０１は、メタデータ・ブロック組を、論理ブロックアドレスＬＢＡｑから始まるサイズがＳＺｑの領域（ブロックストレージ内の領域）に書くことができる。ここで、ストレージコントローラ２２の動作は、前記実施形態と同様である。
【００９３】
本変形例では、ハッシュ値Ｈｑの一部が論理ブロックアドレスＬＢＡｑとして用いられる。このため論理ブロックアドレスＬＢＡｑが、ハッシュ値Ｈｑとは異なるハッシュ値Ｈｒに基づいて決定された論理ブロックアドレスＬＢＡｒに一致する可能性がある。
【００９４】
そこで、ハッシュ値Ｈｒを持つメタデータ・ブロック組が、論理ブロックアドレスＬＢＡｑ（＝ＬＢＡｒ）から始まる領域（以下、ＬＢＡｑ領域と称する）に既に格納されている場合、ＣＰＵ１０１は、ブロックＢｑのハッシュ値を算出し直す動作（いわゆる、再ハッシュ動作）を実行する。具体的には、ＣＰＵ１０１は、ハッシュ値Ｈｑに基づいて、当該ハッシュ値Ｈｑのハッシュ値Ｈｑ’を算出し、このハッシュ値Ｈｑ’をブロックＢｑのハッシュ値として用いる。なお、ＣＰＵ１０１がハッシュ値Ｈｑに一定値（例えば１）を加算して、その加算結果を、ブロックＢｑのハッシュ値として用いても良い。またＬＢＡｑ領域に既に格納されているメタデータ・ブロック組がハッシュ値Ｈｑを持つ場合、ＣＰＵ１０１は、重複排除が必要であると判定する。この場合、ＣＰＵ１０１は、ＬＢＡｑ領域に既に格納されているメタデータ・ブロック組のブロック管理メタデータ中の重複カウントＤＣＮＴｑを１増加する。
【００９５】
本変形例によれば、ファイルシステム１１が利用するストレージが、オブジェクトストレージではなくて、一般のブロックストレージである場合でも、重複排除に関し、オブジェクトストレージを利用する場合と同等の機能を実現できる。
【００９６】
前記実施形態では、ホスト１０がネットワーク３０を介してストレージ装置２０を利用する。しかし、ホスト１０を含む複数のホストがネットワーク３０に接続されていて、当該複数のホストがネットワーク３０を介してストレージ装置２０を利用しても良い。また、ストレージ装置２０を含む複数のストレージ装置がネットワーク３０に接続されていて、ホスト１０、または複数のホストが、複数のストレージ装置を利用しても良い。また、ホスト１０（または複数のホスト）が、ファイバチャネル（ＦＣ）、シリアルアタッチドＳＣＳＩ（ＳＡＳ）、或いはシリアルＡＴアタッチメント（ＳＡＴＡ）のようなネットワーク３０以外の接続手段を介してストレージ装置２０（複数のストレージ装置を）を利用しても良い。
【００９７】
また前記実施形態では、ストレージ２１及びストレージコントローラ２２がホスト１０から独立に設けられている。しかし、ストレージ２１及びストレージコントローラ２２がホスト１０に内蔵されていても良い。
【００９８】
また、前述の、ファイルアクセスコントローラ、ハッシュ値算出部、ファイル管理部、重複排除コントローラ、ファイル削除コントローラ、階層化管理部、及び複製コントローラのそれぞれ（機能要素）は、ファイルシステム１１のＣＰＵ１０１が、ストレージ制御プログラムを実行することにより実現されるソフトウェアモジュールである。しかし、これらの機能要素の少なくとも１つがハードウェアモジュールによって実現されても構わない。
【００９９】
以上説明した少なくとも１つの実施形態によれば、重複排除に伴うオーバヘッドとデータ転送量とを減らすことができる。
【０１００】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、請求の範囲に記載された発明とその均等の範囲に含まれる。
【図１】
2016038714.tif 000003
【図２】
2016038714.tif 000004
【図３】
2016038714.tif 000005
【図４】
2016038714.tif 000006
【図５】
2016038714.tif 000007
【図６】
2016038714.tif 000008
【図７】
2016038714.tif 000009
【図８】
2016038714.tif 000010
【国際調査報告】
2016038714.tif 000011
2016038714.tif 000012
2016038714.tif 000013