(57)【特許請求の範囲】
【請求項１】
ファイルストレージシステムであって、
第１及び第２のファイルシステムを制御するファイルシステム制御部を有するファイルサーバと、
前記第１のファイルシステムが管理するボリュームであって、第１のファイルが格納された第１のボリュームと、
前記第２のファイルシステムが管理するボリュームであって、第２のファイル及び第３のファイルが格納された第２のボリュームと、を備え、
前記第２のファイルは前記第１のファイルの複製であって、前記第２のファイルのデータが更新されるまで前記第１のファイルとデータを共有するクローンファイルであり、
前記第３のファイルは、前記第１のファイルと前記第２のファイルとを関連付けるための仮想的なファイルである仮想親ファイルであり、
前記第１乃至第３のファイルの各々には、ボリューム内でファイルを識別するための第１乃至第３のファイル識別情報の各々が設定され、
前記第１のファイルには、前記第３のファイルを参照するための情報として、前記第２のボリュームの識別情報と前記第３のファイル識別情報とが設定され、
前記第２のファイルには、前記第３のファイルを参照するための情報として、前記第３のファイル識別情報が設定され、
前記第３のファイルには、前記第１のファイルを参照するための情報として、前記第１のボリュームの識別情報と前記第１のファイル識別情報とが設定されるファイルストレージシステム。
【請求項２】
請求項１記載のファイルストレージシステムであって、
前記第１のファイルの複製を前記第２のボリュームに作成する要求を受けた場合、前記ファイルシステム制御部は、
前記第１のファイルの更新を禁止し、
前記第３のファイルが前記第２のボリュームに存在しない場合には、前記第３のファイルを前記第１のファイルから作成し、前記第３のファイルより前記第２のファイルを作成するファイルストレージシステム。
【請求項３】
請求項１記載のファイルストレージシステムであって、
前記第２のファイルへの読み出し要求を受けた場合、前記ファイルシステム制御部は、
前記読み出し要求で指定された前記第２のファイルのファイルブロックにデータが有れば当該データを読み出し、
前記ファイルブロックにデータが存在しない場合には、前記第２のファイルに対応する前記第１のファイルのファイルブロックのデータを読み出すファイルストレージシステム。
【請求項４】
請求項１記載のファイルストレージシステムであって、
前記第２のファイルへの更新要求を受けた場合、前記ファイルシステム制御部は、
（１）前記更新要求で指定された前記第２のファイルのファイルブロックに前記ファイルストレージシステムのディスクブロックが割り当てられていない場合は、前記ファイルストレージシステムのディスクブロックを割り当てて、そこに更新データを書き込み、
（２）前記ファイルブロックにディスクブロックが割り当てられている場合は、
（２ａ）前記更新データが前記ファイルブロックの全てを含む場合にはそのまま、前記更新データを書き込み、
（２ｂ）前記更新データが前記ファイルブロックの一部のみの場合には、前記ファイルブロックのデータを読み出し、前記読み出しデータと前記更新データを整合したデータを書き込むファイルストレージシステム。
【請求項５】
請求項１記載のファイルストレージシステムであって、前記第３のファイルは対応するファイル数を管理する参照情報を有し、前記第２のファイルへの削除要求を受けた場合、
前記ファイルシステム制御部は、
前記第２のファイルを削除し、
前記第２のファイルと対応関係にある第３のファイルの参照情報を変更し、
前記参照情報が０である場合は、前記第３のファイルを削除するファイルストレージシステム。
【請求項６】
請求項１記載のファイルストレージシステムであって、前記第２のファイルのスプリット要求を受けた場合、前記ファイルシステム制御部は、
前記第２のファイルと対応関係にある前記第１のファイルを前記第２のボリュームの識別情報と前記第３のファイル識別情報とで特定し、
前記特定した第１ファイルのファイルブロックで、前記第２のファイルに対応するファイルブロックが存在しない前記第１ファイルのファイルブロックを前記第２のファイルのファイルブロックに複製するファイルストレージシステム。
【請求項７】
請求項１記載のファイルストレージシステムであって、
前記第１のボリュームに第４のファイルが格納されており、前記第４のファイルの仮想親ファイルが存在しない場合、
前記第４のファイルの、前記第２のボリュームへの移動要求を受けた時、前記ファイルシステム制御部は、
前記第４のファイルの複製を前記第２のボリュームに作成し、
前記第４のファイルを仮想親ファイルに変換し、前記第４のファイルには前記第４のファイルの複製を参照するための情報として、前記第２のボリュームの識別情報と前記第４のファイルの複製のファイル識別情報とを設定し、前記第４のファイルの複製には前記第４のファイルを参照するための情報として、前記第１のボリュームの識別情報と前記第４のファイルのファイル識別情報とを設定する、
ファイルストレージシステム。
【請求項８】
請求項１記載のファイルストレージシステムであって、
前記第１のファイルの別のボリュームへの移動要求時に、前記ファイルシステム制御部は、
前記第１のファイルの複製を前記別のボリュームに作成し
前記第１のファイルの仮想親ファイルである前記第３のファイルに設定されている、前記第１のボリュームの識別情報と前記第１のファイル識別情報に代えて、前記別のボリュームの識別情報と前記第１のファイルの複製のファイル識別情報を設定する、
ファイルストレージシステム。
【請求項９】
請求項１記載のファイルストレージシステムであって、ファイル作成要求、ファイル移動要求を、前記ファイルストレージシステムに接続された管理サーバ上の管理画面より実行することを特徴とするファイルストレージシステム。
【請求項１０】
ファイルストレージシステムであって、
第１のファイルシステムを制御する第１のファイルシステム制御部を有する第１のファイルサーバと、
第２のファイルシステムを制御する第２のファイルシステム制御部を有する第２のファイルサーバと、
前記第１のファイルシステムが管理するボリュームであって、第１のファイルが格納された第１のボリュームと、
前記第２のファイルシステムが管理するボリュームであって、前記第１のファイルの複製であって自身のデータが更新されるまで前記第１のファイルとデータを共有する第２のファイルと、前記第１のファイルと前記第２のファイルとを関連付けるための仮想的なファイルである第３のファイルが格納された第２のボリュームとを備え、
前記第１乃至第３のファイルの各々には、ボリューム内でファイルを識別するための第１乃至第３のファイル識別情報の各々が設定され、
前記第１のファイルには、前記第３のファイルを参照するための情報として、前記第２のボリュームの識別情報と前記第３のファイル識別情報とが設定され、
前記第２のファイルには、前記第３のファイルを参照するための情報として、前記第２のボリュームの識別情報と前記第３のファイル識別情報とが設定され、
前記第３のファイルには、前記第１のファイルを参照するための情報として、前記第１のボリュームの識別情報と前記第１のファイル識別情報とが設定されるファイルストレージシステム。
【請求項１１】
第１及び第２のファイルシステムを制御するファイルシステム制御部を有するファイルサーバと、前記第１のファイルシステムが管理するボリュームで第１のファイルが格納された第１のボリュームと、前記第２のファイルシステムが管理するボリュームで前記第１のファイルの複製であって自身のデータが更新されるまで前記第１のファイルとデータを共有する第２のファイルと、前記第１のファイルと前記第２のファイルとを関連付けるための仮想的なファイルである第３のファイルが格納された第２のボリュームとを備え、ストレージシステムとクライアントサーバとに接続されるファイルストレージシステムのファイルクローニング方法であって、
前記第１乃至第３のファイルの各々には、ボリューム内でファイルを識別するための第１乃至第３のファイル識別情報の各々が設定され、
前記第１のファイルには、前記第３のファイルを参照するための情報として、前記第２のボリュームの識別情報と前記第３のファイル識別情報とが設定され、
前記第２のファイルには、前記第３のファイルを参照するための情報として、前記第３のファイル識別情報が設定され、
前記第３のファイルには、前記第１のファイルを参照するための情報として、前記第１のボリュームの識別情報と前記第１のファイル識別情報とが設定されるファイルクローニング方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ファイルストレージシステムとファイルクローニング方法に関する。
【背景技術】
【０００２】
近年ファイル複製処理の高速化と記憶デバイスの使用容量削減を目的とし、ファイルストレージに格納される複製元ファイルの物理格納データを、複製先のファイル（クローンファイル）が共有するファイルクローニング技術が広く使われるようになった。特許文献１には、複製元ファイルと物理格納データを共有するスナップショットファイルを作成し、更にスナップショットファイルに対する差分データを管理するクローンファイルを作成する技術が開示されている。
【０００３】
また、特許文献２には、複製元ファイルと物理格納データを共有するスナップショットファイルに対して、複製元ファイルをオフラインストレージに移動する技術が開示されている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】米国特許７４０９５１１号公報
【特許文献２】米国特許出願公開２００９／００４３９７８号明細書
【発明の概要】
【発明が解決しようとする課題】
【０００５】
一つの複製元ファイルに対し多数のクローンファイルを作成する場合に、複製元ファイルおよびスナップショットファイルの物理格納データにアクセスが集中する。そのため、物理データを格納するストレージデバイスが、システム性能上のボトルネックになるという問題がある。すなわち、前記特許文献１の発明を用いた場合、同一ボリューム内部の複製元ファイルに対してのみしかクローンファイルを作成できないという制約があった。
【０００６】
そのため、一つの複製元ファイルに対し多数のクローンファイルを作成する場合には、ボリュームを構成する記憶デバイスにＳＳＤ（Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）などの高性能だが、高価の記憶デバイスを用いる必要があり、装置コストが大きくなる点が課題であった。
【０００７】
前記特許文献１と特許文献２を組み合わせた場合、複製元ファイルの物理格納データをＳＳＤに移動することが可能となる。しかし、スナップショットファイルと複製元ファイルとの間の差分データは元のボリュームに残ってしまうため、複製元ファイルとスナップショットファイルの差分が大きい場合には、やはり元のボリュームに高価な記憶デバイスが必要となる。
【０００８】
また、スナップショットファイルは複製元ファイルと同一ボリュームにしか作成できないため、例えば高性能なボリュームや装置にある複製元ファイルに対してクローンファイルを作成するといったこともできない。
【０００９】
つまり、従来技術においては性能要件に応じてクローンファイルの親ファイル（従来技術のスナップショットファイルに相当）とクローンファイルを移動可能とすること、および異なるボリュームや装置にある親ファイルに対してクローンファイルを作成可能とすることが課題であった。
【００１０】
そこで、本発明の目的は、記憶デバイスの使用容量をより多く削減できるボリュームまたはストレージ装置間を跨るファイルクローニング方法とそのシステムを提供することにある。
【課題を解決するための手段】
【００１１】
前記課題を解決するため、本発明では異なるボリュームや装置にある親ファイルに対してクローンファイルを作成する手段と、クローンファイルと親ファイルをボリューム、装置をまたがって移動する手段を提供する。
【００１２】
具体的には、ファイルストレージ装置が、ストレージ装置やボリューム間で親ファイルを一意に識別可能な識別子を有する仮想親ファイルを作成し、同識別子を用いて親ファイルのブロックレイアウト情報を取得する制御を行う。
【００１３】
すなわち、ファイルストレージは、クローンファイルを作成するボリュームに仮想親ファイルを作成し、仮想親ファイルに対する参照ポインタとして使用することで、異なるボリュームや装置にある親ファイルに対するクローンファイル作成を可能とする。また、ファイルストレージは前記仮想親ファイルの作成処理と、仮想親ファイルで指示される親ファイル識別子の切り替え処理を組み合わせることで、クローンファイルと親ファイルの装置やボリュームをまたがった移動を可能とする。
【発明の効果】
【００１４】
本発明により、ボリュームまたはストレージ装置間をまたがって、複製元ファイルとクローンファイルの物理格納データの共有するため、記憶デバイスの使用容量をより多く削減できる。
【図面の簡単な説明】
【００１５】
【図１】図１は、第１の実施形態のシステム構成を示すブロック図である。
【図２】図２は、第１の実施形態のハードウェア構成を示すブロック図である。
【図３Ａ】図３Ａは、第１の実施形態のソフトウェア構成を示すブロック図である。
【図３Ｂ】図３Ｂは、記憶デバイスとＬＵとボリュームの関係を示すブロック図である。
【図４】図４は、従来技術のファイルシステム管理情報を示す説明図である。
【図５】図５は、第１の実施形態のファイルシステム管理情報を示す説明図である。
【図６】図６は、第１の実施形態にファイルのデータ管理法を示す説明図である。
【図７】図７は、第１の実施形態のクローンファイルのデータ管理法を示す説明図である。
【図８】図８は、第１の実施形態のｕｕｉｄテーブルを示す説明図である。
【図９】図９は、第１の実施形態のボリューム管理テーブルを示す説明図である。
【図１０】図１０は、第１の実施形態のファイルクローニングモジュールの、クローンファイル作成処理を示すフローチャート図である。
【図１１】図１１は、第１の実施形態のファイルシステムモジュールの、クローンファイルのリード処理を示すフローチャート図である。
【図１２】図１２は、第１の実施形態のファイルシステムモジュールの、クローンファイルのライト処理を示すフローチャート図である。
【図１３】図１３は、第１の実施形態のファイルシステムモジュールの、クローンファイルの削除処理を示すフローチャート図である。
【図１４】図１４は、第１の実施形態のファイルクローニングモジュールの、クローンファイルのスプリット処理を示すフローチャート図である。
【図１５】図１５は、第１の実施形態のファイル移動プログラムの、ローカルボリュームから他のボリュームへの親ファイルの移動処理を示すフローチャート図である。
【図１６】図１６は、第１の実施形態のファイル移動プログラムの、他のボリュームからそれ以外のボリュームへの親ファイルの移動処理を示すフローチャートである。
【図１７】図１７は、第１の実施形態のファイル移動プログラムの、クローンファイルの移動処理を示すフローチャート図である。
【図１８】図１８は、第１の実施形態のクローンファイル管理画面を示す説明図である。
【図１９】図１９は、第２の実施形態の情報処理システムの全体構成を示すブロック図である。
【図２０】図２０は、第２の実施形態のソフトウェア構成を示すブロック図である。
【図２１】図２１は、第２の実施形態におけるファイルシステム管理情報を示す説明図である。
【図２２】図２２は、第２の実施形態のクローンファイルのデータ管理方法を示す説明図である。
【図２３】図２３は、第２の実施形態のｕｕｉｄテーブルを示す説明図である。
【図２４】図２４は、第２の実施形態のＡＰＩ管理テーブルを示す説明図である。
【図２５】図２５は、第２の実施形態のアカウント管理テーブルを示す説明図である。
【図２６】図２６は、第２の実施形態のファイルクローニングモジュールの、親ファイル参照先切り替え処理のフローチャートである。
【図２７】図２７は、第２の実施形態の外部ファイルストレージ追加画面を示す説明図である。
【図２８】図２８は、第３の実施形態のソフトウェア構成を示すブロック図である。
【図２９】図２９は、第３の実施形態のファイルハッシュテーブルを示す説明図である。
【図３０】図３０は、第３の実施形態の重複排除プログラムの、ボリューム内の重複排除処理を示すフローチャート図である。
【図３１】図３１は、第３の実施形態の重複排除プログラムの、ボリューム間の重複排除処理を示すフローチャート図である。
【発明を実施するための形態】
【００１６】
以下、図面を参照しながら本発明の実施の形態を説明する。なお、以下の説明では、「管理テーブル」等の表現にて各種情報を説明することがあるが、各種情報は、テーブル以外のデータ構造で表現されていてもよい。また、データ構造に依存しないことを示すために「管理テーブル」を「管理情報」と呼ぶことができる。
【００１７】
また、「プログラム」を主語として処理を説明する場合がある。そのプログラムは、プロセッサ、例えば、ＣＰＵ（Central  Processing  Unit）によって実行されるもので、定められた処理をするものである。なお、適宜に記憶資源（例えばメモリ）及び通信インターフェース装置（例えば、通信ポート）を用いながら行うため、処理の主語がプロセッサとされてもよい。プロセッサは、ＣＰＵの他に専用ハードウェアを有していても良い。コンピュータプログラムは、プログラムソースから各コンピュータにインストールされても良い。プログラムソースは、例えば、プログラム配布サーバ又は記憶メディアなどで提供されるものであっても良い。
【００１８】
また、各要素例えば、ファイルブロック、ディスクブロック、ＬＵ（Logical  Unit）などは番号などで識別可能であるが、識別可能な情報であれば、名前など他種の識別情報が用いられても良い。本発明の図及び説明において同一部分には同一符号を付与しているが、本発明が本実施例に制限されることは無く、本発明の思想に合致するあらゆる応用例が本発明の技術的範囲に含まれる。また、特に限定しない限り、各構成要素は複数でも単数でも構わない。
【００１９】
（１）第１実施形態
まず、本発明の第１の実施形態である同一ストレージ装置内の異なるボリューム間でのファイルクローニング方法について、図１から図１８を用いて説明する。
（１−１）第１実施形態の構成
＜全体構成＞
図１は、第１実施形態に係るシステムの構成を示すブロック図である。第１実施形態に係るシステムは、１台以上のファイルストレージ３００と、１台以上のクライアントサーバ２００と、１台以上の管理サーバ１００と、を備える。ファイルストレージ３００とクライアントサーバ２００と管理サーバ１００とは、ローカルエリアネットワーク４００を介して通信可能に接続される。
【００２０】
ファイルストレージ３００は、クライアントサーバ２００により生成されるファイルに対する制御を行うコンピュータである。ファイルストレージ３００はクライアントサーバ２００に対してファイルまたはディレクトリと呼ばれる管理単位を用いてデータを格納する手段を提供する。なお、ここでいうファイルとは、ファイルストレージ３００とクライアントサーバ２００の間で共通するデータの管理単位であり、実体は後述する記憶デバイス３２４上に格納された物理格納データとなる。
【００２１】
また、ディレクトリとは０個以上のファイルまたはディレクトリをまとめて管理するための、ファイルストレージ３００とクライアントサーバ２００の間で共通する管理構造である。なお、クライアントサーバ２００はディレクトリとファイルを木構造で表した文字列であるファイルパスを用いることで、ファイルストレージ３００にアクセス対象とするファイルを指定する。クライアントサーバ２００は、パーソナルコンピュータ、汎用サーバ又はメインフレーム等のコンピュータであり、オフィスでの文書作成業務や、メールサーバやＷｅｂサーバなどの用途で使用される。
【００２２】
管理サーバ１００は、クライアントサーバ２００と同様に、パーソナルコンピュータ、汎用サーバ又はメインフレーム等のコンピュータである。管理サーバ１００はキーボード、スイッチ、ポインティングデバイス、マイクロフォン等の情報入力装置（図示せず）及びモニタディスプレイ、スピーカ等の情報出力装置（図示せず）を備える。
【００２３】
ローカルエリアネットワーク４００は、ファイルストレージ３００、クライアントサーバ２００、管理サーバ１００が接続するコンピュータネットワークである。ローカルエリアネットワーク４００の例としては、イーサネット（Ｅｔｈｅｒｎｅｔ）（登録商標）が好適である。ローカルエリアネットワーク４００の通信プロトコルとしては、ＴＣＰ／ＩＰ（Ｔｒａｎｓｍｉｓｓｉｏｎ  Ｃｏｎｔｒｏｌ  Ｐｒｏｔｏｃｏｌ/Ｉｎｔｅｒｎｅｔ  Ｐｒｏｔｏｃｏｌ）やＵＤＰ／ＩＰ（Ｕｓｅｒ  Ｄａｔａｇｒａｍ  Ｐｒｏｔｏｃｏｌ/Ｉｎｔｅｒｎｅｔ  Ｐｒｏｔｏｃｏｌ）が好適である。
【００２４】
また、ファイルやディレクトリの送受信に用いるプロトコルとしては、ＮＦＳ（Ｎｅｔｗｏｒｋ  Ｆｉｌｅ  Ｓｔｏｒａｇｅ）、ＣＩＦＳ（Ｃｏｍｍｏｎ  Ｉｎｔｅｒｎｅｔ  Ｆｉｌｅ  Ｓｙｓｔｅｍ）、ＨＴＴＰ（Ｈｙｐｅｒ  Ｔｒａｎｓｐｏｒｔ  Ｔｒａｎｓｆｅｒ  Ｐｒｏｔｏｃｏ）、ｉＳＣＳＩ（Ｉｎｔｅｒｎｅｔ  Ｓｍａｌｌ  Ｃｏｍｐｕｔｅｒ  Ｓｙｓｔｅｍ  Ｉｎｔｅｒｆａｃｅ）などが好適である。
【００２５】
ファイルストレージ３００は、ローカルエリアネットワーク４００を介して、クライアントサーバ２００から送信されたファイル単位のデータアクセス要求を受信し、データアクセス要求に対する処理結果をクライアントサーバ２００に送信する。また、ローカルエリアネットワーク４００には、管理サーバ１００も接続されている。ファイルストレージ３００は、ローカルエリアネットワーク４００を介して、管理サーバ１００から送信される管理アクセス要求を受信し、管理アクセス要求に対する処理結果を管理サーバ１００に送信する。
【００２６】
＜ハードウェア構成＞
図２は、第１実施形態のファイルストレージ３００のハードウェア構成を示すブロック図である。
【００２７】
ファイルストレージ３００は、クライアントサーバ２００からのファイル操作要求を処理するファイルサーバ３１０と、ファイルのデータを物理的に格納するディスクサブシステム３２０から構成される。ファイルサーバ３１０は、ＣＰＵ３１１（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）、メインメモリ３１２、内蔵ディスク３１５、を備える。
【００２８】
ファイルストレージ３００は、さらに、ローカルエリアネットワーク４００に接続するためのネットワークＩＦ（ＩｎｔｅｒＦａｃｅ）３１３と、ディスクサブシステム３２０に接続するためのストレージＩＦ３１４とを備える。ＣＰＵ３１１は、内蔵ディスク３１５に格納された各種プログラムをメインメモリ３１２上に読み出して実行することにより、本実施形態に係るファイルサーバ３１０の各種機能を実現する。
【００２９】
メインメモリ３１２は、後述する各種プログラムを格納する記憶装置である。内蔵ディスク３１５は、後述する各種プログラムや管理情報を格納する不揮発性記憶装置である。ネットワークＩＦ３１３は、イーサネットインターフェースカード、無線ＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）インターフェースカード等のネットワークインターフェースカードによって構成される。
【００３０】
ネットワークＩＦ３１３は、ファイルサーバ３１０をクライアントサーバ２００や管理サーバ１００に接続するためのデータ入出力アダプタとして機能する。ストレージＩＦ３１４は、ＳＣＳＩ（Ｓｍａｌｌ  Ｃｏｍｐｕｔｅｒ  Ｓｙｓｔｅｍ  ＩｎｔｅｒＦａｃｅ）インターフェースカード、ファイバチャネル（Ｆｉｂｒｅ  Ｃｈａｎｎｅｌ）インターフェースカード等によって構成される。ストレージＩＦ３１４は、ファイルサーバ３１０をディスクサブシステム３２０に接続するためのデータ入出力アダプタとして機能する。
【００３１】
ディスクサブシステム３２０は、ＣＰＵ３２１、メインメモリ３２２、一つ以上の記憶デバイス３２５、３２６、およびディスクＩＦ３２３を備える。なお記憶デバイス３２５、３２６を区別しない場合は、まとめて記憶デバイス３２４とも記す。
【００３２】
ＣＰＵ３２１は、メインメモリ３２２に読み出した各種プログラムを実行することにより、本実施形態に係るディスクサブシステム３２０の各種機能を実現する。メインメモリ３２２は、上記各種プログラムを格納する半導体記憶装置である。ディスクＩＦ３２３は、ディスクサブシステム３２０をファイルサーバ３１０に接続するためのデータ入出力アダプタとして機能する。
【００３３】
記憶デバイス（ＳＳＤ）３２５、記憶デバイス（ＳＡＳ）３２６は、それぞれ異なるアクセス特性を有する不揮発性記憶装置である。例えば、これらの記憶デバイス３２５、３２６は互いに、データの読み出し速度及びデータの書き込み速度の少なくともいずれかが異なる。記憶デバイス（ＳＳＤ）３２５は、記録媒体としてＳＳＤを用い、データアクセスに対して相対的に低遅延で応答を返すことができる半面、容量あたりの価格が相対的に高価である。
【００３４】
記憶デバイス（ＳＡＳ）３２６は、記録媒体としてＳＡＳ（Ｓｅｒｉａｌ  Ａｔｔａｃｈｅｄ  ＳＣＳＩ）インターフェースを有するＨＤＤ（Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ）を用い、記憶デバイス（ＳＳＤ）３２１３と比べた場合、データアクセスに対して遅延は大きいものの、容量あたりの価格が安価である。これらの記憶デバイス３２４はデータ格納装置として使用される。また、ＳＡＴＡ（Ｓｅｒｉａｌ  ＡＴＡ）タイプのＨＤＤや光ディスクデバイス、光磁気ディスクドライブ、磁気テープデバイスなどの記憶デバイスも利用可能である。
【００３５】
ファイルサーバ３１０とディスクサブシステム３２０とは、ストレージＩＦ３１４およびディスクＩＦ３２３を介して接続される。ストレージＩＦ３１４およびディスクＩＦ３２３とは、スイッチを介して接続する形態であってもいいし、スイッチを介さずに直接接続する形態であってもいい。
【００３６】
ストレージＩＦ３１４およびディスクＩＦ３２３の間の通信プロトコルとしては、ＳＣＳＩやｉＳＣＳＩなど通信プロトコルが好適である。なお、本実施形態ではファイルサーバ３１０とディスクサブシステム３２０が異なる２つの装置から構成されている例を示しているが、ファイルサーバ３１０とディスクサブシステム３２０が一体の装置により構成されていてもよい
【００３７】
＜ソフトウェア構成＞
図３Ａは、本実施形態のファイルストレージ３００のソフトウェア構成例を示すブロック図である。図３Ｂは、記憶デバイスとＬＵとボリュームの関係を示すブロック図である。まず、図３Ａでファイルストレージ３００のソフトウェア構成を説明する。
【００３８】
ファイルサーバ３１０は、オペレーティングシステムプログラム３１２１、ネットワークファイルサービスプログラム３１２２、ファイルサーバ管理プログラム３１２３、ファイル移動プログラム３１２４、ネットワークファイルクライアントプログラム３１２６を実行する。またファイルサーバ３１０は、ボリューム管理テーブル３１５１を内蔵ディスク３１５に記憶している。
【００３９】
オペレーティングシステムプログラム３１２１は、入出力制御機能、ディスク、メモリ等の記憶装置への読み書き制御機能などを有し、他のプログラムにこれらの機能を提供する。オペレーティングシステムプログラム３１２１は内部にファイルシステムモジュール３１２７と、ボリューム管理モジュール３１２５を含む。
【００４０】
ファイルシステムモジュール３１２７は、記憶デバイス３２４に格納されたデータをファイル単位またはディレクトリ単位で管理する機能を有し、これらのファイル、ディレクトリに対するアクセスＩＦを上位プログラムに対して提供する。ファイルシステムモジュール３１２７は、ファイル、ディレクトリのアクセス処理の他に、ファイルの複製処理を行うファイルクローニングモジュール３１２８とスナップショットモジュール３１２９を含む。
【００４１】
ファイルクローニングモジュール３１２８は、複製元ファイルと物理格納データを共有する、クローンファイル５００３と呼ばれる複製ファイルを作成するファイルクローニング機能を提供する。クローンファイル５００３は、複製直後は全領域で複製元ファイルの物理格納データを参照するが、ファイルライト処理により更新が発生した場合に、更新箇所については更新データ用に新規に割り当てた物理格納領域を参照する。
【００４２】
スナップショットモジュール３１２９は、複製元ファイルのある時点の静止化イメージを持つスナップショットファイルを作成する機能を提供する。スナップショットファイルも複製元ファイルと物理格納データを共有する点でクローンファイル５００３と共通するが、複製元ファイルへのファイルライト時が発生した際に、新規に割り当てた物理格納領域に、更新データではなく、更新前のデータを複製する点で、クローンファイル５００３と異なる。
【００４３】
ボリューム管理モジュール３１２５は、図３Ｂのように、ディスクサブシステム３２０が提供するＬＵ（Ｌｏｇｉｃａｌ  Ｕｎｉｔ、後述）を論理的に結合し、一つの連続した論理記憶領域であるボリューム５１００として管理する。また、ボリューム管理モジュール３１２５は、ファイルシステムモジュール３１２７に対してボリューム５１００にディスクブロック５０２２（後述）を格納するためのアクセスＩＦを提供する。ボリューム管理モジュール３１２５の好例として、Ｌｉｎｕｘ（登録商標）ＯＳに含まれるＬＶＭ（Ｌｏｇｉｃａｌ  Ｖｏｌｕｅｍｅ  Ｍａｎａｇｅｒ）があげられる。
【００４４】
ネットワークファイルサービスプログラム３１２２は、クライアントサーバ２００に対して、記憶デバイス３２４に格納されたデータをファイル単位またはディレクトリ単位でアクセスするＩＦを提供する。ネットワークファイルサービスプログラム３１２２は、クライアントサーバ２００からファイルに対するファイル操作要求を受信した際には、ファイルシステムモジュール３１２７を介して、ディスクサブシステム３２０に格納されたファイルの読み書きを行う。
【００４５】
ファイルサーバ管理プログラム３１２３は、管理サーバ１００上で動作する管理ＧＵＩプログラム１００１と連携し、管理者がファイルサーバ３１０の管理するためのインターフェースを提供する。
【００４６】
ファイル移動プログラム３１２４はボリューム５１００内部およびボリューム５１００またがりでファイルを複製する機能をクライアントサーバ２００と上位サーバに提供する。
ネットワークファイルクライアントプログラム３１２６は、外部のファイルストレージが提供するネットワークファイルサービスに対してファイル操作要求を発行し、応答を受け取るためのＩＦを他のプログラムに提供する。
【００４７】
ボリューム管理テーブル３１５１は、ボリューム管理モジュール３１２５が管理するボリューム５１００の管理情報を含む。ボリューム管理テーブル３１５１の詳細は、図９を用いて後述する。
【００４８】
ディスクサブシステム３２０は、ディスク制御プログラム３２２１を実行する。また、ディスクサブシステム３２０は、記憶デバイス３２４にファイルシステム管理情報３２４０を記憶する。
【００４９】
ディスク制御プログラム３２２１は、図３Ｂのように、一つ以上の記憶デバイス３２４を論理的に結合し、一つの連続した記憶領域であるＬＵ６１００として管理する。ディスク制御プログラム３２２１は、データをブロック単位でＬＵ６１００に格納するＩＦをファイルサーバ３１０に提供する。なお、ここでいうブロックとは記憶デバイス３２４の物理格納領域に固定長のデータを格納するための論理的な単位のことを言う。ディスク制御プログラム３２２１は、ファイルサーバ３１０からディスクブロック番号と長さを指定したＩＯ（Ｉｎｐｕｔ／Ｏｕｔｐｕｔ）要求を受信した際に、対応する記憶デバイス３２４へのＩＯ要求を発行し、ファイルサーバ３１０に応答を返す制御を行う。
【００５０】
ファイルシステム管理情報３２４０はファイルシステムモジュール３１２７がボリューム５１００内のファイルを管理するために用いる管理情報であり、ボリューム５１００につき一つ存在する。ファイルシステムモジュール３１２７は、ファイルシステム管理情報３２４０をメインメモリ３１２上に読み込み、ファイルとディレクトリを管理するための制御を行う。ファイルシステム管理情報３２４０の詳細は図５を用いて後述する。
【００５１】
管理サーバ１００は管理ＧＵＩプログラム１００１を実行する。なお、図中では省略しているが管理ＧＵＩプログラム１００１は、管理サーバ１００のメインメモリ上に格納され、ＣＰＵが実行する。管理ＧＵＩプログラム１００１は管理者に対してファイルサーバ３１０を操作するためのＩＦを提供する。管理者が行うファイルサーバ３１０に対する操作内容は、管理ＧＵＩプログラム１００１がファイルサーバ管理プログラム３１２３へ通知しファイルサーバ３１０に反映する。
【００５２】
（１−２）第１実施形態の概要
本実施形態においては、ファイルクローニングモジュール３１２８は、異なるボリューム５１００上にある親ファイル５００１に対してクローンファイル５００３を作成する手段を提供する。
【００５３】
ファイルクローニングモジュール３１２８は異なるボリュームにあるファイルを複製する際に、複製元ファイルの静止化イメージ（親ファイル５００１）に対して、ファイルストレージ３００内部で親ファイルを一意に識別するための識別子（ｕｕｉｄ）を持つ仮想親ファイル５００２を作成し、クローンファイル５００３の仮想的な親ファイルとする。
【００５４】
また、ファイルシステムモジュール３１２７は、クローンファイル５００３に対するファイル操作要求受信時に、仮想親ファイル５００２の有するｕｕｉｄ情報から親ファイル５００１のブロックレイアウトテーブル５００６を取得する制御を行い、親ファイル５００１の物理格納データにアクセスする。また、親ファイル５００１の移動時には、仮想親ファイル５００２のｕｕｉｄの参照先の切り替え制御を行う。このように、仮想親ファイル５００２を設けることで、クローンファイルは、参照する親ファイルを切り替え可能となる。
クローンファイルが多数あるような場合でも更新対象は仮想親ファイルのみとなるため、
クローンファイル数によらず一定時間での切り替え処理が可能である。
【００５５】
これにより、クローンファイル５００３を異なるボリュームの親ファイル５００１に対して作成することや、親ファイルやクローンファイルを異なるボリュームに移動することが可能となる。その結果、管理者は性能要件に応じて親ファイルとクローンファイルを格納する記憶デバイス３２４を選択することできる。例えば、多数のクローンファイル５００３を有する親ファイル５００１を高速な記憶デバイス（ＳＳＤ）３２５に格納することで、より多くのクローンファイルを作成することが可能となる。
【００５６】
また、本実施形態では、複数の異なるボリューム５１００に格納した親ファイル５００１の複製に対して、親ファイル５００１のアクセスを分散することも可能である。その結果、親ファイル５００１のアクセス性能を高めることができるようになる。例えば、単一の記憶デバイス（ＳＳＤ）３２５で十分な性能を確保できない場合に、他の記憶デバイス（ＳＳＤ）に親ファイル５００１の複製を作成することで、より多くのクローンファイル５００３を作成することが可能となる。
【００５７】
（１−３）第１実施形態の実装例
＜ファイル管理方法＞
第１実施形態では、ファイルシステムモジュール３１２７は通常ファイルの他に、複製元ファイルの静止化イメージである親ファイル５００１と、親ファイル５００１と物理格納データを共有するクローンファイル５００３と、を管理する。なお、本発明での通常ファイルは、親ファイル５００１、クローンファイル５００３、親クローンファイル５０００（後述）、仮想親ファイル５００２（後述）以外のファイルの総称とする。また、親ファイル５００１と複製元ファイルの差分データの管理は、複製元ファイル自身をクローンファイル化した親クローンファイル５０００に置き換えることで実現する。以下、これらのファイルを管理するために用いるファイルシステム管理情報３２４０について、従来方式と本実施形態の実装例について説明する。
【００５８】
図４は従来のファイルクローニング技術におけるファイルシステム管理情報３２４０の説明図である。ファイルシステム管理情報３２４０には、ボリューム５１００内の各ファイルに対して、ファイルの管理情報を記憶するｉｎｏｄｅと、ファイルの物理格納データの格納位置を管理するブロックレイアウトテーブル５００６を有する。
【００５９】
従来のファイルクローニング技術では、ｉｎｏｄｅ５００５を用いて同一ボリューム内の親ファイル５００１、クローンファイル５００３、親クローンファイル５０００の参照関係を管理する。また、ファイルシステムモジュール３１２７は、ブロックレイアウトテーブル５００６を用いて各ファイルの物理格納データを管理する。この場合、親ファイル５００１が元のファイルのデータを管理し、クローンファイル５００３と親クローンファイル５０００が親ファイル５００１からの差分データを管理する以下、ｉｎｏｄｅ５００５の管理する情報ついて説明する。なお、ブロックレイアウトテーブル５００６については、図６を用いて後述する。
【００６０】
ｉｎｏｄｅ番号５００７は、ファイルシステムが管理するボリューム内部にてｉｎｏｄｅ５００５を一意に識別するための識別子である。ファイルシステムモジュール３１２７はファイルシステム管理情報３２４０から、ｉｎｏｄｅ番号５００７に対応するｉｎｏｄｅ５００５を取得することができる。ファイルフラグ５０１３はファイルの種別を示すフラグであり、クローンファイルビット、親ファイルビット、親クローンファイルビットの３つのビットを持つ。
【００６１】
ファイルシステムモジュール３１２７はファイルフラグ５０１３にて、ファイルが親ファイル５００１か、仮想親ファイル５００２か、親クローンファイル５０００かを、見分けることができる。ファイル属性５００９はファイルのアクセス権限を示す情報である。ファイルシステムモジュール３１２７はファイル操作要求受信時には、ファイル属性５００９を調べ、アクセス元が操作対象ファイルの操作権限をもつかどうかを判断する。
【００６２】
親ｉｎｏｄｅ番号５００８は、親ファイル５００１のｉｎｏｄｅ５００５のｉｎｏｄｅ番号５００７であり、クローンファイル５００３と親クローンファイル５０００に対して設定する。この設定により、図４に示すようにクローンファイル５００３と親クローンファイル５０００が親ファイル５００１を指し示せる。親クローンｉｎｏｄｅ番号５０１４は、親クローンファイル５０００のｉｎｏｄｅ５００５のｉｎｏｄｅ番号５００７であり、親ファイル５００１に対して設定する。この設定により、図４に示すように親ファイル５００１が親クローンファイル５０００を指し示せる。参照カウンタ５０１０は、親ファイル５００１を参照するクローンファイル５００３および親クローンファイル５０００の数であり、親ファイル５００１に対して設定する。図４の場合は、参照するクローンファイル５００３および親クローンファイル５０００はそれぞれ１ファイルであるので、参照カウンタ５０１０は“２”となる。
【００６３】
図中に示す通り、クローンファイル５００３、親ファイル５００１、親クローンファイル５０００は親ｉｎｏｄｅ番号５００８および親クローンｉｎｏｄｅ番号５０１４を用いることで、お互いの関係を管理する。
【００６４】
図５は本実施形態におけるファイルシステム管理情報３２４０の説明図である。本実施形態におけるファイルシステム管理情報３２４０は、異なるボリュームのｉｎｏｄｅを参照するためのｕｕｉｄ（Ｕｎｉｖｅｒｓａｌｌｙ  Ｕｎｉｑｕｅ  Ｉｄｅｎｔｉｆｉｅｒ）を持つ点、およびクローンファイル５００３の同一ボリューム内に仮想親ファイル５００２を有する点で従来方式と異なる。以下、図４で述べた従来方式との差分について説明する。
【００６５】
本実施形態のファイルシステム管理情報３２４０は、従来のファイル種別に加え仮想親ファイル５００２の管理情報を含む。仮想親ファイル５００２には、ファイルシステムモジュール３１２７が、親ファイル５００１の代わりとして使用するために必要な情報が格納される。この場合、仮想親ファイル５００２自身は物理格納データを管理しないため、ブロックレイアウトテーブル５００６は空となる。
【００６６】
各ｉｎｏｄｅ５００５のファイルフラグ５０１３は、従来のビットに加え、仮想親ファイルビットを含む。仮想親ファイルビットは仮想親ファイル５００２に対して設定する。また、ｉｎｏｄｅ５００５は親ｉｎｏｄｅ番号５００８の代わりにｕｕｉｄテーブル５０１２を有する。
【００６７】
クローンファイル５００３と親クローンファイル５０００のｉｎｏｄｅ５００５のｕｕｉｄテーブル５０１２には仮想親ファイル５００２のｕｕｉｄが、仮想親ファイル５００２のｉｎｏｄｅ５００５のｕｕｉｄテーブル５０１２には一つ以上の親ファイル５００１のｕｕｉｄが、親ファイル５００１のｉｎｏｄｅ５００５のｕｕｉｄテーブル５０１２には一つ以上の仮想親ファイル５００２のｕｕｉｄを設定する。ｕｕｉｄテーブル５０１２の格納情報の詳細については図８を用いて後述する。また、親ファイル５００１のｉｎｏｄｅ５００５の親クローンｕｕｉｄ５０１５には親クローンファイル５０００のｕｕｉｄを設定する。
【００６８】
図５に示す通り、クローンファイル５００３、親ファイル５００１、親クローンファイル５０００、仮想親ファイル５００２は、本発明の特徴であるｕｕｉｄを格納するｕｕｉｄテーブル５０１２および親クローンｕｕｉｄ５０１５を用いることで、お互いの関係を管理できる。
【００６９】
図６はブロックレイアウトテーブル５００６の説明図である。ファイルシステムモジュール３１２７はブロックレイアウトテーブル５００６を用いて、ファイルに含まれる物理格納データの格納位置を管理する。物理格納データの管理では、ファイル内のデータの管理単位であるファイルブロック５０１９と、ボリューム５１００のデータ格納位置を示すディスクブロック５０２２のアドレス変換を行い、記憶デバイス３２４内の物理格納領域を特定する。
【００７０】
なお、厳密にいえばディスクブロック５０２２の記憶デバイス３２４内の物理格納位置は、ボリューム管理モジュール３１２５およびディスク制御プログラム３２２１のアドレス変換後に決まる。ここでは説明の簡略化のため、ディスクブロック５０２２と記憶デバイス３２４の物理格納領域が一対一に対応することを想定する。また、ファイルブロック５０１９およびディスクブロック５０２２のブロック長が４ＫＢであることを想定する。
【００７１】
ファイルシステムモジュール３１２７は、一つ以上の連続するファイルブロックを、ファイルデータ５０１８として上位プログラムに提供する。ブロックレイアウトテーブル５００６の各行はそれぞれファイルデータ５０１８に対応し、ファイルデータ５０１８のファイルオフセット５００６Ａ、ディスク開始位置５００６Ｂ、ブロック長５００６Ｃを含む。
【００７２】
ファイルオフセット５００６Ａは、ファイルデータ５０１８に割り当てられたファイルブロック５０１９の先頭番号を示す。ディスク開始位置５００６Ｂはファイルデータ５０１８に割り当てられたディスクブロック５０２２の先頭番号を示す。ブロック長５００６Ｃはファイルデータ５０１８に含まれるブロック数を示す。
【００７３】
なお、ファイルブロック５０１９には、ファイルデータ５０１８を持たないホールが存在してもよい。その場合、ファイルブロック５０１９は対応するディスクブロック５０２２を持たないため、ファイルブロック数に対してより少ないディスクブロック数にてファイルを構成することができる。なお、ファイルシステムモジュール３１２７はホールに対するリード要求を受信した場合、全領域が０で埋められたゼロデータを応答する。
【００７４】
図７はクローンファイルのデータ管理方法を示した説明図である。ファイルシステムモジュール３１２７は、クローンファイル５００３のファイルブロック５０１９と、親ファイル５００１のファイルブロック５０２０からクローンファイル５００３のデータ（クローンファイルデータ５０２１）を構成する。
【００７５】
クローンファイルデータ５０２１は、クローンファイル５００３のファイルブロック５０１９がホールでない場合にはクローンファイル５００３のファイルブロック５０１９を含む。それ以外の場合、親ファイル５００１のファイルブロック５０２０がホールでない場合、クローンファイルデータ５０２１は、親ファイル５００１のファイルブロック５０２０を含む。クローンファイル５００３のファイルブロック５０１９と親ファイル５００１のファイルブロック５０２０がホールの場合、該当領域はホールとして処理される。なお、クローンファイル５００３のファイルブロック５０１９と親ファイル５００１のファイルブロック５０２０は、図５で述べた制御にて管理する。
【００７６】
図８はｕｕｉｄテーブル５０１２の説明図である。ｕｕｉｄテーブル５０１２の各行はファイルストレージ３００内のｉｎｏｄｅ５００５をファイルストレージ３００内で一意に識別するための識別子となり、ボリュームＩＤ５０１２ＢとファイルＩＤ５０１２Ｃを含む。
【００７７】
ボリュームＩＤ５０１２Ｂはボリューム管理モジュール３１２５が管理するボリューム５１００を、ファイルストレージ３００内で一意に識別するための識別子である。ファイルＩＤはボリューム５１００内部でファイルを一意に識別する識別子でありｉｎｏｄｅ番号５００７を使用する。
【００７８】
図９はボリューム管理テーブル３１５１の説明図である。ボリューム管理テーブル３１５１の各行は、ボリューム管理モジュール３１２５が管理するボリューム５１００に対応し、ボリュームＩＤ３１５１Ａ、マウントポイント３１５１Ｂ、ＬＵ番号３１５１Ｃ、ファイルシステム種別３１５１Ｄからなる。
【００７９】
ボリュームＩＤ３１５１Ａはファイルストレージ３００内でボリューム５１００を一意に識別するための識別子である。マウントポイント３１５１Ｂはボリューム５１００がマウントされているファイルパスである。ここでいうマウントとはオペレーティングシステムプログラム３１２１がボリューム５１００や周辺機器を認識しアクセス可能とする操作のことである。
【００８０】
上位プログラムはマウントポイント以下のファイルに対してアクセスすることで、ボリューム５１００内のファイルにアクセスできる。ＬＵ番号３１５１Ｃはボリューム５１００を構成する一つ以上のＬＵの識別子である。ファイルシステム種別３１５１Ｄはボリューム５１００に作成されたファイルシステムの種別である。
【００８１】
＜ファイル操作要求処理方式＞
ファイルシステムモジュール３１２７は、クローンファイル５００３へのファイル操作要求を受信時に、ファイルクローニングモジュール３１２８と連携して要求を処理する。また、クローンファイル５００３や親ファイル５００１の移動要求受信時には、ファイル移動プログラム３１２４が移動処理を行う。以降では、各ファイル操作要求とファイル移動要求に対する処理方式について説明する。
【００８２】
図１０はクローンファイル作成処理におけるファイルクローニングモジュール３１２８の制御を示すフローチャート図である。ファイルクローニングモジュール３１２８は、ファイルサーバ管理プログラム３１２３から受信したクローンファイル作成コマンドに基づき以下に示すクローンファイル作成処理を実行する。
【００８３】
ファイルクローニングモジュール３１２８はクローンファイル作成コマンドを受信した場合、クローンファイル５００３の作成処理を開始する（Ｓ１００）。なお、クローンファイル作成コマンドにはクローンを作成する複製元ファイルのファイルパス（複製元ファイルが格納されている場所）と、作成するクローンファイル５００３のファイルパス（作成したクローンファイルを格納する場所）が含まれる。
【００８４】
ファイルクローニングモジュール３１２８は、ファイルシステムモジュール３１２７に問い合わせ、複製元ファイルのファイルパスに対応する処理対象ファイルとそのｉｎｏｄｅ５００５を取得する（Ｓ１０１）。このステップＳ１０１実行時に、ファイルパスに対応する処理対象ファイルが見つからない場合、クローンファイル作成処理を終了する。
【００８５】
ファイルクローニングモジュール３１２８は、複製元ファイルのｉｎｏｄｅ中のファイルフラグ５０１３の値を調べる（Ｓ１０２）。もし、複製元ファイルが親ファイル５００１もしくは親クローンファイル５００３の場合（Ｓ１０２のＹｅｓ）はステップＳ１０４以降の処理を行う。
【００８６】
ファイルクローニングモジュール３１２８は、複製元ファイルの静止化処理を行い、親ファイル５００１とする（Ｓ１０３）。このステップＳ１０３実行時に、親ファイル５００１のファイル名を任意の別名に変更する。その後、親ファイル５００１に対し、静止化前の複製元ファイルのファイルパスと同じファイルパスを持つ親クローンファイル５０００を作成する。
【００８７】
この際、ファイルクローニングモジュール３１２８は親クローンファイル５０００のｕｕｉｄテーブルに親ファイル５００１のｕｕｉｄを記録し、ファイル属性５００９は親ファイル５００１のファイル属性５００９を複製し、親ファイル５００１の参照カウンタ５０１０を１加算する。また、親ファイル５００１のｉｎｏｄｅ５００５の親クローンｉｎｏｄｅ番号５０１４には、親クローンファイル５０００のｕｕｉｄを設定する。
【００８８】
ファイルクローニングモジュール３１２８は処理対象ファイル（複製元ファイル）のファイルパス、指定されたクローンファイル５００３のファイルパス、およびボリューム管理テーブル３１５１から、処理対象ファイル（複製元ファイル）と指定されたクローンファイル５００３とが同一のボリューム５１００にあるかどうかを判断する（Ｓ１０４）。もし、処理対象ファイル（複製元ファイル）とクローンファイル５００３が同一のボリュームにある場合（Ｓ１０４のＹｅｓ）は、ステップＳ１０７の処理を行う。
【００８９】
処理対象ファイル（複製元ファイル）とクローンファイル５００３が同一のボリュームにない場合（Ｓ１０４のＮｏ）、ファイルクローニングモジュール３１２８は親ファイル５００１のｕｕｉｄテーブル５０１２を調べ、仮想親ファイル５００２が同一ボリューム５１００内に既に作成されているかどうかを判断する（Ｓ１０５）。もし、既に仮想親ファイル５００２が作成されている場合（Ｓ１０５のＹｅｓ）、ステップＳ１０７以降の処理を行う。なお、ステップＳ１０２にて処理対象ファイルが親ファイル５００１でないことが分かっている場合、判定処理は省略してもよい。
【００９０】
仮想親ファイル５００２が作成されていない場合（Ｓ１０５のＮｏ）、ファイルクローニングモジュール３１２８は、親ファイル５００１に対して仮想親ファイル５００２を作成する（Ｓ１０６）。ファイルクローニングモジュール３１２８は、ボリューム管理モジュール３１２５から親ファイル５００１のボリュームＩＤ５０１２Ｂを調べ、ｕｕｉｄを作成する。
【００９１】
その後、ファイルクローニングモジュール３１２８はローカルボリューム内に空ファイルを作成し、ファイルフラグ５０１３の仮想親フラグビットを設定して、仮想親ファイル５００２とする。
【００９２】
その後、ファイルクローニングモジュール３１２８は仮想親ファイル５００２のｕｕｉｄテーブル５０１２に親ファイル５００１のｕｕｉｄを、親ファイル５００１のｕｕｉｄテーブルに仮想親ファイル５００２のｕｕｉｄを追加する。その後、ファイルクローニングモジュール３１２８は、親ファイル５００１のファイル属性５００９を、仮想親ファイル５００２のファイル属性５００９に複製する。最後に、ファイルクローニングモジュール３１２８は親ファイル５００１の参照カウンタ５０１０を１加算して仮想親ファイル作成処理を終了する。
【００９３】
ファイルクローニングモジュール３１２８は、親ファイル５００１が同一ボリュームにある場合親ファイル５００１に対し、そうでない場合は仮想親ファイル５００２に対してクローンファイル５００３を作成する（Ｓ１０７）。
【００９４】
クローンファイル５００３のｕｕｉｄテーブル５０１２には同一ボリューム内に親ファイル５００１がある場合に親ファイル５００１のｕｕｉｄを記録し、そうでない場合は、仮想親ファイル５００２のｕｕｉｄを記録する。なお、同一ボリューム内の親ファイル５００１のｕｕｉｄについては装置ＩＤを省略し、ｉｎｏｄｅ番号のみを記録してもよい。また、クローンファイル５００３のファイル属性５００９は親ファイル５００１または、仮想親ファイル５００２のファイル属性５００９を複製する。
【００９５】
最後に、親ファイル５００１または仮想親ファイル５００２の参照カウンタ５０１０を１加算しクローンファイル作成処理を終了する。
【００９６】
図１１はクローンファイル５００３に対するファイルリード処理受信時のファイルシステムモジュール３１２７の制御を示したフローチャートである。ファイルシステムモジュール３１２７は、上位プログラムからファイルリード要求を受信した際に、以下に示すクローンファイルリード処理を実行する。この際、クローンファイル５００３が仮想親ファイル５００２を参照している場合、ファイルシステムモジュール３１２７は、仮想親ファイル５００２の持つ親ファイル５００１のｕｕｉｄから、親ファイル５００１のブロックレイアウトテーブル５００６を取得する制御を行う。
【００９７】
ファイルシステムモジュール３１２７はクローンファイル５００３に対するファイルリード要求を受信した場合、クローンファイル５００３のリード処理を開始する（Ｓ２００）。ファイルリード要求には、処理対象となるクローンファイル５００３のファイルパスと、リード対象となるファイルブロック５０１９の先頭位置と長さが含まれる。
【００９８】
ファイルシステムモジュール３１２７は、クローンファイル５００３のｕｕｉｄテーブル５０１２中のｕｕｉｄに示されるｉｎｏｄｅ（親候補ｉｎｏｄｅ５００５）のファイルフラグ５０１３を調べ、クローンファイル５００３が親ファイル５００１を参照するか、仮想親ファイル５００２を参照するかどうかを調べる（Ｓ２０１）。もし、仮想親ファイル５００２を参照している場合、仮想親ファイル５００２のｕｕｉｄテーブル５０１２から本当の親ファイル５００１のｉｎｏｄｅ５００５を取得する。
【００９９】
もし、ｕｕｉｄテーブルに複数の親ファイル５００１が登録されている場合は、ファイルシステムモジュール３１２７は前回アクセスしたｕｕｉｄの次のｕｕｉｄに対する親ファイル５００１のｉｎｏｄｅ５００５を取得する。なおここで、前回アクセスと異なるｕｕｉｄを選択したのは、親ファイル５００１のアクセス負荷を分散させるためである。その後、ファイルシステムモジュール３１２７は、親ファイル５００１のｉｎｏｄｅ５００５から、親ファイル５００１のブロックレイアウトテーブル５００６を取得する。
【０１００】
次に、ファイルシステムモジュール３１２７は、リードサイズ分のバッファ領域をメインメモリ３１２上に確保し、ファイルパスからリード対象のクローンファイル５００３のｉｎｏｄｅ５００５を取得する（Ｓ２０２）。その後、読み込み対象領域に含まれるファイルブロック５０１９に対してステップＳ２０３からステップＳ２０７で示す処理を行う。
【０１０１】
次に、ファイルシステムモジュール３１２７は、クローンファイル５００３のブロックレイアウトテーブル５００６を調べ、処理中のファイルブロック５０１９がホールかどうかを調べる（Ｓ２０３）。もし、ファイルブロック５０１９がホールの場合（Ｓ２０３のＮｏ）はＳ２０４以降の処理を、そうでない場合（Ｓ２０３のＹｅｓ）はステップＳ２０６以降の処理を行う。
【０１０２】
次に、ファイルシステムモジュール３１２７は、Ｓ２０１で取得したブロックレイアウトテーブル５００６から親ファイル５００１のファイルブロック５０２０がホールかどうかを判断する（Ｓ２０４）。もし、親ファイル５００１のファイルブロック５０２０がホールの場合（Ｓ２０４のＮｏ）、ゼロデータをバッファ領域に格納しステップＳ２０７の処理を行う。
【０１０３】
もし、親ファイル５００１のファイルブロック５０２０がホールでない場合（Ｓ２０４のＹｅｓ）、ファイルシステムモジュール３１２７は、親ファイル５００１のファイルブロック５０２０を記憶デバイス３２４から読み出し、バッファ領域に格納し、ステップＳ２０７の処理を行う（Ｓ２０５）。
【０１０４】
次に、ファイルシステムモジュール３１２７は、クローンファイル５００３のファイルブロック５０１９を記憶デバイス３２４からバッファ領域に読み込み、ステップＳ２０７の処理を行う（Ｓ２０６）。
【０１０５】
次に、ファイルシステムモジュール３１２７はまだ処理していないファイルブロック５０１９が残っている場合、Ｓ２０１に戻り次のファイルブロック５０１９を処理する（Ｓ２０７）。
【０１０６】
最後に、ファイルシステムモジュール３１２７は、バッファ領域の内容をクライアントサーバ２００に応答して、ファイルリード処理を終了する（Ｓ２０８）。
【０１０７】
図１２はクローンファイル５００３に対するファイルライト処理受信時のファイルシステムモジュール３１２７の制御を示したフローチャートである。ファイルシステムモジュール３１２７は、上位プログラムからファイルライト要求を受信した際に、以下に示すクローンファイルライト処理を実行する。この際、ファイルリード処理と同様に、仮想親ファイル５００２を参照するクローンファイル５００３の場合、仮想親ファイル５００２から親ファイル５００１のブロックレイアウトテーブル５００６を取得する制御を行う。
【０１０８】
ファイルシステムモジュール３１２７はクローンファイル５００３に対するファイルライト要求を受信した場合、クローンファイル５００３のライト処理を開始する（Ｓ３００）。ファイルライト要求には、処理対象となるクローンファイル５００３のファイルパスと、ライト対象となるファイルブロック５０１９の先頭位置と、書き込みデータが含まれる。
【０１０９】
ファイルシステムモジュール３１２７は親ファイル５００１のブロックレイアウトテーブル５００６を取得する（Ｓ３０１）。本処理はステップＳ２０１と同等のため、説明を省略する。
【０１１０】
次に、ファイルシステムモジュール３１２７は、Ｓ３００の書き込みデータをメインメモリ３１２上の受信バッファに格納し、更新対象となる各ファイルブロック５０２０に対してＳ３０３からＳ３０７に示す処理を行う（Ｓ３０２）。
【０１１１】
次に、ファイルシステムモジュール３１２７は、書き込みデータがファイルブロック５０２０の４ＫＢ分の全データを含むかどうかを判定する（Ｓ３０３）。これは、書き込みデータがファイルブロック５０２０の一部分のみの場合、ファイルブロック５０２０の残りの部分を読み込んだ上で更新する必要があるためである。もし、書き込みデータがファイルブロック５０２０の一部分のみの場合（Ｓ３０３のＹｅｓ）、ステップＳ３０４で示す処理を行う。そうでない場合（Ｓ３０３のＮｏ）、ステップＳ３０６の処理を行う。
【０１１２】
次に、ファイルシステムモジュール３１２７は、親ファイル５００１のファイルブロック５０２０がホールかどうかを調べる（Ｓ３０４）。これはＳ２０４と同等の処理となる。もし親ファイル５００１がホールの場合（Ｓ３０４のＮｏ）、ステップＳ３０６の処理を行う。
【０１１３】
次に、ファイルシステムモジュール３１２７は、親ファイル５００１のファイルブロック５０２０を記憶デバイス３２４からバッファ領域に読み込む（Ｓ３０５）。本処理はステップＳ２０４の処理と同等である。
【０１１４】
次に、ファイルシステムモジュール３１２７は、処理対象のファイルブロック５０２０に対する書き込みデータを、記憶デバイス３２４に書き込む（Ｓ３０６）。なお、処理対象ファイルブロック５０２０に対しＳ３０５の処理を行っている場合、バッファ領域上のファイルブロック５０２０の一部を更新したデータを書き込む。
【０１１５】
もし、ファイルシステムモジュール３１２７はまだ処理していないファイルブロック５０２０が残っている場合、Ｓ３０２に戻り次のファイルブロック５０２０を処理する（Ｓ３０７）。
【０１１６】
最後に、ファイルシステムモジュール３１２７は、ファイルライト命令が完了したことをクライアントサーバ２００に通知し、ファイルライト処理を終了する（Ｓ３０８）。
【０１１７】
図１３はクローンファイル５００３に対する削除要求受信時のファイルシステムモジュール３１２７の制御を示したフローチャートである。ファイルシステムモジュール３１２７は、上位プログラムからクローンファイル５００３または親クローンファイル５０００に対する削除要求を受信した際に、以下に示すクローンファイル５００３の削除処理を実行する。
【０１１８】
ファイルシステムモジュール３１２７はクローンファイル５００３に対する削除要求を受信した場合にクローンファイル削除処理を開始する（Ｓ４００）。なお、削除要求には、処理対象となるクローンファイル５００３のファイルパスが含まれる。
【０１１９】
ファイルシステムモジュール３１２７は、削除対象となるクローンファイル５００３のｕｕｉｄテーブル５０１２を調べ、親ファイル５００１または仮想親ファイル５００２のｉｎｏｄｅ５００５を取得する（Ｓ４０１）。その後、ファイルシステムモジュール３１２７は、通常ファイルと同等の方法でクローンファイル５００３の削除を行う。
【０１２０】
ファイルシステムモジュール３１２７は、Ｓ４０１で得たｉｎｏｄｅ５００５が仮想親ファイル５００２でない場合（Ｓ４０２のＮｏ）、ステップＳ４０６以降の処理を行う（Ｓ４０２）。
【０１２１】
Ｓ４０１で得たｉｎｏｄｅ５００５が仮想親ファイル５００２である場合（Ｓ４０２のＹｅｓ）、ファイルシステムモジュール３１２７は、仮想親ファイル５００２の参照カウンタ５０１０を１減算する（Ｓ４０３）。
【０１２２】
仮想親ファイル５００２の参照カウンタ５０１０が０でない場合（Ｓ４０４のＮｏ）、ファイルシステムモジュール３１２７は、クローンファイル５００３の削除処理を終了する（Ｓ４０４）。
【０１２３】
仮想親ファイル５００２の参照カウンタ５０１０が０である場合（Ｓ４０４のＹｅｓ）、ファイルシステムモジュール３１２７は、仮想親ファイル５００２のｕｕｉｄテーブルを参照し、先頭のｕｕｉｄを親ファイル５００１のｕｕｉｄとして取得し、仮想親ファイル５００２を削除する（Ｓ４０５）。
【０１２４】
次に、ファイルシステムモジュール３１２７は、親ファイル５００１の参照カウンタ５０１０を１減算する（Ｓ４０６）。
【０１２５】
親ファイル５００１の参照カウンタ５０１０が０でない場合（Ｓ４０７のＮｏ）、ファイルシステムモジュール３１２７は、クローンファイル５００３の削除処理を終了する（Ｓ４０７）。
【０１２６】
親ファイル５００１の参照カウンタ５０１０が０である場合（Ｓ４０７のＹｅｓ）、ファイルシステムモジュール３１２７は、親ファイル５００１を削除し、クローンファイル削除処理を終了する（Ｓ４０８）。親ファイル５００１の削除処理は、通常ファイルと同等である。なお、この時点で親ファイル５００１の参照カウンタ５０１０が０のため、親ファイル５００１に対するクローンファイル５００３、および親クローンファイル５０００がないことが保障されている。
【０１２７】
図１４はクローンファイル５００３に対するスプリット要求受信時のファイルクローニングモジュール３１２８の制御を示したフローチャートである。クローンファイル５００３のスプリット処理とは、クローンファイル５００３と親ファイル５００１の物理格納データの共有をやめ、クローンファイル５００３に親ファイル５００１と共有していた物理格納データを複製する処理である。このスプリット処理の実行後、クローンファイル５００３は通常ファイルとなる。
【０１２８】
スプリット処理は、クローンファイル５００３のアクセスが、他のクローンファイル５００３に対するアクセスと競合し、性能要件を満たさなくなった場合に使用される。ファイルクローニングモジュール３１２８は、上位プログラムからクローンファイル５００３のスプリット要求を受信した際に、以下に示すスプリット処理を実行する。
【０１２９】
ファイルクローニングモジュール３１２８は上位プログラムから、クローンファイル５００３に対するスプリット要求を受信した場合にスプリット処理を開始する（Ｓ５００）。スプリット要求には、処理対象ファイルとなるクローンファイル５００３のファイルパスが含まれる。
【０１３０】
ファイルクローニングモジュール３１２８は親ファイル５００１のブロックレイアウトテーブル５００６を取得する（Ｓ５０１）。本処理はステップＳ２０１と同等のため、説明を省略する。
【０１３１】
ファイルクローニングモジュール３１２８はクローンファイル５００３に含まれるホール部分も含めた全てのファイルブロック５０１９に対して、ステップＳ５０３からステップＳ５０６に示す処理を行う（Ｓ５０２）。
【０１３２】
ファイルクローニングモジュール３１２８は、処理対象のファイルブロック５０１９が、クローンファイル５００３においてホールかどうかを調べる（Ｓ５０３）。これはＳ２０３と同等の処理となる。もし、処理対象のファイルブロック５０１９がホールではない場合（Ｓ５０３のＹｅｓ）、ステップＳ５０６の処理を行う。
【０１３３】
ファイルクローニングモジュール３１２８は、処理対象のファイルブロック５０１９が親ファイル５００１においてホールかどうかを調べる（Ｓ５０４）。これはステップＳ２０４と同等の処理となる。もし親ファイル５００１がホールの場合、ステップＳ５０６の処理を行う。
【０１３４】
ファイルクローニングモジュール３１２８は、親ファイル５００１から処理対象ファイルブロック５０１９に対応するファイルブロック５０２０を読み込み、クローンファイル５００３に書き込み処理を行う（Ｓ５０５）。こうすることで、処理中のファイルブロック５０１９について、親ファイル５００１と同内容のファイルブロック５０１９がクローンファイル５００３に複製することができる。
【０１３５】
ファイルクローニングモジュール３１２８はまだ処理していないファイルブロック５０１９が残っている場合、Ｓ５０２に戻り次のファイルブロック５０１９を処理する（Ｓ５０６）。
【０１３６】
最後に、ファイルクローニングモジュール３１２８は親ファイル５００１または仮想親ファイル５００２の参照カウンタの減算処理を行う（Ｓ５０７）。この処理は、図１３で説明したファイル削除処理におけるステップＳ４０２からステップＳ４０８と同等のため、説明は省略する。
【０１３７】
図１５は仮想親ファイル５００２を持たない親ファイル５００１を、別のボリュームに移動する際のファイル移動プログラム３１２４の制御を示したフローチャートである。ファイル移動プログラム３１２４は、クライアントサーバ２００またはファイルサーバ管理プログラム３１２３から、仮想親ファイル５００２を持たない親ファイル５００１の移動要求を受信した際に、以下に示す親ファイル５００１の移動処理を行う。
【０１３８】
ファイル移動プログラム３１２４は親ファイル５００１に対する移動コマンドを受信した際に、親ファイル５００１が仮想親ファイル５００２を持たない場合、以下に示す親ファイル５００１の移動処理を行う（Ｓ６００）。移動コマンドは移動元の親ファイル５００１のファイルパスと移動先のファイルパスを含む。なお、ファイル移動プログラム３１２４は、移動ファイルのファイルフラグ５０１３から移動対象ファイルが親ファイル５００１であることを、ｕｕｉｄテーブル５０１２から仮想親ファイル５００２を持たないことをそれぞれ判断する。
【０１３９】
ファイル移動プログラム３１２４は移動元の親ファイル５００１（移動対象の親ファイル）の複製を移動先のボリュームに作成する（Ｓ６０１）。この際、親ファイル５００１の有するホールを除く全てのファイルブロック５０２０、ファイル属性５００９、親クローンｕｕｉｄ５０１５に設定された親クローンファイル５０００のｕｕｉｄが複製対象となる。
【０１４０】
ファイル移動プログラム３１２４は移動元の親ファイル５００１のｕｕｉｄテーブル５０１２に、Ｓ６０１で作成した複製ファイルのｕｕｉｄを登録する（Ｓ６０２）。また、移動先に複製したファイルのｕｕｉｄテーブル５０１２に、移動元の親ファイル５００１のｕｕｉｄを登録する。
【０１４１】
ファイル移動プログラム３１２４は移動先に複製したファイルの参照カウンタ５０１０に１を代入する（Ｓ６０３）。
【０１４２】
ファイル移動プログラム３１２４は移動元の親ファイル５００１のファイルフラグ５０１３に対して仮想親ファイルビットを、移動先に複製したファイルのファイルフラグ５０１３に対して親ファイルビットを設定する。この時点で移動元の親ファイル５００１は仮想親ファイル５００２となり、移動先に複製したファイルは親ファイル５００１となる（Ｓ６０４）。
【０１４３】
最後に、ファイル移動プログラム３１２４は仮想親ファイル５００２となった移動元の親ファイル５００１に対して、ディスクブロック５０２２の解放処理を行い、親ファイル５００１の移動処理を完了する（Ｓ６０５）。
【０１４４】
図１６は仮想親ファイル５００２を有する親ファイル５００１を別のボリューム５１００に移動する際のファイル移動プログラム３１２４の制御を示したフローチャートである。ファイル移動プログラム３１２４は、クライアントサーバ２００またはファイルサーバ管理プログラム３１２３から、仮想親ファイル５００２を持つ親ファイル５００１の移動要求を受信した際に、以下に示す親ファイル５００１の移動処理を行う。
【０１４５】
ファイル移動プログラム３１２４は親ファイル５００１に対する移動コマンドを受信した際に、親ファイル５００１が仮想親ファイル５００２を持つ場合、以下に示す親ファイルの移動処理を行う（Ｓ７００）。移動コマンドは移動元の親ファイル５００１のファイルパスと移動先のファイルパスを含む。ファイル移動プログラム３１２４は、移動するファイルのファイルフラグ５０１３とｕｕｉｄテーブルから仮想親ファイル５００２をもつ親ファイル５００１であることを判断する。また、移動先のファイルパスから別ボリュームへの移動であると判断する。
【０１４６】
ファイル移動プログラム３１２４は移動先のボリュームに、移動する親ファイル５００１（移動対象の親ファイル）の複製を作成する（Ｓ７０１）。この際、親ファイル５００１の有するホールを除く全てのファイルブロック５０２０、ファイル属性５００９、親クローンｕｕｉｄ５０１５に設定された親クローンファイル５０００のｕｕｉｄ、ｕｕｉｄテーブル５０１２、および参照カウンタ５０１０が複製対象となる。
【０１４７】
次に、ファイル移動プログラム３１２４は移動元の親ファイル５００１のｕｕｉｄテーブル５０１２を調べ、移動する親ファイル５００１の全ての仮想親ファイル５００２に対して、Ｓ７０３からＳ７０４の処理を行う（Ｓ７０２）。
【０１４８】
次に、ファイル移動プログラム３１２４は、処理中の仮想親ファイル５００２のｕｕｉｄテーブル５０１２中に含まれる、移動元の親ファイル（移動対象の親ファイル）のｕｕｉｄをＳ７０１で作成した親ファイル５００１の複製ファイルのｕｕｉｄに変更する（Ｓ７０３）。
【０１４９】
次に、ファイル移動プログラム３１２４は、もし残りの仮想親ファイル５００２が残っている場合、Ｓ７０２に戻り次の仮想親ファイル５００２の処理を、そうでない場合は以降の処理を行う（Ｓ７０４）。
【０１５０】
最後に、ファイル移動プログラム３１２４は、移動元の親ファイル５００１に対しディスクブロック５０２２の解放処理を行い、親ファイル５００１の移動処理を完了する（Ｓ７０５）。なお、本実施例では移動元の親ファイル５００１を削除する例を示したが、これは例示に過ぎない。
【０１５１】
図１６で述べた制御において、移動元の親ファイル５００１を削除せず、仮想親ファイル５００２のｕｕｉｄテーブルに移動元の親ファイル５００１のｕｕｉｄを残すことで、仮想親ファイル５００２の参照先に一つ以上の親ファイル５００１の複製を設定することが可能となる。
【０１５２】
図１７はクローンファイルを、親ファイル５００１と別のボリューム５１００に移動した場合のファイル移動プログラム３１２４の制御を示したフローチャートである。ファイル移動プログラム３１２４は、クライアントサーバ２００またはファイルサーバ管理プログラム３１２３から、クローンファイル５００３の移動要求を受信した際に、以下に示すクローンファイル５００３の移動処理を行う。
【０１５３】
ファイル移動プログラム３１２４は異なるボリューム５１００へのクローンファイル５００３の移動コマンドを受信した場合に、クローンファイル移動処理を開始する（Ｓ８００）。移動コマンドは、移動するファイルのファイルパス、移動先のファイルパスを含む。また、異なるボリューム５１００への移動かどうかの判断は、移動先のファイルパスから行う。
【０１５４】
次に、ファイル移動プログラム３１２４は、ファイルクローニングモジュール３１２８に対して、移動元のクローンファイル５００３のファイルパスと、クローン作成先となる移動先ファイルパスを含む、クローンファイル作成コマンドを発行する。ファイルクローニングモジュール３１２８は図１０で示したクローンファイル作成処理により、移動先に移動元のクローンファイル５００３と同じ親ファイル５００１を持つクローンファイル５００３を作成する（Ｓ８０１）。なお、移動先のクローンファイル５００３は全てのファイルブロック５０１９で親ファイル５００１の物理格納データを共有しており、移動元クローンファイル５００３と異なるデータを有する。
【０１５５】
次に、ファイル移動プログラム３１２４は、移動元のクローンファイル５００３の全てのファイルブロック５０１９に対し、Ｓ８０３からＳ８０５に示す処理を行う（Ｓ８０２）。
【０１５６】
次に、ファイル移動プログラム３１２４は、ファイルクローニングモジュール３１２８から、移動元のクローンファイル５００３のブロックレイアウトテーブル５００６を取得し、移動元のクローンファイル５００３が処理中のファイルブロック５０１９を持つかどうかを調べる（Ｓ８０３）。もし、移動元のクローンファイル５００３がファイルブロックを持たない場合（Ｓ８０３のＮｏ）、Ｓ８０５以降の処理を行う。
【０１５７】
次に、移動元のクローンファイル５００３がファイルブロックを持つ場合（Ｓ８０３のＹｅｓ）、ファイル移動プログラム３１２４は、移動元クローンファイル５００３から処理中のファイルブロック５０１９を読み取り、移動先のクローンファイル５００３に書き込む（Ｓ８０４）。この結果、移動先クローンファイル５００３のファイルブロック５０１９には移動元クローンファイル５００３のファイルブロック５０１９が複製される。
【０１５８】
次に、ファイル移動プログラム３１２４はまだ処理していないファイルブロック５０１９が残っている場合、Ｓ８０２に戻り次のファイルブロック５０１９を処理する（Ｓ８０５）。なお、全てのファイルブロック５０１９に対して処理が完了している場合、この時点で移動元のクローンファイル５００３と移動先のクローンファイル５００３は同一のデータを有する。
【０１５９】
次に、ファイル移動プログラム３１２４は、移動元のクローンファイル５００３のファイル属性５００９を読み取り、移動先のクローンファイル５００３を同一内容に変更する（Ｓ８０６）。
【０１６０】
最後に、ファイル移動プログラム３１２４は、移動元のクローンファイル５００３を削除し、クローンファイル５００３の階層移動処理を終了する（Ｓ８０７）。
【０１６１】
＜管理画面＞
図１８は管理ＧＵＩプログラム１００１が提供するクローンファイル作成処理、および親ファイル５００１またはクローンファイル５００３の移動処理の操作画面の説明図である。
【０１６２】
クローン管理画面１００２は管理者がクローンファイル５００３の作成と、親ファイル５００１またはクローンファイル５００３の移動を行うための管理ＧＵＩである。
【０１６３】
チェックボックス１００２Ａは、クローンファイル５００３を作成するための操作であることを示すチェックボックスである。テキストボックス１００２Ｂとテキストボックス１００２Ｃは、複製元ファイルのファイルパスおよび新規に作成するクローンファイル５００３のファイルパスを指定するためのテキストボックスである。
【０１６４】
チェックボックス１００２Ｄは、親ファイル５００１、またはクローンファイル５００３を移動するための操作であることを示すチェックボックスである。テキストボックス１００２Ｅは移動元の親ファイル５００１またはクローンファイル５００３を、テキストボックス１００２Ｆは移動先のファイルパスを示すテキストボックスである。
【０１６５】
管理者がＯＫボタン１００２Ｇを押した場合、管理ＧＵＩプログラムはチェックボックス１００２Ａが指定されている場合、ファイルサーバ管理プログラム３１２３に指定された複製元ファイルおよびクローンファイル５００３のファイルパスを含むクローンファイル作成コマンドを発行する。もし、チェックボックス１００２Ｄが指定されている場合、指定された移動元ファイルのファイルパスと移動先のファイルパスを含むファイル移動コマンドをファイルサーバ管理プログラム３１２３に発行する。
【０１６６】
このように、本実施形態によれば、異なるボリュームに対するクローンファイル５００３の作成および、ボリューム５１００をまたがった親ファイル５００１とクローンファイル５００３の移動が可能となる。これにより、親ファイル５００１とクローンファイル５００３を性能要件にあった記憶デバイス３２４に格納することが可能となる。
【０１６７】
さらに、親ファイル５００１の複製を作成し親ファイル５００１へのアクセスを分散することも可能となる。親ファイル５００１へのアクセス性能が問題となった際に親ファイル５００１の複製を作成することで問題を回避することができる。さらに本実施形態を使用することで、異なるボリュームの親ファイル５００１に対してもクローンファイル５００３が作成可能となるため、記憶デバイス３２４の使用容量を削減可能となる。
【０１６８】
また、本実施形態は通常のボリューム５１００の他にもスナップショットボリュームやバックアップボリュームに対しても適用可能である。例えば、仮想親ファイル５００２の参照先に過去の親ファイル５００１を指定することで、親ファイル５００１に対して誤操作を行った場合でもリストアすることが可能である。
【０１６９】
（２）第２実施形態
次に、本発明の第２の実施形態である異なるストレージ装置間でのファイルクローニング方法について、図１９から図２７を用いて説明する。
（２−１）第２実施形態の構成
＜全体構成＞
図１９は、第２実施形態に係るシステムの構成を示すブロック図である。第２実施形態では、第１の実施形態で説明したシステムに対し、１台以上の外部ファイルストレージ６００を追加で含む点が差分となる。外部ファイルストレージ６００はクライアントサーバ２００およびファイルストレージ３００が生成するファイルに対する制御を行うコンピュータで、ファイルストレージ３００と同等の構成を有する。
【０１７０】
＜ハードウェア構成＞
第２実施形態におけるファイルストレージ３００のハードウェア構成は第１実施形態と同等のため、説明は省略する。また、外部ファイルストレージ６００のハードウェア構成は、ファイルストレージ３００と同等となる。
なお、外部ファイルストレージ６００はファイルストレージ３００と異なるハードウェアを用いてもよい。また、外部ファイルストレージ６００は複数の装置から構成されてもよい。例えば外部ファイルストレージ６００としてＣｅｐｈなどの、分散ファイルシステムをもちいることも可能である。
【０１７１】
＜ソフトウェア構成＞
図２０は、本実施形態のファイルストレージ３００のソフトウェア構成例を示すブロック図である。本実施形態におけるファイルストレージ３００のソフトウェア構成は、内蔵ディスク３１５内にＡＰＩ（Ａｐｐｌｉｃａｔｉｏｎ  Ｐｒｏｇｒａｍｍｉｎｇ  Ｉｎｔｅｒｆａｃｅ）管理テーブル３１５２と、アカウント管理テーブル３１５３を持つ点が第１実施形態との差分となる。ＡＰＩ管理テーブルの詳細は図２４、アカウント管理テーブルの詳細は図２５を用いて後述する。なお、外部ファイルストレージ６００のソフトウェア構成はファイルストレージ３００と同等のため、説明は省略する。
【０１７２】
（２−２）第２実施形態の概要
本実施形態においては、ファイルクローニングモジュール３１２８は、異なる装置上にある親ファイル５００１に対して、クローンファイル５００３を作成する手段を提供する。第１の実施形態と同様にファイルクローニングモジュール３１２８は、親ファイル５００１に対して、親ファイルを一意に識別するための識別子（ｕｕｉｄ）を持つ仮想親ファイル５００２をローカルボリュームに作成し、クローンファイル５００３の仮想的な親ファイルとして使用する。
【０１７３】
また、本実施形態では、異なる装置に対する親ファイル５００１を仮想化するために、仮想親ファイル５００２作成時に装置種別に応じた静止化イメージ作成コマンドを発行する制御と、仮想親ファイル５００２のブロックレイアウトテーブル５００６に親ファイル５００１のブロックレイアウトを記憶する制御と、装置をまたがったｕｕｉｄを使用する制御を行う。これらの制御により、異なる装置上にある親ファイル５００１へのクローンファイル５００３作成が可能となる。
【０１７４】
これにより、管理者は性能要件に応じて親ファイル５００１を記憶する装置を自由に選択することが可能となる。例えば、親ファイル５００１を高性能な外部ファイルストレージ６００に格納することでより多くのクローンファイル５００３が作成可能となる。また、装置をまたがって、親ファイル５００１とクローンファイル５００３の物理格納データが共用可能となるため、記憶デバイス３２４の消費容量を削減することができる。
【０１７５】
（２−３）第２実施形態の実装例
＜ファイル管理方法＞
図２１は、第２の実施形態におけるファイルシステム管理情報３２４０の説明図である。図５で述べた第１の実施形態でのファイルシステム管理情報３２４０との差分を述べる。本実施形態においては、ｕｕｉｄテーブル５０１２にはローカルエリアネットワーク４００上でファイルを一意に識別するための識別子として、外部ファイルストレージ６００のホスト名と、ボリュームＩＤ、ファイルＩＤの組み合わせを使用する。なお、ここでいうホスト名とはローカルエリアネットワーク４００上で装置を識別するために付けられる識別子である。一例としてDNSサーバ（Domain Name System）が管理するドメイン名があげられる。ｕｕｉｄに使用する情報の詳細については、図２３を用いて後述する。
【０１７６】
また、仮想親ファイル５００２のブロックレイアウトテーブル５００６には、親ファイル５００１のファイルブロック５０２０の位置を示すため、親ファイル５００１の各ファイルデータのファイルオフセット５００６Ａと、ブロック長５００６Ｃが格納される。これらのブロックレイアウトを取得するため、ファイルシステムモジュール３１２７はクローンファイル５００３作成時に外部ファイルストレージ６００にブロックレイアウトの問い合わせ処理を行う。なお、ブロックレイアウトの問い合わせ処理に使用する方法の好例として、ＸＦＳファイルシステムのｘｆｓ＿ｂｍａｐコマンドがある。
【０１７７】
また、図５で述べた第１の実施形態と同様に外部ファイルストレージ６００の親ファイル５００１と親クローンファイル５０００を作成する。なお、本実施例では外部ファイルストレージ６００上に親ファイル５００１を作成する際に、ファイルクローニングの技術を用いているが、これは例示に過ぎない。外部ファイルストレージ６００にある親ファイル５００１は静止化ファイルであればよく、必ずしも親クローンファイル５０００を持つ必要はない。他にも、複製対象となる元ファイルのスナップショットファイルを、親ファイル５００１として使用することも可能である。他の内容については図５で述べた第１の実施形態と同等であるため、説明を省略する。
【０１７８】
図２２は第２の実施形態におけるクローンファイル５００３のデータ管理方法を示す説明図である。ファイルシステムモジュール３１２７は、クローンファイル５００３のファイルブロック５０１９と、ネットワークファイルクライアントプログラム３１２６経由で取得する親ファイル５００１のファイルデータ５０１８を組み合わせてクローンファイルデータ５０２１を構成する。
【０１７９】
この際、仮想親ファイル５００２のブロックレイアウトテーブル５００６を用いて外部ファイルストレージ６００のファイルブロック５０１９がホールであるかどうかを判定する。なお、各ファイルのファイルデータ５０１８の管理方法は図６で述べた実施形態１の管理方法と同等であるため、説明を省略する。
【０１８０】
図２３は第２の実施形態におけるｕｕｉｄテーブル５０１２の説明図である。本実施形態では、ｕｕｉｄテーブル５０１２の各行は、同一ネットワークに接続する装置間においてファイルの格納場所を一意に識別するためのファイル識別子となり、装置ＩＤ５０１２Ａ、ボリュームＩＤ５０１２Ｂ、ファイルＩＤ５０１２Ｃを含む。
【０１８１】
装置ＩＤ５０１２Ａはファイルを格納した装置のホスト名またはＩＰアドレスが設定される。なお、ファイルがｕｕｉｄテーブル５０１２を有する装置と同一の装置内にある場合、装置ＩＤ５０１２Ａの値は「ｌｏｃａｌｈｏｓｔ」となる。装置ＩＤ５０１２Ａが「ｌｏｃａｌｈｏｓｔ」でない場合、ボリュームＩＤ５０１２Ｂにはボリューム５１００の公開パスが、ファイルＩＤにはボリューム内のファイルパスが設定される。
【０１８２】
なお、ここでいう公開パスとは、ネットワークファイルサービスプログラム３１２２が、クライアントサーバ２００などのアクセス元に対して公開するボリューム５１００へのアクセスするための文字列となる。装置ＩＤ５０１２Ａが「ｌｏｃａｌｈｏｓｔ」の場合、ボリュームＩＤ５０１２ＢとファイルＩＤ５０１２Ｃには、図８で述べた第１の実施形態と同等の内容が設定される。
【０１８３】
図２４は第２の実施形態におけるＡＰＩ管理テーブル３１５２の説明図である。ＡＰＩ管理テーブルは装置種別ごとに親ファイル５００１を作成操作するためのコマンドを記憶する。これらのコマンドは外部ファイルストレージ６００のファイルに対して静止化イメージを作成し、親ファイル５００１とする際に使用する。ＡＰＩ管理テーブルの各行は、各装置の特定のオペ―レーションに対するコマンドが対応しており、装置種別３１５２Ａ、操作３１５２Ｂ、コマンド３１５２Ｃが含まれる。
【０１８４】
装置種別３１５２Ａにはコマンド３１５２Ｃの操作対象となる装置の種別を設定する。装置種別３１５２Ａには例えば、ベンダ名と装置のモデル番号の組み合わせを使用する。操作３１５２Ｂはコマンド３１５２Ｃが行う操作となり、親ファイル５００１となる静止化ファイルを作成する「ｃｒｅａｔｅ」か、静止化ファイルを削除する「ｒｅｍｏｖｅ」のどちらかを設定する。コマンド３１５２Ｃは、各装置、操作を行うためのコマンドを設定する。なお、ＡＰＩ管理テーブル３１５２の設定内容は、ファイルストレージ３００の開発ベンダが出荷時に設定してもいいし、管理者が管理サーバ１００を介して設定してもよい。
【０１８５】
図２５は第２の実施形態におけるアカウント管理テーブル３１５３の説明図である。アカウント管理テーブル３１５３は外部ファイルストレージ６００ごとに、ファイルアクセスを行うためのユーザアカウント情報と、管理操作を行うための管理アカウント情報が設定される。アカウント管理テーブル３１５３の各行は、外部ファイルストレージごとのアカウント情報に対応し、デバイスＩＤ３１５３Ａ、ユーザＩＤ３１５３Ｂ、ユーザパスワード３１５３Ｃ、管理者ＩＤ３１５３Ｄ、管理者パスワード３１５３Ｅを含む。
【０１８６】
デバイスＩＤ３１５３Ａはネットワーク上で装置を一意に識別するための識別子で、外部ファイルストレージ６００のホスト名またはＩＰアドレスを設定する。ユーザＩＤ３１５３Ｂおよびユーザパスワード３１５３Ｃは外部ファイルストレージ６００のユーザアカウント名とログインパスワードを設定する。管理者ＩＤ３１５３Ｄと管理者パスワード３１５３Ｅはそれぞれ、管理者のアカウント名とログインパスワードを設定する。
【０１８７】
＜ファイル操作要求処理方式＞
本実施形態においても、ファイルシステムモジュール３１２７、ファイルクローニングモジュール３１２８、ファイル移動プログラム３１２４が、クローンファイル５００３と親ファイル５００１に対するファイル操作要求と移動要求を処理する。以降では、各処理における実施形態１との差分について説明する。
【０１８８】
図１０を用い、クローンファイル５００３の作成処理における、第１実施形態との差分について説明する。第１実施形態のクローンファイル作成処理に含まれるＳ１００からＳ１０７のうち、ステップＳ１０３の親ファイル作成とステップＳ１０６の仮想親ファイル作成について本実施形態では異なる処理を行う。それぞれの処理内容は、以下の通りとなる。
【０１８９】
（ステップＳ１０３）親ファイル作成
ファイルクローニングモジュール３１２８は複製元ファイルが外部ファイルストレージ６００にある場合、ＡＰＩ管理テーブル３１５２に登録されている親ファイル５００１作成コマンドを用いて、複製元ファイルの静止化イメージを作成し、親ファイル５００１とする。
【０１９０】
最初に、ファイルクローニングモジュール３１２８は、外部ファイルストレージ６００のファイルサーバ管理プログラム３１２３に問い合わせて装置種別３１５２Ａを取得する。ファイルクローニングモジュール３１２８は、装置種別３１５２ＡがＡＰＩ管理テーブル３１５２に登録されている場合、外部ファイルストレージ６００に対し親ファイル作成コマンドを発行し、処理対象ファイルの静止化ファイルを作成する。ここで作成した静止化ファイルは、親ファイル５００１として使用する。
【０１９１】
（ステップＳ１０６）仮想親ファイル作成
ファイルクローニングモジュール３１２８は、Ｓ１０３で作成した親ファイル５００１に対して仮想親ファイル５００２を作成する。ファイルクローニングモジュール３１２８は、親ファイル５００１のボリュームパスと、ボリューム５１００内のファイルパスからｕｕｉｄを作成する。その後、ファイルクローニングモジュール３１２８はクローンファイル５００３を作成するボリューム５１００内に空ファイルを作成し、ファイルフラグの仮想親ファイルビットを設定して仮想親ファイル５００２とする。
【０１９２】
次に、ファイルクローニングモジュール３１２８は仮想親ファイル５００２のｕｕｉｄテーブル５０１２に親ファイル５００１のｕｕｉｄを設定する。最後にファイルクローニングモジュール３１２８は仮想親ファイル５００２を、親ファイル５００１のｕｕｉｄにリネームし、仮想親ファイル専用のディレクトリ（例えば/.virtparentなど）に移動する。
【０１９３】
以上の処理により、ファイルクローニングモジュール３１２８が、外部ファイルストレージ６００のファイルからクローンファイル５００３を作成することが可能となる。また、親ファイル５００１のｕｕｉｄをファイル名として持つ仮想親ファイル５００２が仮想親ファイル専用ディレクトリ内にあるかどうかを調べることで、ボリューム内に仮想親ファイル５００２があるかどうかの判定が可能となる。
【０１９４】
次に、図１１を用いて、第１の実施形態に対するクローンファイルリード処理の差分について説明する。第１実施形態のクローンファイルリード処理に含まれるステップＳ２００からＳ２０８のうち、ステップＳ２０１のブロックレイアウトテーブル取得、ステップＳ２０４のホール判断、ステップＳ２０５のファイルデータ読み込みについて本実施形態では異なる処理を行う。それぞれの処理内容は以下の通りとなる。
【０１９５】
（ステップＳ２０１）ブロックレイアウトテーブル取得
ファイルシステムモジュール３１２７は、クローンファイル５００３のｕｕｉｄテーブル５０１２が外部ファイルストレージ６００に親ファイル５００１を持つ仮想親ファイル５００２を示している場合、仮想親ファイル５００２のブロックレイアウトテーブル５００６を親のブロックレイアウトテーブルとして取得する。それ以外の場合は、第１実施形態と同等の処理を行う。
【０１９６】
（ステップＳ２０４）ホール判断
ファイルシステムモジュール３１２７は親ファイル５００１が外部ファイルストレージ６００にある場合、仮想親ファイル５００２のブロックレイアウトテーブル５００６を調べ、処理中のファイルブロック５０１９が親ファイル５００１のホールかどうかを調べる。もし、ブロックレイアウトテーブル５００６中に処理中のファイルブロック５０１９を含むファイルデータ５０１８が含まれない場合、親ファイル５００１のファイルブロック５０１９がホールであると判断しＳ２０７の処理を行う。それ以外の場合は、第１実施形態と同等のため、説明を省略する。
【０１９７】
（ステップＳ２０５）ファイルデータ読み込み
ファイルシステムモジュール３１２７は親ファイル５００１が外部ファイルストレージ６００にある場合、ネットワークファイルクライアントプログラム３１２６を用いて、処理中のファイルブロック５０１９に対応する親ファイル５００１のファイルデータ５０１８を、バッファ領域に読み込む。その際、ファイルリード対象とする外部ファイルストレージ６００、およびファイルパスはＳ２０３で得た親ファイル５００１のｕｕｉｄの値から取得する。また、ネットワークファイルクライアントプログラム３１２６は外部ファイルストレージ６００にアクセスする際に、アカウント管理テーブル３１５３に示されたユーザＩＤとユーザパスワードをユーザアカウントとして使用する。
【０１９８】
以上の処理により、ファイルシステムモジュール３１２７が外部ファイルストレージ６００の親ファイル５００１から、クローンファイルデータ５０２１をリードすることが可能となる。クローンファイル５００３のライト処理、スプリット処理は、第１実施形態に対して、ファイルリード処理と同等の変更を加えたものとなるため、説明を省略する。クローンファイル５００３の削除処理は、図１３で述べたボリューム内部のクローンファイル５００３削除処理に対して、Ｓ４０６とＳ４０７を含まない点、Ｓ４０８の親ファイル５００１の削除にてＡＰＩ管理テーブル３１５２に登録された削除コマンドを使用する点、以外は同等のため説明を省略する。なお、第２の実施形態では仮想親ファイル５００２一つにつき、親ファイル５００１を一つ作成しているため、参照カウンタ５０１０の操作は行わず、仮想親ファイル５００２削除時に、親ファイル５００１を削除している。
【０１９９】
仮想親ファイル５００２を持たない親ファイル５００１の外部ファイルストレージ６００への移動処理は、図１５で説明したステップＳ６０３で行っていた親ファイル５００１のｕｕｉｄテーブル５０１２の操作と、ステップＳ６０４で行っていた移動先の親ファイル５００１に対する参照カウンタ５０１０操作を行わない点を除き第１の実施形態と同等のため、説明を省略する。
【０２００】
また、仮想親ファイル５００２を有する親ファイル５００１の外部ファイルストレージ６００への移動処理は、クライアントサーバ２００、または外部ファイルストレージ６００が親ファイル５００１の移動処理を行う際に、ファイルストレージ３００に親ファイルポインタ変更コマンドを送付することで実現する。
【０２０１】
図２６は親ファイルポインタ変更コマンド受信時のファイルクローニングモジュール３１２８の制御を示すフローチャートである。ファイルクローニングモジュール３１２８は、外部ファイルストレージ６００から、親ファイルポインタ変更コマンドを受信した際には、以下に示す親ファイル移動処理を行う。なお、外部ファイルストレージ６００は自身に含まれるスナップショットファイルの移動時には外部ファイルストレージ６００を使用する全ての装置に対して、親ファイルポインタ変更コマンドを送信する。
【０２０２】
ファイルクローニングモジュール３１２８は、親ファイルポインタ変更コマンドを受信した場合、親ファイルポインタ変更処理を開始する（Ｓ９００）。なお、親ファイルポインタ変更コマンドには、移動前の親ファイル５００１のｕｕｉｄおよび移動先の親ファイル５００１のｕｕｉｄが含まれる。
【０２０３】
次に、ファイルクローニングモジュール３１２８は、移動元親ファイル５００１の仮想親ファイル５００２がファイルストレージ３００内にあるかどうかを調べる（Ｓ９０１）。これは、仮想親ファイル専用のディレクトリ内に移動元の親ファイル５００１のｕｕｉｄをファイル名としてもつ仮想親ファイル５００２があるかどうかで判定する。もし、仮想親ファイル５００２がない場合、親ファイルポインタ変更処理を終了する。
【０２０４】
次に、ファイルクローニングモジュール３１２８は、移動元の親ファイル５００１のｕｕｉｄから移動先の親ファイル５００１と移動元の親ファイル５００１の中身が一致することを、双方のファイルデータを比較し確認する（Ｓ９０２）。これは親ファイル５００１の参照先を切り替えた際に、異なるデータの親ファイル５００１を参照し、クローンファイル５００３が異なったデータとなることを防ぐために行う。もし、移動元の親ファイル５００１と移動先のファイルのデータが一致しない場合、親ファイルポインタ変更処理を終了する。
【０２０５】
次に、ファイルクローニングモジュール３１２８は、ステップＳ９０１で調べたファイルパスを用いて仮想親ファイル５００２を取得する（Ｓ９０３）。
【０２０６】
最後に、ファイルクローニングモジュール３１２８は仮想親ファイル５００２のｕｕｉｄテーブルを書き換え、移動元の親ファイル５００１のｕｕｉｄを、移動先の親ファイルのｕｕｉｄに変更する。その後ファイルクローニングモジュール３１２８は仮想親ファイル５００２のファイル名を移動ファイルのｕｕｉｄに変更する処理を行い、親ファイルポインタ変更処理を終了する（Ｓ９０４）。
【０２０７】
次に、図１７を用いて第１実施形態に対するクローンファイル５００３の移動処理の差分を説明する。クローンファイル５００３を外部ファイルストレージに移動する場合、ファイル移動プログラム３１２４はステップＳ８０１のクローンファイル作成コマンドを移動先の外部ファイルストレージ６００に対して発行する。
【０２０８】
また、ファイル移動プログラム３１２４は、ステップＳ８０４における移動先のクローンファイル５００３に対するライト処理を、ネットワークファイルクライアントプログラム３１２６を用いて行う。以上の処理を変更することで、ファイル移動プログラム３１２４は、外部ファイルストレージ６００へのクローンファイル５００３の移動を実現する。
【０２０９】
＜管理画面＞
図２７は管理ＧＵＩプログラム１００１が提供する、外部ファイルストレージ追加画面１００３の説明図である。管理者は、外部ファイルストレージ追加画面１００３を用いて、アカウント管理テーブル３１５３の設定内容を編集する。
【０２１０】
テキストボックス１００３Ａは、編集対象となる外部ファイルストレージ６００のホスト名を入力するテキストボックスであり装置種別３１５２Ａに対応する。テキストボックス１００３Ｂとテキストボックス１００３Ｃは追加する外部ファイルストレージ６００のユーザアカウントとパスワードを入力するテキストボックスであり、ユーザＩＤ３１５３Ｂとユーザパスワード３１５３Ｃに対応する。
【０２１１】
テキストボックス１００３Ｄとテキストボックス１００３Ｅは追加する外部ファイルストレージ６００の管理者アカウントとパスワードを有力するテキストボックスであり、管理者ＩＤ３１５３Ｄ、および３１５３Ｅに対応する。
【０２１２】
管理者がＯＫボタン１００３Ｆを押した場合、管理ＧＵＩプログラム１００１は設定内容をファイルサーバ管理プログラム３１２３への通知し、アカウント管理テーブル３１５３に反映する。Ｃａｎｃｅｌボタン１００３Ｇを押した場合設定内容をキャンセルする。
【０２１３】
以上説明したように、本実施形態によれば、異なる装置に対するクローンファイル５００３の作成および、装置をまたがった親ファイル５００１とクローンファイル５００３の移動が可能となる。これにより、親ファイル５００１とクローンファイル５００３を性能要件にあった装置に格納可能となる。また、装置間で親ファイル５００１とクローンファイル５００３の物理格納データの共有が可能となるため、記憶デバイスの使用容量を削減することができる。
【０２１４】
（３）第３実施形態
次に、本発明の第３の実施形態である重複排除機能を有するファイルクローニング方法にについて、図２８から図３２を用いて説明する。
（３−１）第３実施形態の構成
＜全体構成＞
第３実施形態の全体構成は第１実施形態と同等のため、説明を省略する。
＜ハードウェア構成＞
第３実施形態のハードウェア構成は第１実施形態と同等のため、説明を省略する。
＜ソフトウェア構成＞
図２８は、本実施形態のファイルストレージ３００のソフトウェア構成例を示すブロック図である。第１実施形態との差分は太線で示したモジュールとなり、その他の部分については第１実施形態と同等となる。以下第１実施形態との差分について説明する。
【０２１５】
ファイルサーバ３１０は、重複排除プログラム３１２０を実行する。重複排除プログラム３１２０２はファイルデータが一致する重複ファイルを見つけ、重複ファイル間で物理格納データを共有させ、重複したデータの物理格納領域を解放する処理を行う。
【０２１６】
重複ファイル間の物理各データの共有は、重複ファイルの一つから親ファイル５００１と親クローンファイル５０００を作成し、その他の重複ファイルを親ファイル５００１のクローンファイル５００３とすることで実現する。重複ファイルの重複排除処理を行うことで、ファイル間で物理格納データが共有されるため、記憶デバイス３２４の使用容量を削減できる。
【０２１７】
記憶デバイス３２４は、ボリューム５１００ごとにファイルハッシュテーブル３２４１を有する。ファイルハッシュテーブル３２４１には、ボリューム５１００内の親ファイル５００１のファイルパスとハッシュ値の組が保存されており、重複排除プログラム３１２０が重複するファイルを検出するために使用する。
【０２１８】
（３−２）第３実施形態の概要
本実施形態においては、ボリューム５１００をまたがって重複したファイルの重複排除処理を行う。従来、ボリューム５１００内で行っていた重複排除処理に対して、実施形態１で述べたボリューム５１００をまたがるファイルクローニング技術と、ボリューム間の重複ファイル検出処理を追加することで、重複排除対象を複数のボリュームに拡大する。従来のボリューム５１００内部の重複排除に比べ、重複排除できるファイル数が増えるため、容量削減効果が高くなる。
【０２１９】
（３−３）第３実施形態の実装例
本実施形態のファイル管理方式とファイル要求処理方式は実施形態１で述べたものと同等である。そのため、新たに追加する重複排除処理についてのみ説明する。
【０２２０】
＜重複排除処理＞
図２９はファイルハッシュテーブル３２４１の内容を示す説明図である。ファイルハッシュテーブル３２４１は、ボリューム５１００内の親ファイル５００１ごとに、ファイルパス３２４１Ａとハッシュ値３２４１Ｂを格納する。なお、ここでいうハッシュ値とは、親ファイル５００１のデータに基づいて生成される疑似乱数の値のことを言う。
【０２２１】
あるファイルと別のファイルのファイルデータが同一の場合、ハッシュ値も同一となる。そのため、重複ファイル検索時に、ハッシュ値の一致するファイルに対してのみ比較処理を行うことで、高速に重複ファイルを検出することができる。
【０２２２】
図３０はボリューム内部の重複排除を行う際の重複排除プログラム３１２０の制御を示したフローチャートである。
【０２２３】
重複排除プログラム３１２０はボリューム５１００内の、事前に決められたポリシに合致する通常ファイルに対してＳ１００１からＳ１００６に示す処理を行う（Ｓ１０００）。なお、ポリシの好例として、「最終更新時刻が一定期間経過していること」がある。次に、重複排除プログラム３１２０は、処理中のファイルのハッシュ値を計算する（Ｓ１００１）。
【０２２４】
重複排除プログラム３１２０は、Ｓ１００１で計算したハッシュ値と一致するハッシュ値がファイルハッシュテーブル３２４１に登録されていないかを調べる。もし、同一のハッシュ値を持つ親ファイル５００１があった場合、重複排除プログラム３１２０は、ファイルデータの比較（サイズ比較やバイナリ比較など）を行い、ファイルデータが重複するかどうかを判定する（Ｓ１００２）。重複排除プログラム３１２０は、ファイルデータが重複する親ファイル５００１を見つけた場合（Ｓ１００２のＹｅｓ）、ステップＳ１００３の処理を行い、ファイルデータが重複する親ファイル５００１を見つけない場合（Ｓ１００２のＮｏ）、ステップＳ１００４以降の処理を行う。
【０２２５】
ファイルデータが重複する親ファイル５００１を見つけた場合（Ｓ１００２のＹｅｓ）、重複排除プログラム３１２０は、Ｓ１００２で見つけた親ファイル５００１に対して、クローンファイル５００３を作成し、処理中ファイルを置き換える。その後、処理中ファイルを削除し、処理中ファイルが使用していた容量を解放する（Ｓ１００３）。その後、重複排除プログラム３１２０はＳ１００６の処理を行う。
【０２２６】
ファイルデータが重複する親ファイル５００１を見つけない場合（Ｓ１００２のＮｏ）、重複排除プログラム３１２０は、処理中ファイルの静止化イメージを親ファイル５００１として作成し、親ファイル専用ディレクトリ（「．ｍａｓｔｅｒ」ディレクトリ）に移動する。その後、移動した親ファイル５００１のクローンファイル５００３を作成し、処理中のファイルと置き換える。その後、重複排除プログラム３１２０は、処理中のファイルを削除する（Ｓ１００４）。
【０２２７】
次に、重複排除プログラム３１２０はステップＳ１００１で計算したハッシュ値と、Ｓ１００４で作成した親ファイル５００１のファイルパスをファイルハッシュテーブル３２４１に登録する（Ｓ１００５）。
【０２２８】
最後に、重複排除プログラム３１２０は、残りの処理対象ファイルが残っている場合、Ｓ１００１に戻り次のファイルの処理を、そうでない場合は重複排除処理を終了する（Ｓ１００６）。
【０２２９】
図３１はボリューム間の重複排除処理における、重複排除プログラム３１２０の制御を示したフローチャートである。
【０２３０】
重複排除プログラム３１２０は二つのボリュームのファイルハッシュテーブル３２４１を比較し、重複するハッシュ値を有する親ファイル５００１がないかを調べる。もし、同一のハッシュ値を持つ親ファイル５００１があった場合、親ファイル５００１間でファイルデータの比較を行い、ファイルデータが重複するかどうかを判定する（Ｓ１１００）。
【０２３１】
次に、重複排除プログラム３１２０は、Ｓ１１００で見つけたボリューム間で重複する親ファイル５００１に対し、Ｓ１１０２からＳ１１０６で示す処理を行う（Ｓ１１０１）。
【０２３２】
次に、重複排除プログラム３１２０は、Ｓ１１００で見つけた重複する親ファイル５００１のうちどちらか一方の親ファイルをターゲット親ファイルとして選択し、ターゲット親ファイルのｕｕｉｄテーブル５０１２にもう片方の親ファイルのｕｕｉｄを登録する（Ｓ１１０２）。
【０２３３】
次に、重複排除プログラム３１２０はターゲット親ファイルのファイルフラグ５０１３の仮想親ファイルビットを設定し、仮想親ファイル５００２とする。その際、もう片方の親ファイルの参照カウンタ５０１０を１加算する（Ｓ１１０３）。
【０２３４】
次に、重複排除プログラム３１２０はターゲット親ファイルに対して、ファイルブロック５０１９のディスクブロック５０２２を解放する（Ｓ１１０４）。
【０２３５】
最後に、重複排除プログラム３１２０は、残りの処理対象ファイルが残っている場合、Ｓ１１０１に戻り次のファイルの処理を、そうでない場合は重複排除処理を終了する（Ｓ１００５）。
【０２３６】
このように、本実施形態によれば、ボリュームをまたがって重複ファイルを排除することが可能となる。これにより、ボリューム間で重複ファイルの物理格納データの共有が可能となるため、ボリューム内部のみ重複排除処理に比べ記憶デバイス３２４の使用容量削減効果を高めることができる。
【０２３７】
なお、本実施形態と第２実施形態を組み合わせることで、装置をまたがった重複排除処理も可能となる。その場合、記憶デバイス３２４の使用容量削減効果を更に高めることができる。
【０２３８】
以上説明したように、管理者は親ファイルとクローンファイルを性能要件にあった記憶デバイスに格納することが可能となる。また、ボリューム、装置間をまたがって、複製元ファイルとクローンファイルの物理格納データの共有するため、従来のクローン技術に比べ記憶デバイスの使用容量をより多く削減できる。
【符号の説明】
【０２３９】
１００  管理サーバ
２００  クライアントサーバ
３００  ファイルストレージ
３１０  ファイルサーバ
３１１  ＣＰＵ
３１２  メインメモリ
３１３  ネットワークＩＦ
３１４  ストレージＩＦ
３１５  内蔵ディスク
３２０  ディスクサブシステム
３２１  ＣＰＵ
３２２  メインメモリ 
３２３  ディスクI/F
３２４  記憶デバイス
３２５  記憶デバイス（ＳＳＤ）
３２６  記憶デバイス（ＳＡＳ）
４００  ローカルエリアネットワーク（ＬＡＮ）
６００  外部ファイルストレージ
１００１  管理ＧＵＩプログラム
１００２  クローン管理画面
１００２Ａ、１００２Ｄ  チェックボックス
１００２Ｂ、１００２Ｃ、１００２Ｅ、１００２Ｆ  テキストボックス
１００２Ｇ  ＯＫボタン
１００２Ｈ  Ｃａｎｃｅｌボタン
１００３  外部ストレージ追加画面
１００３Ａ、１００３Ｂ、１００３Ｃ、１００３Ｄ、１００３Ｅ  テキストボックス
１００３Ｆ  ＯＫボタン
１００３Ｇ  Ｃａｎｃｅｌボタン
３１２０  重複排除プログラム
３１２１  オペレーティングシステムプログラム
３１２２  ネットワークファイルサービスプログラム
３１２３  ファイルサーバ管理プログラム
３１２４  ファイル移動プログラム
３１２５  ボリューム管理モジュール
３１２６  ネットワークファイルクライアントプログラム
３１２７  ファイルシステムモジュール
３１２８  ファイルクローニングモジュール
３１２９  スナップショットモジュール
３１５１  ボリューム管理テーブル
３１５１Ａ  ボリュームＩＤ
３１５１Ｂ  マウントポイント
３１５１Ｃ  ＬＵ番号
３１５１Ｄ  ファイルシステム種別
３１５２  ＡＰＩ管理テーブル
３１５２Ａ  装置種別
３１５２Ｂ  操作
３１５２Ｃ  コマンド
３１５３  アカウント管理テーブル
３１５３Ａ  デバイスＩＤ
３１５３Ｂ  ユーザＩＤ
３１５３Ｃ  ユーザパスワード
３１５３Ｄ  管理者ＩＤ
３１５３Ｅ  管理者パスワード
３２１３  記憶デバイス（ＳＳＤ）
３２２１  ディスク制御プログラム
３２４０  ファイルシステム管理情報
３２４１  ファイルハッシュテーブル
３２４１Ａ  ファイルパス
３２４１Ｂ  ハッシュ値
５０００  親クローンファイル
５００１  親ファイル
５００２  仮想親ファイル
５００３  クローンファイル
５００５  ｉｎｏｄｅ
５００６  ブロックレイアウトテーブル
５００６Ａ  ファイルオフセット
５００６Ｂ  ディスク開始位置
５００６Ｃ  ブロック長
５００７  ｉｎｏｄｅ番号
５００８  親ｉｎｏｄｅ番号
５００９  ファイル属性
５０１０  参照カウンタ
５０１２  ｕｕｉｄテーブル
５０１２Ａ  装置ＩＤ
５０１２Ｂ  ボリュームＩＤ
５０１２Ｃ  ファイルＩＤ
５０１３  ファイルフラグ
５０１４  親クローンｉｎｏｄｅ番号
５０１５  親クローンｕｕｉｄ
５０１８  ファイルデータ
５０１９、５０２０  ファイルブロック
５０２１  クローンファイルデータ
５０２２  ディスクブロック
５１００  ボリューム
６１００  ＬＵ
【図１】
0005876592.tif 000002
【図２】
0005876592.tif 000003
【図３Ａ】
0005876592.tif 000004
【図３Ｂ】
0005876592.tif 000005
【図４】
0005876592.tif 000006
【図５】
0005876592.tif 000007
【図６】
0005876592.tif 000008
【図７】
0005876592.tif 000009
【図８】
0005876592.tif 000010
【図９】
0005876592.tif 000011
【図１０】
0005876592.tif 000012
【図１１】
0005876592.tif 000013
【図１２】
0005876592.tif 000014
【図１３】
0005876592.tif 000015
【図１４】
0005876592.tif 000016
【図１５】
0005876592.tif 000017
【図１６】
0005876592.tif 000018
【図１７】
0005876592.tif 000019
【図１８】
0005876592.tif 000020
【図１９】
0005876592.tif 000021
【図２０】
0005876592.tif 000022
【図２１】
0005876592.tif 000023
【図２２】
0005876592.tif 000024
【図２３】
0005876592.tif 000025
【図２４】
0005876592.tif 000026
【図２５】
0005876592.tif 000027
【図２６】
0005876592.tif 000028
【図２７】
0005876592.tif 000029
【図２８】
0005876592.tif 000030
【図２９】
0005876592.tif 000031
【図３０】
0005876592.tif 000032
【図３１】
0005876592.tif 000033