(57)【特許請求の範囲】
【請求項１】
クライアント端末とストレージシステムとに接続されるファイルサーバであって、
プロセッサと、
ファイルを管理するファイルシステムプログラムを格納するメモリとを有し、
前記ファイルサーバは、
前記ファイルのクローンを作成する要求を受けた場合、前記ファイルのメタデータに対し、前記ファイルが前記クローンのソースであることを示す情報を設定することで前記ファイルへの更新を禁止し、
第１の差分ファイルを作成し、
前記クライアント端末から前記クローンへのアクセス要求を受けた場合、前記第１の差分ファイルへアクセスし、前記アクセスが
（１）更新要求の場合は、
（１ａ）該更新要求が前記第１の差分ファイルへの最初の更新要求であった時には第１のデータ管理テーブルを作成し、
（１ｂ）前記第１のデータ管理テーブルを用いて前記更新要求で指定された前記第１の差分ファイルのファイルブロックに、前記ストレージシステムのディスクブロックが割り当てられているか判定し、前記ディスクブロックが割り当てられていない場合は、そのファイルブロックに前記ストレージシステムのディスクブロックを割り当てて、そこに更新データを書き込み、
（１ｃ）そのファイルブロックに前記ストレージシステムのディスクブロックが割り当てられている場合は、そこに更新データを書き込み、
（１ｄ）前記更新データを含むファイルデータのオフセットと、前記更新要求で指定された前記第１の差分ファイルのファイルブロックに割り当てた前記ストレージシステムのディスクブロックの開始ブロック位置と、前記ファイルデータのブロック長とを、前記第１のデータ管理テーブルに記録し、
（２）読み出し要求の場合は
（２ａ）前記読み出し要求で指定されたファイル位置のデータが前記第１の差分ファイルのファイルブロックにあればそのデータを読み出し、
（２ｂ）前記第１の差分ファイルに前記読み出し要求で指定されたファイル位置のデータが無ければ、前記ファイルの対応するファイルブロックにデータがあればそのデータを読み出し、
前記クライアント端末から前記ファイルへの更新要求を受けた場合、前記メタデータの設定内容に基づき、前記クライアント端末から受け付けた更新要求の対象が前記クローンのソースであると判定したことに応じて、第２の差分ファイルを作成し、
前記更新要求で指定された前記第２の差分ファイルのファイルブロックに前記ストレージシステムのディスクブロックを割り当て、そこに更新データを書き込むように構成されていることを特徴とするファイルサーバ。
【請求項２】
請求項１記載のファイルサーバであって、前記ファイルサーバは、
前記ファイルのコピーファイル作成要求があった場合、前記ファイルへの更新要求の有無にかかわらず、前記第１の差分ファイルとともに、第２の差分ファイルを作成し、前記ファイルへのアクセス要求を受け付けた場合、前記第２の差分ファイルにアクセスし、
前記アクセスが
（１）更新要求の場合、
（１ａ）前記更新要求で指定された前記第２の差分ファイルのファイルブロックに前記ストレージシステムのディスクブロックが割り当てられていない場合は、前記ストレージシステムのディスクブロックを割り当てて、そこに更新データを書き込み、
（１ｂ）そのファイルブロックにディスクブロックが割り当てられている場合は、そこに更新データを書き込み、
（２）読み出し要求の場合、
（２ａ）前記読み出し要求で指定されたファイル位置のデータが前記第２の差分ファイルのファイルブロックにあればそのデータを読み出し、
（２ｂ）前記第２の差分ファイルに前記読み出し要求で指定されたファイル位置のデータが無ければ、前記ファイルの対応するファイルブロックにデータがあればそのデータを読み出すように構成されていることを特徴とするファイルサーバ。
【請求項３】
請求項１記載のファイルサーバであって、前記ファイルサーバは、
前記第２の差分ファイルを作成した後であって、前記第２の差分ファイルに最初の更新要求を受けた場合、第２のデータ管理テーブルを作成し、
その更新データを含むファイルデータのオフセットと、その更新要求で指定された前記第２の差分ファイルのファイルブロックに割り当てた前記ストレージシステムのディスクブロックの開始ブロック位置と、そのファイルデータブロック長とを前記第２のデータ管理テーブルに記録するよう構成されていることを特徴とするファイルサーバ。
【請求項４】
請求項２記載のファイルサーバであって、前記ファイルサーバは、
前記第２の差分ファイルを作成した後であって、前記第２の差分ファイルに最初の更新要求を受けた場合、第２のデータ管理テーブルを作成し、
その更新データを含むファイルデータのオフセットと、その更新要求で指定された前記第２の差分ファイルのファイルブロックに割り当てた前記ストレージシステムのディスクブロックの開始ブロック位置と、そのファイルデータブロック長とを前記第２のデータ管理テーブルに記録するよう構成されていることを特徴とするファイルサーバ。
【請求項５】
請求項１記載のファイルサーバであって、前記第１の差分ファイルのメタデータは、前記第１の差分ファイルがクローンであることを示す情報を含むことを特徴とするファイルサーバ。
【請求項６】
請求項２記載のファイルサーバであって、前記第１の差分ファイルのメタデータは、前記第１の差分ファイルがクローンであることを示す情報を含むことを特徴とするファイルサーバ。
【請求項７】
請求項１記載のファイルサーバであって、前記ファイルサーバは、
前記ファイルのクローンを作成する要求を受けるごとに、前記第１の差分ファイルを作成するよう構成され、
前記ファイルのメタデータは、前記第１の差分ファイルのファイル数を含むことを特徴とするファイルサーバ。
【請求項８】
請求項１記載のファイルサーバであって、前記ファイルサーバは、
（１）前記ファイルの削除要求を受けた場合は、前記第２の差分ファイルを削除し、前記ファイルを前記クライアント端末から見えないように設定し、
（２）前記第１の差分ファイルの削除要求を受けた場合は、前記第１の差分ファイルを削除するよう構成されていることを特徴とするファイルサーバ。
【請求項９】
請求項２記載のファイルサーバであって、前記ファイルサーバは、
（１）前記ファイルの削除要求を受けた場合は、前記第２の差分ファイルを削除し、前記ファイルを前記クライアント端末から見えないように設定し、
（２）前記第１の差分ファイルの削除要求を受けた場合は、前記第１の差分ファイルを削除するよう構成されていることを特徴とするファイルサーバ。
【請求項１０】
請求項１記載のファイルサーバであって、前記ファイルサーバは、
前記第１の差分ファイルには、前記クローンが切り詰められた時の最小サイズを、前記ファイルのメタデータに記録しており、
前記ファイルサーバは、前記クライアント端末から受け付けた前記クローンへの読み出し要求で指定されたファイル読み込み位置にデータが無く、かつ前記ファイル読み込み位置が前記第１の差分ファイルのメタデータに記録された前記最小サイズの情報より後ろの場合、
前記クライアント端末に“０”を返却する、
ことを特徴とするファイルサーバ。
【請求項１１】
コンピュータシステムであって、
ファイルサーバと、
ファイルサーバに接続される管理端末と、
ファイルサーバに接続されるストレージシステムとを有し、
前記ファイルサーバは、
プロセッサと、
ファイルを管理するファイルシステムプログラムを格納するメモリとを有し、
前記ファイルサーバは、
前記ファイルのクローンを作成する要求を受けた場合、前記ファイルのメタデータに対し、前記ファイルが前記クローンのソースであることを示す情報を設定することで前記ファイルへの更新を禁止し、
第１の差分ファイルを作成し、
前記クライアント端末から前記クローンへのアクセス要求を受けた場合、前記第１の差分ファイルへアクセスし、前記アクセスが
（１）更新要求の場合は、
（１ａ）該更新要求が前記第１の差分ファイルへの最初の更新要求であった時には第１のデータ管理テーブルを作成し、
（１ｂ）前記第１のデータ管理テーブルを用いて前記更新要求で指定された前記第１の差分ファイルのファイルブロックに、前記ストレージシステムのディスクブロックが割り当てられているか判定し、前記ディスクブロックが割り当てられていない場合は、そのファイルブロックに前記ストレージシステムのディスクブロックを割り当てて、そこに更新データを書き込み、
（１ｃ）そのファイルブロックに前記ストレージシステムのディスクブロックが割り当てられている場合は、そこに更新データを書き込み、
（１ｄ）前記更新データを含むファイルデータのオフセットと、前記更新要求で指定された前記第１の差分ファイルのファイルブロックに割り当てた前記ストレージシステムのディスクブロックの開始ブロック位置と、前記ファイルデータのブロック長とを、前記第１のデータ管理テーブルに記録し、
（２）読み出し要求の場合は
（２ａ）前記読み出し要求で指定されたファイル位置のデータが前記第１の差分ファイルのファイルブロックにあればそのデータを読み出し、
（２ｂ）前記第１の差分ファイルに前記読み出し要求で指定されたファイル位置のデータが無ければ、前記ファイルの対応するファイルブロックにデータがあればそのデータを読み出し、
前記クライアント端末から前記ファイルへの更新要求を受けた場合、前記メタデータの設定内容に基づき、前記クライアント端末から受け付けた更新要求の対象が前記クローンのソースであると判定したことに応じて、第２の差分ファイルを作成し、
前記更新要求で指定された前記第２の差分ファイルのファイルブロックに前記ストレージシステムのディスクブロックを割り当て、そこに更新データを書き込むように構成されていることを特徴とするコンピュータシステム。
【請求項１２】
請求項１１記載のコンピュータシステムであって、前記ファイルサーバは、
前記ファイルのコピーファイル作成要求があった場合、前記ファイルへの更新要求の有無にかかわらず、前記第１の差分ファイルとともに、第２の差分ファイルを作成し、前記ファイルへのアクセス要求を受け付けた場合、前記第２の差分ファイルにアクセスし、
前記アクセスが
（１）更新要求の場合、
（１ａ）前記更新要求で指定された前記第２の差分ファイルのファイルブロックに前記ストレージシステムのディスクブロックが割り当てられていない場合は、前記ストレージシステムのディスクブロックを割り当てて、そこに更新データを書き込み、
（１ｂ）そのファイルブロックにディスクブロックが割り当てられている場合は、そこに更新データを書き込み、
（２）読み出し要求の場合、
（２ａ）前記読み出し要求で指定されたファイル位置のデータが前記第２の差分ファイルのファイルブロックにあればそのデータを読み出し、
（２ｂ）前記第２の差分ファイルに前記読み出し要求で指定されたファイル位置のデータが無ければ、前記ファイルの対応するファイルブロックにデータがあればそのデータを読み出すように構成されていることを特徴とするコンピュータシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ファイルクローニング機能を持つファイルシステムにおいて、クローンファイル作成性能の向上方法に関する。
【背景技術】
【０００２】
近年、ＶＤＩ（Virtual  Desktop  Infrastructure）に代表される仮想化技術の進展により、ＶＭ（Virtual  Machine）の利用が拡大している。ＶＭを素早く利用可能にするため、ＯＳ（Operating  System）環境をインストールした仮想ディスクファイルをコピーすることが一般的になっている。
【０００３】
しかし、仮想ディスクファイルは数ＧＢ（Giga  Bytes）の大きさになることがあるため、物理的にコピーすると数十秒から数十分ほど時間がかかる。そこで、仮想ディスクファイルを仮想的にコピーすることでコピーにかかる時間を削減可能なファイルクローン機能が注目されている（特許文献１）。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】米国特許第７４０９５１１号明細書
【発明の概要】
【発明が解決しようとする課題】
【０００５】
特許文献１の技術は親仮想ボリュームの書き込み可能なコピーであるクローンを作成する技術を開示している。親仮想ボリュームのスナップショットと、上記クローンとして機能する仮想ボリュームを作成し、スナップショットに対する更新データを別のファイル(差分ファイル)で差分管理する。その差分ファイル作成直後はデータブロックを持たないが、データブロックの管理テーブルを作成する。データブロック管理テーブルのフィールドには物理ブロック番号などが格納され、初期値は“０”である。データブロック管理テーブルのフィールドが“０”状態のファイルにアクセスした場合は、スナップショットのデータが参照される。
前記ファイルクローン機能では、ファイルブロックを管理するファイル管理テーブルや論理ブロックと物理ブロックの対応付けを行う管理デーブルを作成しているため、クローンファイルの作成性能に問題があった。すなわち、下記２つの課題がある。
（ａ１）クローンを作成するのに一度スナップショットを作成する必要があること。
（ａ２）クローンへの更新が発生する前に管理テーブルを生成するが、大サイズファイルの場合、ファイル管理テーブルの容量も大きく、クローン作成に時間がかかること
その結果、数百から数千のクローンファイルを作成する場合にクローンファイル作成性能の低下及び作成の長時間化が問題となっていた。
【課題を解決するための手段】
【０００６】
そこで、本発明では、
（ｂ１）ファイルのクローンを作成する要求を受けた場合、ファイルへの更新を禁止し、差分ファイルを作成して、差分ファイルへ更新データを書き込む。（ｂ２）さらに、差分ファイルを作成した後であって、差分ファイルに最初の更新要求を受けた場合、管理テーブルを作成する。
これらの２方式で、クローンファイルを高速に作成する。
【０００７】
その具体的な手段は、クライアント端末とストレージシステムとに接続されるファイルサーバであって、プロセッサと、ファイルを管理するファイルシステムプログラムを格納するメモリとを有し、前記ファイルシステムプログラムは、前記ファイルのクローンを作成する要求を受けた場合、前記ファイルへの更新を禁止し、第１の差分ファイルを作成し、前記クローンへのアクセス要求を受けた場合、前記第１の差分ファイルへアクセスし、前記アクセスが
（１）更新要求の場合は、
（１ａ）前記更新要求で指定された前記第１の差分ファイルのファイルブロックに、前記ストレージシステムのディスクブロックが割り当てられていない場合は、そのファイルブロックに前記ストレージシステムのディスクブロックを割り当てて、そこに更新データを書き込み、
（１ｂ）そのファイルブロックに前記ストレージシステムのディスクブロックが割り当てられている場合は、そこに更新データを書き込み、
（２）読み出し要求の場合は
（２ａ）前記読み出し要求で指定された前記第１の差分ファイルのファイルブロックにデータが有ればそのデータを読み出し、
（２ｂ）そのファイルブロックにデータが無ければ、前記ファイルの対応するファイルブロックにデータがあればそのデータを読み出し、
前記ファイルへの更新要求があった場合、第２の差分ファイルを作成し、
前記更新要求で指定された前記第２の差分ファイルのファイルブロックに前記ストレージシステムのディスクブロックを割り当て、そこに更新データを書き込むことである。
【０００８】
また、別の具体的な手段は、さらに、前記ファイルシステムプログラムは、前記ファイルのコピーファイル作成要求があった場合、前記ファイルへの更新要求の有無にかかわらず、前記第１の差分ファイルとともに、第２の差分ファイルを作成し、前記ファイルへのアクセス要求を受け付けた場合、前記第２の差分ファイルにアクセスし、
前記アクセスが
（１）更新要求の場合、
（１ａ）前記更新要求で指定された前記第２の差分ファイルのファイルブロックに前記ストレージシステムのディスクブロックが割り当てられていない場合は、前記ストレージシステムのディスクブロックを割り当てて、そこに更新データを書き込み、
（１ｂ）そのファイルブロックにディスクブロックが割り当てられている場合は、そこに更新データを書き込み、
（２）読み出し要求の場合、
（２ａ）前記読み出し要求で指定された前記第２の差分ファイルのファイルブロックにデータが有ればそのデータを読み出し、
（２ｂ）そのファイルブロックにデータが無ければ、前記ファイルの対応するファイルブロックにデータがあればそのデータを読み出すことである。
【０００９】
更に、別の具体的な手段は、前記ファイルシステムプログラムは、前記第１の差分ファイルを作成した後であって、前記第１の差分ファイルに最初の更新要求を受けた場合、第１のデータ管理テーブルを作成し、その更新データを含むファイルデータのオフセットと、その更新要求で指定された前記第１の差分ファイルのファイルブロックに割り当てた前記ストレージシステムのディスクブロックの開始ブロック位置と、そのファイルデータブロック長とを前記第１のデータ管理テーブルに記録することである。
【発明の効果】
【００１０】
前記のように、クローンファイル作成時にはスナップショットの作成が不要なため、クローンファイルを高速に作成できる。また、クローンファイルへの更新発生後に管理テーブルを作成するため、更新前に無駄な容量を確保しなくて済み、消費容量を削減できる。
【図面の簡単な説明】
【００１１】
【図１】本発明の構成例を示す図である。
【図２】クライアントの構成例を示す図である。
【図３】ファイルサーバの構成例を示す図である。
【図４】ディスクストレージ装置の構成例を示す図である。
【図５】管理端末の構成例を示す図である。
【図６】クローンファイルのファイル関係を示す図である
【図７】ファイルの管理情報の関係を示す図である。
【図８】クローンファイルのデータの関係を示す図である。
【図９】クローンファイル作成の動作例を示すフローチャートである。
【図１０】クローンファイル読み込みの動作例を示すフローチャートである。
【図１１】ファイルシステムプログラムのファイル読み込み動作例を示すフローチャートである。
【図１２】クローンファイル書き込みの動作例を示すフローチャートである。
【図１３】ファイルシステムプログラムのファイル書き込み動作例を示すフローチャートである。
【図１４】クローンファイルのサイズ変更動作例を示すフローチャートである。
【図１５】ファイルシステムプログラムのクローンファイルのサイズ変更動作例を示すフローチャートである。
【図１６】クローンファイルの削除動作例を示すフローチャートである。
【図１７】ファイルシステムプログラムのクローンファイルの削除動作例を示すフローチャートである。
【図１８】管理ＧＵＩの例である。
【図１９】実施例２におけるクローンファイルの階層化構成を示す図である。
【図２０】実施例２におけるクローンファイル読み込み動作例を示すフローチャートである。
【図２１】実施例２におけるファイルシステムプログラムのクローンファイル読み込み動作例を示すフローチャートである。
【図２２】実施例２におけるクローンファイル書き込み動作例を示すフローチャートである。
【図２３】実施例２におけるファイルシステムプログラムのクローンファイル書き込み動作例を示すフローチャートである。
【図２４】実施例３における管理ＧＵＩの例である。
【図２５】実施例３におけるファイルコピーの動作例を示すフローチャートである。
【発明を実施するための形態】
【００１２】
以下、図面を参照しながら本発明の実施の形態を説明するが、本発明はこの実施形態に限定されるものではない。
【実施例１】
【００１３】
本発明の第一の実施例を図１から図１８で説明する。まず、構成を図１から図５で説明する。図１は、本発明におけるファイル共有システムの構成例を示す図である。クライアント１００１は、ファイル共有システムを利用するエンドユーザが使用する計算機である。クライアント１００１の内部構成と内部処理の動作は、後述（図２を用いて説明）する。
【００１４】
ネットワークスイッチ１００２は、クライアント１００１、管理端末１００５、そして、ファイルサーバ１００３をＬＡＮ（Local  Area  Network）によって接続可能とする装置である。ただし、ＬＡＮを構成するために無線通信装置などを用いてもよく、本発明は接続形態を限定するものではない。ファイルサーバ１００３は、クライアント１００１を利用するエンドユーザへファイル共有サービスを提供する計算機である。内部の構成と内部の処理は後で後述する。ディスクストレージ１００４は、ファイルサーバ１００３に格納されるファイルデータを保持するためのディスク装置である。
【００１５】
ファイルサーバ１００３とディスクストレージ１００４は、ＦＣ（Fibre  Channel）プロトコルを用いて接続されている。ファイルサーバ１００３とディスクストレージ１００４との接続には、ｉＳＣＳＩ（Internet  Small  Computer  System  Interface）といった別のプロトコルを用いてもよい。本発明は、ファイルサーバ１００３とディスクストレージ１００４との接続形態を限定するものではない。管理端末１００５は、本発明におけるファイル共有システムを管理するために、システム管理者が使用する計算機である。管理端末１００５の内部構成と内部処理の動作は後述（図５を用いて説明）する。
【００１６】
図２は、本発明におけるクライアント１００１の内部構成例を示すブロック図である。クライアント１００１は、ＣＰＵ２００１、メモリ２００２、ネットワークインタフェース２００５を有し、これらは内部通信路によって相互に接続されている。ＣＰＵ２００１は、メモリ２００２へ格納されたアプリケーションプログラム２００３とファイルアクセスプログラム２００４を実行する。アプリケーションプログラム２００３は、エンドユーザが利用するプログラムであり、例えば、表計算プログラムである。
【００１７】
ファイルアクセスプログラム２００４は、ファイルサーバ１００３がエンドユーザへ提供するファイル共有サービスへアクセスするためのプログラムである。アプリケーションプログラム２００３がファイルサーバ１００３のファイルへＬＡＮを通してアクセスする場合、ファイルアクセスプログラム２００４がファイルアクセス要求をファイルサーバ１００３へ送信する。そして、ファイルアクセスプログラム２００４はファイルアクセス結果をファイルサーバ１００３から受信し、アプリケーションプログラム２００３へ送信する。
【００１８】
図３は、本発明におけるファイルサーバ１００３の内部構成例を示すブロック図である。ファイルサーバ１００３は、ＣＰＵ３００１とメモリ３００２とネットワークインタフェース３０２０とストレージインタフェース３０２１とを有し、これらは内部通信路によって相互に接続されている。ＣＰＵ３００１は、メモリ３００２に格納されたファイルサーバプログラム３００３、ファイルシステムプログラム３００４、ファイルクローニングプログラム３００５、ファイルクローニング管理プログラム３００６を実行する。なお、前記プログラム群をディスク（図示せず）上に格納して適宜読み出して実行しても良い。
【００１９】
また、メモリは、ファイルメタデータ３００８とファイルのデータブロック情報であるデータ管理テーブル３０１１を保持している。図７で詳述するように、ファイルメタデータ３００８とデータ管理テーブル３０１１はファイル毎に作成される。また、ファイルサーバ１００３の再起動後に再構成できるよう、ファイルメタデータ３００８とデータ管理テーブル３０１１は、ディスクシステム１００４のディスク４００５に保存される。
【００２０】
ファイルメタデータ３００８は、ファイルサイズやアクセス許可フラグ等を持つファイル管理情報であるｉｎｏｄｅ３００９、クローンファイルの属性を保持するフラグ３０１０、ファイルが最も小さく切り詰められた（データが削除された後の）サイズを格納する最小サイズ３０１２、クローン元ファイルを参照しているクローン子差分ファイルの数を持つ参照カウンタ３０１３を持つ。
【００２１】
本発明では、ｉｎｏｄｅ３００９がファイル管理情報の他に、図６で詳述するクローン元ファイル６０１１を指示すソースポインタ３０２０とクローン親差分ファイル６０１０を指示す親差分ポインタ３０２１を持つ。ソースポインタ３０２０と親差分ポインタ３０２１には、例えば、個々のｉｎｏｄｅに割り当てられるユニークな番号であるｉｎｏｄｅ番号を格納する。ただし、３０２０と３０２１に格納される情報を用いてｉｎｏｄｅを識別できれば良く、特にｉｎｏｄｅ番号に限定する訳ではない。ファイルクローニング機能は、これらのデータを用いてファイルクローニング機能を実現する。これらのデータの詳細な利用については後述する。なお、前記データやテーブルをディスク（図示せず）上に格納して適宜読み出して使用する、またはディスクに格納して使用しても良い。
【００２２】
ファイルサーバプログラム３００３は、クライアント１００１のファイルアクセスプログラム２００４からファイルアクセス要求を受け取る。そして、ファイルサーバプログラム３００３は、ファイルシステムプログラム３００４を用いてディスクストレージ１００４に格納されたファイルのデータへアクセスするプログラムである。その際、アクセス対象のファイルがクローンファイルの場合は、ファイルシステムプログラム３００４がクローンファイルに対する処理を実施する。ファイルサーバ１００３の処理内容は後述する。
【００２３】
図４は、本発明におけるディスクストレージ１００４の内部構成例を示すブロック図である。ディスクストレージ１００４は、ＣＰＵ４００１、メモリ４００２、ディスクコントローラ４００４、ストレージインタフェース４００６を有し、それらは内部通信路によって相互に接続されている。さらに、ディスクコントローラ４００４は、ディスク４００５とも接続されておりディスク４００５を制御している。ディスクコントローラ４００４は、ＲＡＩＤ（Redundant  Arrays  of  Inexpensive  Disks）機能を有し、複数のディスク４００５を冗長化することでディスク装置の耐障害性を向上させる。
【００２４】
ＣＰＵ４００１は、メモリ４００２に格納されたストレージ管理プログラム４００３を実行する。ストレージ管理プログラム４００３は、ディスクコントローラ４００４のＲＡＩＤ機能を管理するプログラムである。例えば、冗長化するディスク装置の構成を設定する。本発明において、ディスクストレージ１００４は特殊なストレージ装置でも良く、また、冗長化機能を有しないストレージ装置でも良い。さらに、光学ディスクやテープ装置などを用いてもよい。つまり、本発明はファイルデータを保存する記憶装置を限定するものではない。
【００２５】
図５は、本発明における管理端末１００５の内部構成例を示すブロック図である。管理端末１００５は、ＣＰＵ５００１、メモリ５００５、ネットワークインタフェース５００４を有し、それらは内部通信路によって相互に接続されている。ＣＰＵ５００１は、メモリ５００５に格納されている管理プログラム５００２と管理インタフェース５００３を実行する。
【００２６】
管理プログラム５００２は、管理インタフェース５００３を通して本発明におけるファイル共有システムを管理する機能をシステム管理者へ提供するプログラムである。システム管理者が管理インタフェース５００３へ管理情報を入力すると、管理プログラム５００２へその管理情報が伝えられる。管理プログラム５００２は、その管理情報にしたがって、ファイルサーバ１００３を設定する。管理プログラム５００２の処理内容と管理インタフェース５００３の詳細は後述する。
【００２７】
次に、クローンファイル構造を説明する。図６は、本発明におけるクローンファイルのファイル関係を示す図である。本発明のファイルクローニング機能は、クローンファイルをクローン親ファイル６００４とクローン子ファイル６００３の２つに分けて定義する。クローン親ファイル６００４は、クローンされるファイルと同じファイルを表現する。クローン親ファイル６００４は、クローン元ファイル６０１１とクローン親差分ファイル６０１０によって構成される。クローン親ファイル６００４は、クローンファイルの元となるファイルのように振る舞う。つまり、クローンファイル作成の前後で、クライアント１００１がクローンファイルの元となるファイルへアクセスすると、クローン親ファイル６００４へアクセスすることになる。
【００２８】
クライアント１００１がクローン親ファイル６００４へアクセスする場合、ファイルシステムプログラム３００４は、クローン元ファイル６０１１へアクセスする。同時に、ファイルシステムプログラム３００４は、クローン親差分ファイル６０１０へもアクセスする。もし、クライアント１００１がクローン親ファイル６００４へデータを書き込む場合（つまり、クローン元ファイル６０１１へデータを書き込む場合）、ファイルシステムプログラム３００４はそのデータをクローン親差分ファイルへ書き込む。
【００２９】
この処理を実現するため、クローン元ファイル６０１１がオープンされる時、ファイルシステムプログラム３００４は、クローン元ファイル６０１１のｉｎｏｄｅ３００９にある親差分ポインタ３０２１に、クローン親差分ファイル６０１０のｉｎｏｄｅ番号を設定する。その後、ファイルシステムプログラム３００４はクローン親差分ファイル６０１０をオープンし、クローン親差分ファイル６０１０のｉｎｏｄｅ３００９にあるソースポインタ３０２０にクローン元ファイル６０１１のｉｎｏｄｅ番号を設定する。
【００３０】
クライアント１００１が、クローン元ファイル６０１１へデータを書き込もうとすると（つまり、クローン親ファイル６００４へデータを書き込もうとすると）、ファイルシステムプログラム３００４は親差分ポインタ３０２１からクローン親差分ファイル６０１０を求め、データをクローン親差分ファイル６０１０へ書き込む。以上の処理は、後で詳述する。
【００３１】
前述のように、特許文献１では、管理が必要なスナップショットとクローンとを管理する必要がある。一方、本発明では、クローン親差分ファイル６０１０をクライアント１００１へ公開することなくファイルクローニング機能を実現できるため、管理コストを削減できる。
【００３２】
図６の例では、クローン親差分ファイル６０１０にデータ管理テーブル３０１１が無い（点線部分）。つまり、クローン親差分ファイル６０１０にはデータ６００１が無い（点線部分）。つまり、クローン子ファイル６００３の作成後、クライアント１００１がクローン親ファイル６００４へデータを書き込んでいない。このように、クローンファイルを作成する際には、クローン親差分ファイル６０１０はデータが無く、さらに、データ管理テーブル３０１１も無い。従って、クローン親差分ファイルを高速に作成できる。
【００３３】
一方、クローン子ファイル６００３は、クローン元ファイル６０１１とクローン子差分ファイル６０１２によって構成される。クローン子ファイル６００３は、クローン元ファイル６０１１のコピーファイルのように振る舞う。クライアント１００１がクローン子ファイル６００３へアクセスする場合、ファイルシステムプログラム３００４はクローン子差分ファイル６０１２へアクセスする。その際、ファイルシステムプログラム３００４はクローン元ファイル６０１１へもアクセスする。
【００３４】
もしクライアント１００１がクローン子ファイル６００３へデータを書き込む場合、ファイルシステムプログラム３００４はそのデータをクローン子差分ファイル６０１２へ書き込む。この処理を実現するため、クローン子差分ファイル６０１２がオープンされる時、ファイルシステムプログラム３００４はクローン子差分ファイル６０１２のｉｎｏｄｅ３００９にあるソースポインタ３０２０に、クローン元ファイル６０１１のｉｎｏｄｅ番号を設定する。
【００３５】
クライアント１００１がクローン子差分ファイル６０１２へデータを書き込もうとすると（つまり、クローン子ファイル６００３へデータを書き込もうとすると）、ファイルシステムプログラム３００４はソースポインタ３０２０からクローン元ファイル６０１１を求める。そして、クローン元ファイル６０１１のデータと書き込みデータをあわせて、クローン子差分ファイル６０１２へ書き込む。これらの処理は後で詳述する。
【００３６】
図６の例では、クライアント１００１がクローン子ファイル６００３へデータを書き込んだ結果、データ管理テーブル３０１１がファイルメタデータ６０１２に作成される。そのデータ管理テーブル３０１１が、ディスク４００５のクローン子差分ファイルのデータブロック６００２を指示している。また、クローン元ファイル６０１１のファイルメタデータにあるデータ管理テーブル３０１１は、クローン元ファイル６０１１のデータブロック６００１を指示している。クローン親ファイル６００４のファイル関係を示すため、クローン元ファイル６０１１のｉｎｏｄｅ３００９の親差分ポインタ３０２１は、クローン親差分ファイル６０１０のｉｎｏｄｅ３００９を指示している。
【００３７】
同様に、クローン親差分ファイル６０１０のｉｎｏｄｅ３００９のソースポインタ３０２０もクローン元ファイル６０１１のｉｎｏｄｅ３００９を指示している。一方、クローン子ファイル６００３のファイル関係を示すため、クローン子差分ファイル６０１２のｉｎｏｄｅ３００９のソースポインタ３０２０は、クローン元ファイル６０１１のｉｎｏｄｅを指示している。また、クローン親差分ファイル６０１０のｉｎｏｄｅ３００９も、クローン元ファイル６０１１のｉｎｏｄｅ３００９を指示している。一方、クローン子ファイル６００３のファイル関係を示すため、クローン子差分ファイル６０１２のｉｎｏｄｅ３００９は、クローン元ファイル６０１１のｉｎｏｄｅを指示している。
【００３８】
なお、それぞれのファイル６０１０、６０１１、６０１２のフラグ３０１０は、そのファイルの属性を示すフラグを保持する。設定されるフラグはＧＩ（Golden  Image）フラグとＣＬＯＮＥフラグである。クローン子ファイルを作成する場合、ファイルクローニングプログラム３００５は、クローン元ファイル６０１１のフラグ３０１０にクローン元ファイルであることを示すＧＩフラグを設定する。
【００３９】
そして、クローン子差分ファイル６０１２のフラグ３０１０と、クローン親差分ファイル６０１０のフラグ３０１０とに、クローン差分ファイルであることを示すＣＬＯＮＥフラグを設定する。これらのフラグは、ファイルシステムプログラム３００４が処理対象ファイルを特定するために使用される。図６の例の場合は、クローン子差分ファイルにデータがある。しかし、クローン子差分ファイルが作成された後にクローン子ファイルへ書き込みが無ければデータは無く、さらにデータ管理テーブル３０１１も無い。従って、クローン子差分ファイルを高速に作成できる。
【００４０】
以上のように、クローンファイルのファイル関係が構築される。それぞれのファイルへの操作は後で詳述する。なお、図６は、クローン子ファイル６００３が１つ作成される例を示している。本発明はクローン子ファイル６００３の数を限定せず、クローン子ファイルを複数作成することも可能である。以降は、図６のように、クローン子ファイル６００３が１つ作成されるものとして説明する。
【００４１】
図７は、ファイル７００１、ファイルメタデータ３００８、データ管理テーブル３０１１及びディスク４００５に格納されるファイルデータ７０２０の関係を示す図である。ファイル７００１は、ファイルメタデータ３００８とデータ管理テーブル３０１１を持つ。ファイル７００１のサイズは、論理的なファイルブロック７０３０単位で管理される。例えば、ファイルの先頭から４キロバイト（ＫＢ）はブロック１、その次の４ＫＢはブロック２として管理される。また、論理的なファイルブロック７０３０は、ディスクブロック７０１０とは異なり、ホール７０２２にもファイルブロック番号が割り当てられる。
【００４２】
また、ディスク４００５は、特定サイズのディスクブロックに分割して管理される。図７の場合、４ＫＢ毎のファイル７００１のディスクブロック７０１０に分割されている。データ管理テーブル３０１１は、ファイル７００１のファイルデータ７０２０を管理するテーブルである。データ管理テーブル３０１１の各レコードは、ファイルオフセット７００２、開始ブロック位置７００３とブロック長７００４のフィールドを持つ。ファイルオフセット７００２は、ファイルデータ７０２０の先頭からのオフセットを示す。開始ブロック位置７００３は、ファイルデータ７０２０が格納されるディスクブロック６００１の先頭のブロック番号を持つ。ブロック長７００４は、ファイルデータ７０２０のブロック７０１０の長さを持つ。
【００４３】
例えば、ファイルオフセット７００２が“０”、開始ブロック位置７００３が“１”、ブロック長７００４が“５”である場合、ファイル７００１の０バイトから２０ＫＢ（＝４ＫＢ／ブロック＊５ブロック）のデータは、ディスク４００５のブロック番号１からブロック番号５に格納されていることを示す。同様に、ファイルオフセット７００２が“６５５３６”、開始ブロック位置７００３が“７”、ブロック長７００４が“６”である場合、６５５３６バイト（６４ＫＢ）目から２４ＫＢ（＝４ＫＢ／ブロック＊６ブロック）のデータは、ブロック番号７から始まりブロック番号１２まで６ブロックに格納されていることを示す。
【００４４】
図７の場合、ファイル７００１のデータは、ファイルデータ７０２０のように、ファイルのデータ領域７０２１とホール７０２２を持つ。ホールとは、ディスク上のブロック７０１０が割り当てられていないデータ領域である。クライアント１００１が、ファイル７００１のホール７０２２の部分を読み出す場合、ブロック７０１０が無いため、ファイルシステムプログラム３００４は“０”をクライアント１００１へ返す。
【００４５】
また、データ管理テーブル３０１１は、ディスクへデータを格納する時に作成される。同じく、新規ブロックが追加され、更にブロックが不連続である場合にのみ、レコードがデータ管理テーブル３０１１に追加される。図７の例では、ファイルに追加データが書き込まれブロック１３が新たに使用される場合、２レコード目のブロック長７００４の値が“６”から“７”へ１つ増加する。
【００４６】
一方、ブロック１４を新規に使用する場合には、レコード（３レコード目）を追加することもできる。このように、必要に応じたデータ管理テーブル３０１１へのレコード追加で、ファイル作成時に作成しなければならない管理データが削減でき、高速にファイルを作成できる。
【００４７】
図８は、クローン子ファイル６００３またはクローン親ファイル６００４のデータ関係を示す図である。クローン子ファイル６００３は、クローン子差分ファイル６０１２とクローン元ファイル６０１１とを重ねた様に構成される。クローン子差分ファイル６０１２のホールは、クローン子ファイル６００３の作成後にデータが書き込まれていない（つまり、差分情報が無い）状態である。
【００４８】
図８の場合、ファイルのブロック１にはクローン子差分ファイル６０１２にブロック番号１０、クローン元ファイル６０１１にブロック番号１が割り当てられている。ここで、クライアント１００１がクローン子ファイル６００３のファイルブロック１を読み込む場合８００３、ファイルシステムプログラム３００４はクローン子差分ファイル６０１２のブロック番号１０のデータを読み込む。
【００４９】
また、クローン子差分ファイル６０１２のファイルブロック３はホール７０２２である。しかし、クローン元ファイル６０１１はブロック番号３が割り当てられている。ここで、クライアント１００１がクローン子ファイル６００３のファイルブロック３を読み込む場合８００４、ファイルシステムプログラム３００４はクローン元ファイル６０１１のブロック番号３のデータを読み込む。
【００５０】
クライアント１００１が、クローン子ファイル６００３へデータを書き込むとクローン子差分ファイル６０１２へ、データが書き込まれる。書き込み８００１の場合、クライアント１００１が、クローン子ファイル６００３のファイルブロック５にデータを書き込む。この場合、クローン子差分ファイル６０１２へブロックを割り当てて、クライアント１００１から送られたデータを書き込む。
【００５１】
また、クライアント１００１がファイルブロック６にデータを書き込む場合８００２、クローン子差分ファイル６０１２にブロック番号１５が割り当てられているため、このディスク領域へデータを書き込む。
【００５２】
以上のように、クライアント１００１がクローン子ファイル６００３へアクセスする場合、ファイルシステムプログラム３００４は、まず、クローン子差分ファイル６０１２にブロックがあるかどうかを調べ、ブロックがある場合はそのデータを処理する。
【００５３】
一方、クローン子差分ファイル６０１２にブロックが無い場合、ファイルシステムプログラム３００４はクローン元ファイル６０１１のブロックを調べる。クローン元ファイル６０１１にブロックがある場合、ファイルシステムプログラム３００４はそのブロックのデータを処理し、無い場合は“０”とする。なお、クローン親ファイル６００４も同様となる。
【００５４】
図９は、クローンファイル作成の動作例を示すフローチャートである。クライアント１００１を利用するエンドユーザやファイルサーバ１００３の管理者が、管理端末１００５の管理プログラム５００２を用いてクローンファイルを作成する（ステップ９００１）。管理プログラム５００２は、管理インタフェース５００３を通してファイルサーバ１００３のファイルクローニング管理プログラム３００６へ、クローンファイル作成を要求する（ステップ９００２）。
【００５５】
ファイルクローニング管理プログラム３００６は、クローンファイル作成要求を受理し（ステップ９００３）、ファイルクローニングプログラム３００５へクローン子ファイル作成を要求する（ステップ９００４）。
【００５６】
ファイルクローニングプログラム３００５が、クローン子ファイル作成要求を受理すると、クローン元ファイル６０１１にするファイルを静止化する。そのため、ファイルクローニングプログラム３００４は、そのファイルのフラグ３０１０にＧＩフラグを設定する（ステップ９０１０）。ＧＩフラグが設定されると、ファイルシステムプログラム３００４は、その静止化されたファイルへの更新処理（例えば、書き込み処理）を禁止する。ステップ９０１０が終了した時点で、そのファイルはクローン元ファイル６０１１になる。
【００５７】
次に、ファイルクローニングプログラム３００５は、クローン子差分ファイル６０１２とクローン親差分ファイル６０１０を作成する（ステップ９００６）。そして、ファイルクローニングプログラム３００５は、クローン子差分ファイル６０１２のｉｎｏｄｅ３００９のソースポインタ３０２０へクローン元ファイル６０１１のｉｎｏｄｅ番号を設定する（ステップ９００７）。
【００５８】
この処理により、クローン子差分ファイル６０１２のｉｎｏｄｅ３００９と、クローン元ファイル６０１１のｉｎｏｄｅ３００９とが対応付けられる。そして、ファイルクローニングプログラム３００５は、クローン子差分ファイル６０１２のフラグ３０１０へ、ＣＬＯＮＥフラグを設定する。
【００５９】
以上のように、ＧＩフラグをクローン元ファイル６０１１となるファイルのフラグ３０１０へ設定することにより、そのファイルを静止化できる。ファイルシステムプログラム３００４はＧＩフラグを確認することで、当該ファイルがクローン元ファイル６０１１となり、更新が禁止されたことが分かる。
【００６０】
また、ステップ９００７において、ファイルクローニングプログラム３００５は、クローン親差分ファイル６０１０のフラグ３０１０へ、ＣＬＯＮＥフラグを設定する。そして、ファイルクローニングプログラム３００５は、クローン親差分ファイル６０１０のｉｎｏｄｅ３００９のソースポインタ３０２０へ、クローン元ファイル６０１１のｉｎｏｄｅ番号を設定する。
【００６１】
そして、ファイルクローニングプログラム３００５は、クローン元ファイル６０１１のｉｎｏｄｅ３００９の親差分ポインタ３０２１へ、クローン親差分ファイル６０１０のｉｎｏｄｅ番号を設定する。同じく、ファイルクローニングプログラム３００５は、クローン元ファイル６０１１の参照カウンタ３０１３の値を１つ上げる。
【００６２】
最後に、ファイルクローニングプログラム３００５は、クローンファイル作成結果を管理プログラム５００２へ、管理インタフェース５００３を通して通知する（ステップ９００８）。この結果、図６を用いて説明したクローンファイルのデータ関係が構築される。なお、クローンファイルを作成する際に、ファイルクローニングプログラム３００５に同時作成数を入力するようにしても良い。その場合、ファイルクローニングプログラム３００５はステップ９００６を指定された同時作成数回実行する。
【００６３】
ちなみに、本実施例が前提としているＶＤＩ環境では、まず、クローン元ファイル６０１１となる仮想ディスクファイルを作成して、その仮想ディスクファイルへＶＭのＯＳイメージをインストールする。そして、その仮想ディスクファイルに対してクローン子ファイル６００３を作成する。
【００６４】
ＶＤＩ環境では、クライアント１００１を利用するエンドユーザ毎に、クローン子ファイル６００３を作成する。つまり、１０００人のユーザがいれば１０００の仮想ディスクファイルのクローン子ファイル６００３を作成する。そして、エンドユーザは仮想ディスクファイルのクローン子ファイル６００３を元にしてＶＭを起動する。
【００６５】
一方、ＶＭが作成された後は、クローン元ファイル６０１１を元にしてＶＭを起動することはないため、クローン元ファイル６０１１は更新されない。そこで、ＶＤＩ環境を考慮し、図９のステップ９００６において、ファイルクローニングプログラム３００５がクローン親差分ファイル６０１０を作成しない方法もある。
【００６６】
つまり、ファイルクローニングプログラム３００５がクローン親差分ファイル６０１０を作成しなくとも済むため、クローンファイルの作成性能の向上が図れる。なお、クローン親差分ファイル６０１０を作成しない場合、クローンファイル作成後はクローン元ファイル６０１１の更新が禁止される。
【００６７】
一方、ステップ９００６において、ファイルクローニングプログラム３００５がクローン親差分ファイル６０１０を作成せず、図１２、図１３で説明するクローン親ファイル６００４へのデータ書き込みを行う時点で、クローン親差分ファイル６０１０を作成することも可能である。この方法では、クローン子ファイル６００３を作成する時はクローン親差分ファイル６０１０を作成しないため、クローンファイル作成性能の向上を期待できる。さらに、クローン元ファイル６０１１への書き込みも可能になる。
【００６８】
なお、従来技術では、取得したスナップショットに対するクローンファイルを作成している。スナップショットは、ある時点におけるファイルシステムイメージである。そのため、スナップショットを取得する際に、ファイルシステムプログラムはファイルシステムの管理情報を退避しておく必要がある。その結果、クローンファイルの作成に時間がかかる。しかしながら、本発明では、クローンファイル作成の際、スナップショットを取らなくても良いため、クローンファイル作成性能の向上が期待できる。
【００６９】
同じく、従来技術では、クローン子差分ファイル６０１２の作成に相当する処理の実行では、そのクローン子差分ファイル６０１２のデータ管理テーブル３０１１に相当するテーブル全体を作成して、全てを初期化している。そのため、ＶＤＩ環境でＶＭに割り当てる仮想ディスクファイルは数１０ＧＢのサイズで作成される場合があるため、初期化処理時間が長くなり、クローン処理が遅くなる。本発明では、データ管理テーブル３０１１の初期化は不必要なため、クローンファイル作成処理が高速であり、かつ余分なディスク容量を浪費することがない。
【００７０】
図１０は、クローンファイルの読み込み動作を示すフローチャートである。クライアント１００１のアプリケーションプログラム２００３が、クローン子ファイル６００３やクローン親ファイル６００４を読み込む場合、ファイルアクセスプログラム２００４へファイル読み込みを要求する。そして、ファイルアクセスプログラム２００４は、ファイル読み込み要求をファイルサーバ１００３のファイルサーバプログラム３００３へ送信する（ステップ１０００１）。
【００７１】
ファイルサーバプログラム３００３がファイル読み込み要求を受信した後、ファイルサーバプログラム３００３は、ファイル読み込み処理をファイルシステムプログラム３００４へ要求する（ステップ１０００２）。ファイル読み込み要求を受理したファイルシステムプログラム３００４は、読み込み対象ファイルがクローン元ファイル６０１１かどうかをフラグ３０１０によって判定する（ステップ１０００３）。
【００７２】
ここで、読み込み対象ファイルがクローン元ファイル６０１１だった場合（ステップ１０００３：「ＹＥＳ」）、ファイルシステムプログラム３００４は、クローン元ファイル６０１１のｉｎｏｄｅ３００９の差分ポインタ３０２１に格納されているクローン親差分ファイル６０１０のｉｎｏｄｅ番号を元に、クローン親差分ファイル６０１０のファイルメタデータ３００８を取得する（ステップ１０００４）。
【００７３】
次のステップ１１０００のファイルブロック読み出し処理は、クローン親差分ファイル６０１０のファイルメタデータ３００８の状態に従い実行される。なお、ステップ１１０００の処理は、クローン子差分ファイル６０１２でも、クローン親差分ファイル６０１０でも共通である。一方、読み込み対象ファイルがクローン元ファイル６０１１でない場合（ステップ１０００３：「ＮＯ」）、ファイルシステムプログラム３００４はステップ１１０００を実行する。ステップ１１０００の処理で、ファイルシステムプログラム３００４が実際にファイルブロックを読み込む。本処理は後で詳述する。
【００７４】
最後に、ファイルシステムプログラム３００４がファイルサーバプログラム３００３へファイル読み込み結果を返し、ファイルサーバプログラム３００３はファイルアクセスプログラム２００４へその結果を送信する。そして、ファイルアクセスプログラム２００４は、アプリケーションプログラム２００３へ結果を通知する（ステップ１０００５）。以上の処理により、アプリケーションプログラム２００３から要求されたファイル読み込み処理が実施できる。
【００７５】
図１１は、ファイルシステムプログラム３００４のファイル読み込み動作を示すフローチャートである。ファイルシステムプログラム３００４は、図１０のステップ１０００４で求めたクローン親差分ファイル６０１０のファイルメタデータ３００８のフラグ３０１０か、クローン子差分ファイル６０１２のファイルメタデータ３００８のフラグ３０１０かに、ＧＩフラグまたはＣＬＯＮＥフラグが設定されているかを確認する（ステップ１１００２、ステップ１１００３）。
【００７６】
フラグが設定されていない場合（ステップ１１００３：「ＮＯ」）、ファイルクローニング機能とは関係が無いファイルのため、通常のファイルとして処理する（ステップ１１００４）。一方、いずれかのフラグが設定されている場合（ステップ１１００３：「ＹＥＳ」）、ファイルシステムプログラム３００４はクローンファイルとして処理する。
【００７７】
以下、クローン子差分ファイルに基づいて動作を説明する。なお、クローン親差分ファイルを用いる場合も同様の処理となる。ファイルシステムプログラム３００４は読み込むファイル位置にクローン子差分ファイル６０１２のデータがあるかどうかを判定する（ステップ１１００５、ステップ１１００６）。これは、図７で説明した管理情報を用いる。
【００７８】
例えば、クライアント１００１が４ＫＢから１０バイト読み込むことを要求した場合は、ファイル７００１はディスクブロックを保持しているため、ファイルシステムプログラム３００４はデータ有りと判定する。
【００７９】
一方、クライアント１００１が２０ＫＢから４ＫＢ読み込む場合、ファイル７００１のその部分はホール７０２２であるため、ディスクブロックを保持していない。そのため、ファイルシステムプログラム３００４は「データ無し」と判定する。
【００８０】
ステップ１１００６において、ファイルシステムプログラム３００４が「データ有り」と判定した場合、ファイルシステムプログラム３００４はクローン子差分ファイル６０１２のデータを読み込み、そのデータを送信して図１１の処理を終える。
【００８１】
一方、ステップ１１００６において、ファイルシステムプログラム３００４が「データ無し」と判定した場合、ファイルシステムプログラム３００４は最小サイズ３０１２と読み込み位置を比較する（ステップ１１０１２）。読み込み位置が最小サイズ３０１２のデータ最後尾位置より後ろの場合（ステップ１１０１２：「ＹＥＳ」）、ファイルシステムプログラム３００４は“０”を返す（ステップ１１０１０）。
【００８２】
この処理は、クローン子差分ファイル６０１２がクローン元ファイル６０１１より切り詰められた（データが削除された）後、クライアント１００１がクローン子差分ファイル６０１２のサイズを伸長した時に有効である。この処理を行うと、クローン子差分ファイル６０１２のデータを切り詰めた部分のデータがホールになる。クライアント１００１がこのホール部分を読み込む場合、ファイルシステムプログラム３００４は“０”で送信する必要がある。
【００８３】
しかし、ファイルシステムプログラム３００４は、クローン子差分ファイル６０１２にデータが無かったのか（クローン子ファイル６００３が更新されていない）、切り詰められたのかどうかを、ホールだけでは判定できない。そのため、最小サイズ３０１２が切り詰められた時の最小サイズを記憶する。ファイルシステムプログラム３００４は最小サイズ３０１２のデータ最後尾位置と読み出し位置を比較することによって、“０”を返すかクローン元ファイル６０１１のデータを返すかを判定できるようになる。
【００８４】
一方、ステップ１１０１２での条件判定結果が「ＮＯ」の場合、ファイルシステムプログラム３００４は、クローン元ファイル６０１１のデータ管理テーブル３０１１からクローン元ファイル６０１１がデータブロックを持っているかどうかを調べる（ステップ１１００８、ステップ１１００９）。クローン元ファイル６０１１がデータブロックを持っていない場合（ステップ１１００９：「ＮＯ」）、ステップ１１０１０へ進み、ファイルシステムプログラム３００４は“０”を返して終了する。
【００８５】
一方、ステップ１１００９での条件判定結果が「ＹＥＳ」の場合、ファイルシステムプログラム３００４はクローン元ファイル６０１１のデータを返して終了する。以上の処理により、クライアント１００１は、クローン子ファイル６００３またはクローン親ファイル６００４を読み込むことができる
【００８６】
ファイル読み込み動作サブルーチン１１０００のステップ１１０１２により、クローン子ファイルのサイズとクローン元ファイルのサイズが異なって場合でも、正しくデータを読み出すことができる。もし、ファイルシステムプログラム３００４がステップ１１０１２を実施しない場合、クローン子差分ファイル６０１２のデータがディスクブロックを削除することによって“０”に変更されたのか、元々データが無かったのかを判断できない。
【００８７】
図１２は、クローンファイルへのデータ書き込み動作を示すフローチャートである。クライアント１００１のアプリケーションプログラム２００３が、クローン子ファイル６００３やクローン親ファイル６００４へデータを書き込む場合、ファイルアクセスプログラム２００４へファイル書き込みを要求する。そして、ファイルアクセスプログラム２００４は、ファイル書き込み要求をファイルサーバ１００３のファイルサーバプログラム３００３へ送信する（ステップ１２０１）。
【００８８】
ファイルサーバプログラム３００３がファイル書き込み要求を受信した後、ファイルサーバプログラム３００３はファイル書き込み処理をファイルシステムプログラム３００４へ要求する（ステップ１２０２）。
【００８９】
ファイル書き込み要求を受理したファイルシステムプログラム３００４は、データ書き込み対象ファイルがクローン元ファイル６０１１かどうかをフラグ３０１０によって判定する（ステップ１２０３）。ここで、データ書き込み対象ファイルがクローン元ファイル６０１１だった場合（ステップ１２０３：「ＹＥＳ」）、ファイルシステムプログラム３００４は、クローン元ファイル６０１１のｉｎｏｄｅ３００９の親差分ポインタ３０２１に格納されているクローン親差分ファイル６０１０のｉｎｏｄｅ番号を元に、クローン親差分ファイル６０１０のファイルメタデータ３００８を取得する（ステップ１２０４）。
【００９０】
ここで、クローン親ファイル６００４への書き込み時点でクローン親差分ファイル６０１０を作成する場合、ファイルシステムプログラム３００４がステップ１２０４を実行する時に、ファイルクローニングプログラム３００５へステップ９００６の実行を要求する。
【００９１】
次のステップ１３０００では、クローン親差分ファイル６０１０のファイルメタデータ３００８に基づいて動作する。なお、ステップ１３０００の処理は、クローン子差分ファイル６０１２でも、クローン親差分ファイル６０１０でも共通である。一方、ステップ１２０３が「ＮＯ」であった場合は、ファイルシステムプログラム３００４の処理はなく、次のステップ１３０００へ進む。ステップ１３０００によってファイルシステムプログラム３００４が実際にファイルブロック書き込む。本処理は後で詳述する。
【００９２】
最後に、ファイルシステムプログラム３００４がファイルサーバプログラム３００３へファイル書き込み結果を返し、ファイルサーバプログラム３００３はファイルアクセスプログラム２００４へその結果を送信する。そして、ファイルアクセスプログラム２００４は、アプリケーションプログラム２００３へ結果を渡す（ステップ１２０５）。以上の処理により、アプリケーションプログラム２００３から要求されたファイル書き込み処理が実施できる。
【００９３】
図１３は、ファイルシステムプログラム３００４のファイル書き込み動作を示すフローチャートである。ファイルシステムプログラム３００４は、図１２のステップ１２０４で求めたクローン親差分ファイル６０１０のファイルメタデータ３００８のフラグ３０１０か、クローン子差分ファイル６０１２のファイルメタデータ３００８のフラグ３０１０かに、ＧＩフラグまたはＣＬＯＮＥフラグが設定されているか確認する（ステップ１３００２、ステップ１３００３）。
【００９４】
フラグが設定されていない場合、ファイルクローニング機能とは関係が無いファイルのため、通常のファイルとして処理する（ステップ１３００４）。一方、いずれかのフラグが設定されている場合（ステップ１３００３：「ＹＥＳ」）、ファイルシステムプログラム３００４はクローンファイルとして処理する。以下クローン子差分ファイルに基づいて動作を説明する。なお、クローン親差分ファイルを用いる場合も同様の処理となる。
【００９５】
ファイルシステムプログラム３００４は書き込むファイル位置にクローン子差分ファイル６０１２のデータがあるかどうかを判定する（ステップ１３００５）。これは、図７で説明した管理情報を用いる。例えば、クライアント１００１が４ＫＢ目から１０バイト分のデータを書き込む場合、ファイル７００１はディスクブロックを保持しているため、ファイルシステムプログラム３００４は「データ有り」と判定する。
【００９６】
一方、クライアント１００１が２０ＫＢ目から４ＫＢ書き込む場合、ファイル７００１のその部分はホール７０２２であるため、ディスクブロックを保持していない。そのため、ファイルシステムプログラム３００４は「データ無し」と判定する。ステップ１３００５において、ファイルシステムプログラム３００４が「データ無し」と判定した場合、ファイルシステムプログラム３００４は、新たなディスクブロックをクローン子差分ファイル６０１２へ割り当てる（ステップ１３００６）。
【００９７】
そして、図７で説明したように、ファイルシステムプログラム３００４は、割り当てたブロックが既に割り当てられているブロックの次から始まらない場合はデータ管理テーブル３０１１に新たなレコードを作成する（ステップ１３０２０）。
【００９８】
次に、ファイルシステムプログラム３００４はステップ１３０２０で作成した新規レコードをディスクへ書き込むか、または、既にあるレコードを更新する（ステップ１３０２１）。
【００９９】
ステップ１３００６、ステップ１３０２０、ステップ１３０２１の処理により、クローン子差分ファイル６０１２へデータが書き込まれる時にデータ管理テーブル３０１１のレコードを追加していく。そのため、クローン子差分ファイル６０１２の作成時には、データ管理テーブル３０１１のレコードを作成する必要が無い。その結果、クローン子差分ファイル６０１２を高速に作成することが可能となる。
【０１００】
そして、ファイルシステムプログラム３００４は、クローン元ファイル６０１１にデータが有ればメモリへ読み込み、そのデータを書き込みデータで書き換えてから、割り当てたディスクブロックへ書き込む（ステップ１３０２２）。もしクローン元ファイル６０１１にデータが無ければ割り当てたブロックへ書き込みデータをそのまま書き込む。
【０１０１】
一方、ステップ１３００５において、ファイルシステムプログラム３００４が「データ有り」と判定した場合（「ＹＥＳ」に分岐）、ファイルシステムプログラム３００４は書き込みサイズがブロック７０１０のサイズ（図７では４ＫＢ）より小さいか同じかを判定する（ステップ１３００９）。
【０１０２】
書き込みサイズがブロック７０１０のサイズと同じ場合（ステップ１３００９：「一致」）、ファイルシステムプログラム３００４は、書き込みデータをディスクブロックへそのまま書き込む。一方、ステップ１３００９が「不一致」の場合、ファイルシステムプログラム３００４は、クローン元ファイル６０１１のディスク４００５のデータを、一旦、メモリ３００２へ読み込む（ステップ１３０１０）。
【０１０３】
そして、ファイルシステムプログラム３００４は、メモリ３００２へ読み込んだデータの書き込み箇所へデータを書き込む（ステップ１３０１１）。そして、ファイルシステムプログラム３００４は、メモリ３００２にあるデータをディスク４００５へ書き込む（ステップ１３０１２）。
【０１０４】
ファイルシステムプログラム３００４は、ディスクブロック毎に読み書きを処理するため、このようにブロックサイズより書き込みサイズが小さい場合は、ディスクにあるデータをメモリへ読み込み、そのデータを更新してから書き込む必要がある。ただし、書き込みサイズがディスクブロックと同じサイズの場合は読み込む必要はない。
【０１０５】
一方、ステップ１３００５でファイルシステムプログラム３００４が「データ無し」と判定した場合（「ＮＯ」に分岐）、ファイルシステムプログラム３００４は、新たなディスクブロックをクローン子差分ファイル６０１２へ割り当てる（ステップ１３００６）。そして、ファイルシステムプログラム３００４は、割り当てたディスクブロックへデータを書き込み、処理を終える（ステップ１３０１２）。以上の処理により、クライアント１００１は、クローン子ファイル６００３またはクローン親ファイル６００４へデータを書き込むことができる。
【０１０６】
図１４は、クローンファイルのサイズ変更動作を示すフローチャートである。クライアント１００１のアプリケーションプログラム２００３が、クローン子ファイル６００３やクローン親ファイル６００４のサイズを変更する場合、ファイルアクセスプログラム２００４へファイルサイズ変更を要求する。そして、ファイルアクセスプログラム２００４は、ファイルサイズ変更要求をファイルサーバ１００３のファイルサーバプログラム３００３へ送信する（ステップ１４００１）。
【０１０７】
ファイルサーバプログラム３００３がファイルサイズ変更要求を受信した後、ファイルサーバプログラム３００３は、ファイルサイズ変更処理をファイルシステムプログラム３００４へ要求する（ステップ１４００２）。ファイルサイズ変更要求を受理したファイルシステムプログラム３００４は、ファイルサイズ変更対象ファイルがクローン元ファイル６０１１かどうかをフラグ３０１０によって判定する（ステップ１４００３）。
【０１０８】
ここで、ファイルサイズ変更対象ファイルがクローン元ファイル６０１１だった場合（ステップ１４００３：「ＹＥＳ」）は、ステップ１４００４を実行する。ステップ１４００４でファイルシステムプログラム３００４は、クローン元ファイル６０１１のｉｎｏｄｅ３００９の親差分ポインタ３０２１に格納されているクローン親差分ファイル６０１０のｉｎｏｄｅ番号で、クローン親差分ファイル６０１０のファイルメタデータ３００８を取得する。
【０１０９】
次のステップ１５０００では、クローン親差分ファイル６０１０のファイルメタデータ３００８でファイルサイズ更新処理を実行する。なお、ステップ１５０００の処理内容は、クローン子差分ファイル６０１２でも、クローン親差分ファイル６０１０でも共通である。一方、ステップ１４００３の条件判定結果が「ＮＯ」であった場合は、ファイルシステムプログラム３００４の処理はなく、ステップ１５０００へ進む。ステップ１５０００でファイルシステムプログラム３００４が、実際にファイルサイズを変更する。本処理は後で詳述する。
【０１１０】
次に、ファイルシステムプログラム３００４が、ファイルサーバプログラム３００３へファイルサイズ変更結果を通知する。ファイルサーバプログラム３００３は、ファイルアクセスプログラム２００４へ変更結果を送信する。ファイルアクセスプログラム２００４は、アプリケーションプログラム２００３へ変更結果を通知する（ステップ１４００５）。以上の処理により、アプリケーションプログラム２００３から要求されたファイルサイズ変更処理が実施できる。
【０１１１】
図１５は、ファイルシステムプログラム３００４のファイルサイズ変更動作を示すフローチャートである。ファイルシステムプログラム３００４は、図１４のステップ１４００４で求めたクローン親差分ファイル６０１０のファイルメタデータ３００８のフラグ３０１０か、クローン子差分ファイル６０１２のファイルメタデータ３００８のフラグ３０１０かに、ＧＩフラグかＣＬＯＮＥフラグが設定されているかを確認する（ステップ１５００２、ステップ１５００３）。
【０１１２】
フラグが設定されていない場合（ステップ１５００３：「ＮＯ」）、ファイルクローニング機能とは関係が無いファイルのため、通常のファイルとして処理する（ステップ１５００４）。一方、いずれかのフラグが設定されている場合（ステップ１５００３：「ＹＥＳ」）、ファイルシステムプログラム３００４は、クローンファイルとして処理する。以下クローン子差分ファイルへの処理として、動作を説明する。なお、クローン親差分ファイルを用いる場合も同様の処理となる。
【０１１３】
ファイルシステムプログラム３００４は、現在のファイルサイズと変更後のファイルサイズを比較する（ステップ１５００５）。その結果、変更後のファイルサイズが大きい場合（ステップ１５００５：「ＮＯ」）、ファイルシステムプログラム３００４は、変更後のファイルサイズをクローン子差分ファイル６０１２のｉｎｏｄｅ３００９へ設定（ステップ１５００９）して処理を終える。
【０１１４】
一方、変更後のファイルサイズが小さい場合（ステップ１５００５：「ＹＥＳ」）、ファイルシステムプログラム３００４は、切り詰められて（削除されて）不要となるデータブロックを解放する。つまり、ファイルシステムプログラム３００４は、クローン子差分ファイル６０１２のデータ管理テーブル３０１１を設定しなおす（ステップ１５００６）。
【０１１５】
そして、クローン子差分ファイル６０１２の最小サイズ３０１２と変更後のファイルサイズを比較する。変更後ファイルサイズの方が小さい場合（ステップ１５００７：「ＹＥＳ」）、クローン子差分ファイル６０１２の最小サイズ３０１２に、変更後のファイルサイズを設定する（ステップ１５００８）。そして、ファイルシステムプログラム３００４は、変更後のファイルサイズをクローン子差分ファイル６０１２のｉｎｏｄｅ３００９へ設定して処理を終える（ステップ１５００９）。
【０１１６】
一方、ステップ１５００７の条件判定結果が「ＮＯ」の場合（変更後ファイルサイズの方が大きい）、ファイルシステムプログラム３００４は、変更後のファイルサイズをクローン子差分ファイル６０１２のｉｎｏｄｅ３００９へ設定して処理を終える（ステップ１５００９）。以上の処理により、クライアント１００１は、クローン子ファイル６００３またはクローン親ファイル６００４のファイルサイズを変更できる。
【０１１７】
図１６は、クローンファイルの削除動作を示すフローチャートである。クライアント１００１のアプリケーションプログラム２００３が、クローン子ファイル６００３やクローン親ファイル６００４を削除する場合、ファイルアクセスプログラム２００４へファイル削除処理を要求する。そして、ファイルアクセスプログラム２００４は、ファイル削除要求をファイルサーバ１００３のファイルサーバプログラム３００３へ送信する（ステップ１６００１）。ファイルサーバプログラム３００３がファイル削除要求を受信した後、ファイルサーバプログラム３００３はファイル削除処理をファイルシステムプログラム３００４へ要求する（ステップ１６００２）。
【０１１８】
ファイル削除処理要求を受理したファイルシステムプログラム３００４は、ファイルがクローン元ファイル６０１１かどうかをフラグ３０１０によって判定する（ステップ１６００３）。ファイルがクローン元ファイル６０１１だった場合（ステップ１６００３：「ＹＥＳ」）は、ステップ１６００４を実行する。ステップ１６００４でファイルシステムプログラム３００４は、クローン元ファイル６０１１のｉｎｏｄｅ３００９の親差分ポインタ３０２１に格納されているクローン親差分ファイル６０１０のｉｎｏｄｅ番号で、クローン親差分ファイル６０１０のファイルメタデータ３００８を取得する。
【０１１９】
次のステップ１７０００では、クローン親差分ファイル６０１０のファイルメタデータ３００８に基づいてファイル削除動作を実行する。なお、ステップ１７０００のファイル削除の処理内容は、クローン子差分ファイル６０１２でも、クローン親差分ファイル６０１０でも共通である。
【０１２０】
一方、ステップ１６００３の条件判定結果が「ＮＯ」であった場合は、ファイルシステムプログラム３００４の処理はなく、次のステップへ進む。ステップ１７０００によってファイルシステムプログラム３００４が実際にファイルを削除する。本処理は後で詳述する。
【０１２１】
最後に、ファイルシステムプログラム３００４がファイルサーバプログラム３００３へファイル削除結果を返し、ファイルサーバプログラム３００３は、ファイルアクセスプログラム２００４へその結果を送信する。
【０１２２】
そして、ファイルアクセスプログラム２００４は、アプリケーションプログラム２００３へ削除結果を通知（ステップ１６００５）する。以上の処理により、アプリケーションプログラム２００３から要求されたファイル削除処理が実施できる。
【０１２３】
図１７は、ファイルシステムプログラム３００４のクローンファイル削除動作を示すフローチャートである。ファイルシステムプログラム３００４は、図１６のステップ１４００４で求めたクローン親差分ファイル６０１０のファイルメタデータ３００８か、クローン子差分ファイル６０１２のファイルメタデータ３００８のフラグ３０１０にＧＩフラグかＣＬＯＮＥフラグが設定されているか確認する（ステップ１７００２、ステップ１７００３）。
【０１２４】
フラグが設定されていない場合、ファイルクローニング機能とは関係が無いファイルのため、通常のファイルとして処理する（ステップ１７００４）。一方、いずれかのフラグが設定されている場合（ステップ１７００３：「ＹＥＳ」）、ファイルシステムプログラム３００４はクローンファイルとして処理する。以下、クローン子差分ファイルの削除処理としての動作を説明する。なお、クローン親差分ファイルの削除処理も同じ動作である。
【０１２５】
ファイルシステムプログラム３００４は、ファイルがクローン子差分ファイルかクローン元ファイルかどうかをフラグ３０１０に設定されているフラグに基づいて判定する。フラグ３０１０にＧＩフラグが設定されている場合（ステップ１７００５：「ＮＯ」）、ファイルシステムプログラム３００４は、クローン親差分ファイル６０１０を削除しクローン元ファイル６０１１の名前を不可視に変更する（ステップ１７０１０）。
【０１２６】
不可視ファイルに変更するため、例えば、ファイルシステムプログラム３００４が、クローン元ファイル６０１１のファイル名の先頭データを“．”やＮＵＬＬ（空白）へ変更する。この変更で、クライアント１００１からはファイルが削除されたように見える。しかし、クローン子ファイル６００３はクローン元ファイル６０１１を利用するため、クローン元ファイル６０１１は削除できない。不可視ファイルを利用すると、この問題が解決できる。
【０１２７】
一方、フラグ３０１０にＣＬＯＮＥフラグが設定されている場合（ステップ１７００５：「ＹＥＳ」）、ファイルシステムプログラム３００４は、クローン子差分ファイル６０１２を削除する。そして、ファイルシステムプログラム３００４は、クローン元ファイル６０１１の参照カウンタ３０１３を１つ減じる（ステップ１７００６）。
【０１２８】
そして、ファイルシステムプログラム３００４は、参照カウント３０１３が“０”であるかを判定する。参照カウント３０１３が“０”でない場合（ステップ１７００７：「ＮＯ」）、ファイルシステムプログラム３００４は削除処理を終了する。一方、参照カウント３０１３が“０”の場合（ステップ１７００７：「ＹＥＳ」）、ファイルシステムプログラム３００４はクローン元ファイル６０１１が不可視ファイルかどうかを調べる（ステップ１７００８）。
【０１２９】
クローン元ファイル６０１１が不可視ファイルではない場合（ステップ１７００８：「ＮＯ」）、ファイルシステムプログラム３００４は削除処理を終了する。一方、クローン元ファイル６０１１が不可視ファイルの場合（ステップ１７００８：「ＹＥＳ」）、ファイルシステムプログラム３００４は、クローン元ファイル６０１１を削除し（ステップ１７００９）、ファイル削除処理を終了する。
【０１３０】
このように、ファイルシステムプログラム３００４が参照カウンタ３０１３と不可視ファイルを利用することで、図６に示したクローンファイルのファイル関係を維持したまま、クローン子ファイル６００３やクローン親ファイル６００４を削除できる。
【０１３１】
図１８は、管理端末１００５の管理プログラム５００２が管理者やエンドユーザへ提供する管理ＧＵＩ（Graphic  User  Interface）１８００１の例である。管理ＧＵＩ１８００１には、クローン管理ビュー１８００２とクローン作成ビュー１８０１１がある。
【０１３２】
クローン管理ビュー１８００２には、管理者やエンドユーザが表示したいクローンファイルのパスを入力する入力ボックス１８００３があり、その入力情報の送信ボタンがある。管理者やエンドユーザが、入力ボックス１８００３へクローンファイルのパスを入力し、送信ボタンを押すと、クローンツリー１８００４にクローン関係が表示される。クローンツリー１８００４には、図７で説明したクローンファイルのファイル関係が表示される。
【０１３３】
すなわち、クローン元ファイル６０１１のファイル名を示すボックス１８００５、クローン親差分ファイルのファイル名を示すボックス１８００８と、クローン子差分ファイルのファイル名を示すボックス１８００６及び１８００７が表示される。そして、ボックス１８００６と１８００７の右横に、クローン子差分ファイル６０１２に書き込まれた差分の割合を示す分化率（differentiation  ratio）を示すフィールド１８００９と１８０１０が表示される。なお、図１８は２つのクローン子ファイル６０１２が作成されている例を示したが、１ないし３つ以上でも構わない。
【０１３４】
また、管理者やエンドユーザがクローンを作成する場合、管理者やエンドユーザがクローン作成ビュー１８０１１の入力ボックス１８０１２と１８０１３へ、クローン元ファイル６０１１とするファイルのパスと作成数を入力する。そして、管理者やエンドユーザが送信ボタンを押すと、クローンファイルの作成が実行される。最後に、その実行結果がボックス１８０１４に表示される。
【０１３５】
以上に示した第一の実施例に依れば、ファイルシステムプログラムがクローンファイルを作成する際にファイルメタデータ３００８のみ作成すれば良い。従って、ディスクブロックを管理するデータ管理テーブルの作成とその初期化が必要ないので、クローンファイルを高速に作成できる。
【実施例２】
【０１３６】
第二の実施形態では、クローン子ファイル６００３をクローン元ファイル６０１１として作成する。つまり、クローン子ファイル６００３が入れ子になって作成される（ネスト構造）場合について説明する。本実施形態により、任意のタイミングでクローン子ファイルを自由に作成できる。
【０１３７】
図１９は、クローンファイルの階層化構成の一例を示す図である。図１９のクローン元ファイル６０１１は、図６のクローン元ファイルと同等である。クローン子差分ファイル１  １９００２は、クローン元ファイル６０１１を指す。前述の通り、クローン子差分ファイル１  １９００２が作成された後のクローン子ファイルへの更新データは、クローン子差分ファイル１  １９００２に保存される。
【０１３８】
一方、クローン親ファイルへの更新データは、クローン親差分ファイル１  １９００４へ保存される。なお、本実施例におけるクローン元ファイル６０１１は、最新のクローン親差分ファイルを指示す情報をファイルメタデータへ保持する。例えば、ここで、エンドユーザが、クローン子ファイルに対してクローン子ファイルを作成する。この場合、クローン子差分ファイル１  １９００２がクローン元ファイルとなる。そして、クローン子差分ファイル２  １９００３が作成されると同時に、クローン親差分ファイル２  １９００５が作成される。
【０１３９】
クローン子ファイルのクローンが作成された後、クローン子ファイルへの書き込みがあった場合、クローン子差分ファイル２  １９００３へ差分データが保存される。一方、クローン親ファイルへ書き込みがあった場合、クローン親差分ファイル２  １９００５へ差分データが保存される。また、クローン元ファイル６０１１は、ｉｎｏｄｅ３００９に格納されたソースポインタ３０２０と親差分ポインタ３０２１により、最新のクローン親差分ファイルであるクローン親差分ファイル２  １９００５との関係を指示できる。
【０１４０】
以上のように、クローン子ファイルが階層的に入れ子になる場合、クローン親ファイルも入れ子になる。この方法により、クローン子ファイルへの書き込み差分データとクローン親ファイルへの書き込み差分データを保持することが可能になる。
【０１４１】
なお、図１９では、クローン子ファイルに対するクローン子ファイルを１つのみ記載しているが、クローン子ファイルが２つ以上のクローン子ファイルを保持してよい。つまり、クローン子差分ファイル１  １９００２はクローン子差分ファイル２  １９００３の他にクローン子差分ファイル３を持つことができる。本実施例は、クローン子差分ファイルの数や種類を限定するものではない。
【０１４２】
図２０は、クローンファイルの階層化構成において、クローンファイルの読み込み動作を示すフローチャートである。クローンファイルの読み込みの基本フローは、図１０で説明した。ここでは、クローンファイルの階層化構成の動作フローの特徴について説明する。
【０１４３】
アプリケーションプログラム２００３がクローン子ファイル６００３やクローン親ファイル６００４を読み込む場合、処理１０００３までは図１０と同じである。処理１０００３において、読み込み対象ファイルがクローン元ファイルだった場合（ステップ１０００３：「ＹＥＳ」）、ファイルシステムプログラム３００４は、読み込み対象ファイルに対する最新クローン親差分ファイルのファイルメタデータ３００８を取得する。
【０１４４】
そして、ファイルシステムプログラム３００４は、読み込み対象のクローン親差分ファイルのファイルメタデータとクローン元ファイルのファイルメタデータを用いて、処理２１０００を実行する。つまり、図１９の場合、アプリケーションプログラム２００３はクローン親ファイルを読み出すために、クローン元ファイル６０１１のファイルメタデータ３００８が指示しているクローン親差分ファイル２  １９００５（最新のクローン親差分ファイル）のファイルメタデータ３００８を取得する。
【０１４５】
一方、読み込み対象ファイルがクローン元ファイルでは無かった場合（ステップ１０００３：「ＮＯ」）、ファイルシステムプログラム３００４は、大本（ＧＩファイル）のクローン元ファイル（以降、ルートのクローン元ファイルと呼ぶ）のファイルメタデータを取得するため、ステップ２０００５とステップ２０００６を実行する。
【０１４６】
ルートのクローン元ファイルのファイルメタデータを取得できる場合（ステップ２０００６：「ＹＥＳ」）、ファイルシステムプログラム３００４は、読み込み対象ファイルのファイルメタデータとルートのクローン元ファイルのファイルメタデータを用いて、図２１の処理２１０００を実行する。
【０１４７】
つまり、図１９の場合、ファイルシステムプログラム３００４は、クローン子差分ファイル２  １９００３が持つクローン元ファイルの情報を辿り、クローン子差分ファイル１
１９００２のファイルメタデータを取得する。さらに、ファイルシステムプログラム３００４は、クローン子差分ファイル１  １９００２のファイルメタデータからクローン元ファイル６０１１のファイルメタデータを取得する。そして、ファイルシステムプログラム３００４は、読み込み対象のクローン親差分ファイルのファイルメタデータとクローン元ファイルのファイルメタデータを用いて、図２１の処理２１０００を実行する。
【０１４８】
以上のように、クローンファイルの階層化構成では、ファイルシステムプログラム３００４は、最新のクローン親差分ファイルまたはクローン子差分ファイルのファイルメタデータを用いて、読み出し処理を実行する。そのために、ファイルシステムプログラム３００４は、入れ子になっているクローン子差分ファイルを辿る必要がある。
【０１４９】
図２１は、クローンファイルの階層化構成におけるファイル読み込み処理フローを示す。クローンファイルの階層化構成では、ファイル読み込み処理の入れ子構造を辿っていく。例えば、図１９の場合、クローン子差分ファイル２  １９００３を読み出す場合、ファイルシステムプログラム３００４はクローン子差分ファイル２  １９００３に更新差分データがあるかどうか調べる。そして、更新差分データが無い場合、ファイルシステムプログラム３００４はクローン子差分ファイル１  １９００２の更新差分データを調べる。
【０１５０】
もしルートのクローン元ファイルまで更新差分データが無い場合、ファイルシステムプログラム３００４は、“０”をアプリケーションプログラムへ送信する。もしルートのクローン元ファイルまでに更新差分データがあるならば、ファイルシステムプログラム３００４は、更新差分データをアプリケーションプログラムへ送信する。
【０１５１】
図２１では、まず、ファイルシステムプログラム３００４は、ステップ２１０１０において、最新のクローン親差分ファイルまたはクローン子差分ファイルのフラグ３０１０を確認する。そして、クローンファイルに関するファイルである場合（ステップ１１００３：「ＹＥＳ」）、ファイルシステムプログラム３００４は、そのファイルがデータブロックを持つかどうかを調べる（ステップ１１００５、１１００６）。
【０１５２】
そのファイルがデータブロックを持たない場合（ステップ１１００６：「ＮＯ」）、ファイルシステムプログラム３００４は、クローン元ファイルのファイルメタデータを取得し、そのクローン元ファイルがデータを持つかどうかを調べる（ステップ２１００１）。
【０１５３】
データブロックを持つ場合（ステップ２１００２：「ＹＥＳ」）、ファイルシステムプログラム３００４は、そのデータブロックを読み出してアプリケーションプログラムへ送信する（ステップ１１００７）。一方、データブロックが無い場合（ステップ２１００２：「ＮＯ」）、ファイルシステムプログラム３００４はそのファイルがルートのクローン元ファイルかどうかをフラグ３０１０によって判断する（ステップ２１００３）。
【０１５４】
ルートのクローン元ファイルの場合、ファイルシステムプログラム３００４はステップ１１０１２以降の処理を実行する。一方、ルートのクローン元ファイルでは無い場合（ステップ２１００３：「ＮＯ」）、ファイルシステムプログラム３００４は入れ子構造を辿るためにステップ２１００１へ戻り、処理を続ける。
【０１５５】
以上のように、ファイルシステムプログラム３００４がクローンファイルの階層化構成を辿り、データブロックがある場合はそのデータをアプリケーションプログラム２００３へ送信し、無い場合は“０”をアプリケーションプログラム２００３へ送信する。
【０１５６】
図２２は、クローンファイルの階層化構成においてクローンファイルの書き込み動作を示すフローチャートである。クローンファイルの書き込みの基本フローは、図１２で説明した。ここでは、クローンファイルの階層化構成の動作フローについて差分を説明する。
【０１５７】
アプリケーションプログラム２００３が、クローン子ファイル６００３やクローン親ファイル６００４へデータを書き込む場合、処理１２０２までは図１２と同じである。処理１２０２において、書き込み対象ファイルがクローン元ファイルだった場合（ステップ１２０３：「ＹＥＳ」）、ファイルシステムプログラム３００４は、書き込み込み対象ファイルに対する最新クローン親差分ファイルのファイルメタデータ３００８を取得する。
【０１５８】
そして、ファイルシステムプログラム３００４は、書き込み対象のクローン親差分ファイルのファイルメタデータ３００８とクローン元ファイルのファイルメタデータ３００８を用いて処理２３０００を実行する。つまり、図１９の場合、アプリケーションプログラム２００３は、クローン親ファイルへデータを書き込むために、クローン元ファイル６０１１のファイルメタデータ３００８が指示しているクローン親差分ファイル２  １９００５（最新クローン親差分ファイル）のファイルメタデータ３００８を取得する。
【０１５９】
一方、書き込み対象ファイルがクローン元ファイルでは無かった場合（ステップ１２０３：「ＮＯ」）、ファイルシステムプログラム３００４は、ルートのクローン元ファイルのファイルメタデータを取得するため、ステップ２２００１とステップ２２００２を実行する。
【０１６０】
ルートのクローン元ファイルのファイルメタデータを取得できる場合（ステップ２２００２：「ＹＥＳ」）、ファイルシステムプログラム３００４は読み込み対象ファイルのファイルメタデータとルートのクローン元ファイルのファイルメタデータを用いて処理２１０００を実行する。
【０１６１】
つまり、図１９の場合、ファイルシステムプログラム３００４は、クローン子差分ファイル２  １９００３が持つクローン元ファイルの情報を辿り、クローン子差分ファイル１
１９００２のファイルメタデータを取得する。さらに、ファイルシステムプログラム３００４は、クローン子差分ファイル１  １９００２のファイルメタデータからクローン元ファイル６０１１のファイルメタデータを取得する。そして、ファイルシステムプログラム３００４は、書き込み対象のクローン親差分ファイルのファイルメタデータとクローン元ファイルのファイルメタデータを用いて処理２３０００を実行する。
【０１６２】
以上のように、クローンファイルの階層化構成では、ファイルシステムプログラム３００４は最新のクローン親差分ファイルまたはクローン子差分ファイルを用いて処理する。そのため、ファイルシステムプログラム３００４は入れ子になっているクローン子差分ファイルを辿る必要がある。
【０１６３】
図２３は、クローンファイルの階層化構成におけるファイル書き込み処理フローを示す。クローンファイルの階層化構成では入れ子構造を辿っていく。例えば、図１９の場合、クローン子差分ファイル２  １９００３へデータを書き出す場合、ファイルシステムプログラム３００４は、クローン子差分ファイル２  １９００３に更新差分データがあるかどうか調べる。そして、更新差分データが無い場合、ファイルシステムプログラム３００４は、クローン子差分ファイル１  １９００２の更新差分データを調べる。
【０１６４】
もし、ルートのクローン元ファイルまで更新差分データが無い場合、ファイルシステムプログラム３００４は、何もデータが書き込まれていないデータブロックへのデータ書き込みとして処理する。もし、ルートのクローン元ファイルまでに更新差分データがあるならば、ファイルシステムプログラム３００４は、そのデータの更新処理を実行する。
【０１６５】
図２３では、まず、ファイルシステムプログラム３００４は、ステップ２３０１０で最新のクローン親差分ファイルまたはクローン子差分ファイルのフラグ３０１０を確認する。そして、クローンファイルに関するファイルである場合（ステップ１３００３：「Ｙｅｓ」）、ファイルシステムプログラム３００４は、そのファイルがデータブロックを持つかどうかを調べる（ステップ１３００５）。
【０１６６】
そのファイルがデータブロックを持たない場合（ステップ１３００５：「ＮＯ」）、ファイルシステムプログラム３００４は、クローン元ファイルのファイルメタデータを取得し、そのクローン元ファイルがルートのクローン元ファイルかどうかを調べる（ステップ２３００１）。
【０１６７】
ルートのクローン元ファイルの場合（ステップ２３００１：「ＹＥＳ」）、ファイルシステムプログラム３００４は最新のクローン親差分ファイルまたは最新のクローン子差分ファイルへデータブロックを新たに割り当てて書き込み処理を行う（ステップ１３００６以降の処理）。
【０１６８】
一方、クローン元ファイルが、ルートのクローン元ファイルでは無い場合（ステップ２３００１：「ＮＯ」）、ファイルシステムプログラム３００４は、そのファイルのクローン元ファイルのファイルメタデータを取得し、そのファイルがデータを持っているかどうかを調べる（ステップ２３００２、ステップ１３００５）。ファイルがデータブロックを持つ場合（ステップ１３００５：「ＹＥＳ」）、ファイルシステムプログラム３００４は、処理１３００９以降を実行する。
【０１６９】
以上のように、ファイルシステムプログラム３００４がクローンファイルの階層化構成を辿り、データブロックがある場合はそのデータを更新する。一方、データブロックが無い場合は、ファイルシステムプログラム３００４が新たにデータブロックを割り当てる。
以上説明した本実施例によって、クローンファイルを任意の時間で階層的に作成することが可能となる。
【実施例３】
【０１７０】
第三の実施形態は、クライアントからコピープロシージャ（ファイル全体の複製）が発行された場合、データのコピーの代わりにファイルクローニング機能がクローンファイルを作成する例である。このファイルクローニング機能がクローンファイルを作成することにより、コピー時間を大幅に削減できる。なお、コピープロシージャは、例えば、ＣＩＦＳ（Common  Internet  File  System）やＮＦＳ（Network  File  System）などによってサポートされている。
【０１７１】
図２４は、管理端末１００５の管理プログラム５００２が管理者へ提供する管理ＧＵＩ１８００１の例を示す図である。図２４（本実施形態）と図１８（第二の実施形態）との差異は、コピーモードを指定するボックス２４００１があることである。
【０１７２】
管理者が、管理ＧＵＩ１８００１を用いて、コピーモード２４００１のチェックボックス２４００２を設定すると、コピープロシージャによるファイルのコピーを契機に、ファイルシステムプログラム３００４はクローンファイルを作成する。そのため、コピーモードのチェックボックス２４００１が設定されると、管理端末１００５の管理プログラム５００２は、ファイルサーバ１００３のファイルシステムプログラム３００４へコピーモードが設定されたことを通知する。実際の処理は図２５を用いて説明する。
【０１７３】
図２５は、ファイルシステムプログラム３００４がコピープロシージャを処理する処理フローを示す。エンドユーザ（クライアント）が用いるアプリケーションプログラム２００３は、コピープロシージャを通してファイルサーバ１００３のファイルをコピーする。そして、ファイルアクセスプログラム２００４はコピープロシージャを用いてファイルサーバへコピー要求を送信する（ステップ２５００１）。
【０１７４】
コピープロシージャにはコピー元のファイル名とコピー先のファイル名が含まれており、ファイルサーバプログラム３００３は、それらのファイル名に基づいてファイルのコピーを実施する。コピー要求を受信したファイルサーバプログラム３００３はコピーモードを調べる（ステップ２５００２）。
【０１７５】
コピーモードが“０”（つまり、未設定）の場合（ステップ２５００３：「０」）、ファイルサーバプログラム３００３は通常のコピー処理を行う（ステップ２５００６）。
【０１７６】
一方、コピーモードが“１”（つまり、設定）の場合（ステップ２５００３：「１」）、ファイルサーバプログラム３００３は、ファイルクローニングプログラム３００５へクローン子ファイルの作成を要求する（ステップ２５００４）。
【０１７７】
そして、ファイルクローニングプログラム３００５は、クローン子ファイルのメタデータを作成し（ステップ９００６）、クローン元ファイルにフラグを設定し参照カウンタを１つ増加させる（ステップ９００７）。ステップ９００６とステップ９００７の処理は、図９で説明した処理と同じ動作である。
【０１７８】
最後に、ステップ２５００５でファイルクローニングプログラム３００５は、クローンファイルの作成結果をファイルサーバプログラム３００３へ通知する。そして、ファイルサーバプログラム３００３はクライアントへ前記作成結果を通知する（ステップ２５００５）。
【０１７９】
以上のように、クライアントがコピープロシージャを用いてファイルコピーを行う場合、ファイルサーバが全データをコピーする必要がなく、一部のデータで構成したクローンファイルを作成することでコピー時間を大幅に削減できる。
【産業上の利用可能性】
【０１８０】
本発明は、大型コンピュータ、サーバやパーソナルコンピュータなどの情報処理装置、ストレージシステムやＨＤＤレコーダなどの情報・映像記憶装置、携帯電話などの通信装置に適用できる。
【符号の説明】
【０１８１】
１００１  クライアント
１００２  ネットワークスイッチ
１００３  ファイルサーバ
１００４  ディスクストレージ
１００５  管理端末
２００１  ＣＰＵ
２００２  メモリ
２００３  アプリケーションプログラム
２００４  ファイルアクセスプログラム
２００５  ネットワークインタフェース
３００１  ＣＰＵ
３０２０  ネットワークインタフェース
３０２１  ストレージインタフェース
３００２  メモリ
３００３  ファイルサーバプログラム
３００４  ファイルシステムプログラム
３００５  ファイルクローニングプログラム
３００６  ファイルクローニング管理プログラム
３００７  ファイルシステム管理データ
３００８  ファイルメタデータ
３００９  ｉｎｏｄｅ
３０１０  フラグ
３０１１  データ管理テーブル
３０１２  最小サイズ
３０１３  参照カウンタ
３０２０  ソースポインタ
３０２１  親差分ポインタ
４００１  ＣＰＵ
４００２  メモリ
４００３  ストレージ管理プログラム
４００４  ディスクコントローラ
４００５  ディスク
４００６  ストレージインタフェース
５００１  ＣＰＵ
５００２  メモリ
５００２  管理プログラム
５００３  管理インタフェース
５００４  ネットワークインタフェース
６００１、６００２  データブロック
６００３  クローン子ファイル
６００４  クローン親ファイル
６０１０  クローン親差分ファイル
６０１１  クローン元ファイル
６０１２  クローン子差分ファイル
７００１  ファイル
７００２  ファイルオフセット
７００３  開始ブロック位置
７００４  ブロック長
７０１０  ブロック
７０２１  ファイルのデータ領域
７０２２  ホール
８００１、８００２  書き込み
８００３、８００４  読み出し
１８００１  管理ＧＵＩ
１８００２  クローン管理ビュー
１８０１１  クローン作成ビュー
１８００３  クローンファイルパス入力ボックス
１８００４  クローンツリー
１８００５  クローン元ファイル表示ボックス
１８００８  クローン親差分ファイル表示ボックス
１８００６、１８００７  クローン子差分ファイル表示ボックス
１８００９、１８０１０  分化率
１８０１１  クローン作成ビュー
１８０１２  ファイルパス
１８０１３  ファイル作成数
１８０１４  実行結果
１９００２  クローン子差分ファイル１
１９００４  クローン親差分ファイル１
１９００３  クローン子差分ファイル２
１９００５  クローン親差分ファイル２
２４００１  コピーモード
２４００２  チェックボックス
【図１】
0005775177.tif 000002
【図２】
0005775177.tif 000003
【図３】
0005775177.tif 000004
【図４】
0005775177.tif 000005
【図５】
0005775177.tif 000006
【図６】
0005775177.tif 000007
【図７】
0005775177.tif 000008
【図８】
0005775177.tif 000009
【図９】
0005775177.tif 000010
【図１０】
0005775177.tif 000011
【図１１】
0005775177.tif 000012
【図１２】
0005775177.tif 000013
【図１３】
0005775177.tif 000014
【図１４】
0005775177.tif 000015
【図１５】
0005775177.tif 000016
【図１６】
0005775177.tif 000017
【図１７】
0005775177.tif 000018
【図１８】
0005775177.tif 000019
【図１９】
0005775177.tif 000020
【図２０】
0005775177.tif 000021
【図２１】
0005775177.tif 000022
【図２２】
0005775177.tif 000023
【図２３】
0005775177.tif 000024
【図２４】
0005775177.tif 000025
【図２５】
0005775177.tif 000026