(57)【特許請求の範囲】
【請求項１】
ファイルストレージ装置であって、
それぞれ管理情報と実データを備える複数のファイルを管理するコントローラと、
前記複数のファイルを格納するボリュームを構成する記憶媒体を備え、
前記ボリュームは第１のディレクトリ及び第２のディレクトリを備え、
前記第１のディレクトリには第１のファイル及び第２のファイルが格納され、
前記コントローラは
前記第２のディレクトリに第３のファイルを作成し、
前記第３のファイルの実データの格納領域として前記第２のファイルの実データ格納領域を示す様に、前記第３のファイルの管理情報を設定し、
計算機から前記第２のファイルへのリードアクセスを受信した際に前記第３のファイルを参照する様に、前記第２のファイルの管理情報を設定するとともに、前記第２のファイルの管理情報から、前記第２のファイルの実データ格納領域を示す管理情報を削除し、
前記第１のファイルの実データと前記第３のファイルの実データのサイズを比較し、
前記サイズ比較の結果データサイズが同一であった場合には、前記第１のファイルの実データと前記第３のファイルの実データのバイナリを比較し、
前記バイナリ比較の結果バイナリが同一だった場合には、前記計算機から前記第１のファイルへのリードアクセスを受信した際に前記第３のファイルを参照する様に前記第１のファイルの管理情報を設定するとともに、前記第１のファイルの管理情報から前記第１のファイルの実データ格納領域を示す管理情報を削除する
ことを特徴とするファイルストレージ装置。
【請求項２】
前記第１のファイルへのライト要求を受信した場合には、
前記コントローラは、
前記第１のファイルに更新データを格納し、
前記更新データでない前記第１のファイルへのリード要求を受信した場合には、前記第３のファイルを参照し前記第３のファイルの実データを読み出し、
前記更新データについて前記第１のファイルへのリード要求を受信した場合には、前記第１のファイルが備える前記更新データを読み出す
ことを特徴とする請求項１のファイルストレージ装置。
【請求項３】
前記第２のディレクトリはインデックスディレクトリであって、
前記第２のディレクトリに格納されるファイルのサイズをディレクトリ名とする第３のディレクトリを備え、
前記第３のファイルは前記第３のファイルのサイズをディレクトリ名とする第３のディレクトリに作成され、
前記第３のファイルの実データのサイズと前記第１のファイルの実データのサイズの比較には、前記コントローラは前記第３のファイルの実データのサイズに代えて、前記第３のディレクトリ名に記載のサイズと比較をする
ことを特徴とする請求項１記載のファイルストレージ装置。
【請求項４】
前記サイズ比較の結果データサイズが異なった場合には、
前記コントローラは、
前記第２のディレクトリに前記第１のファイルのサイズをディレクトリ名とする第４のディレクトリを作成し、
前記第４のディレクトリに第４のファイルを作成し、
前記第４のファイルの実データの格納領域として前記第１のファイルの実データ格納領域を示す様に、前記第４のファイルの管理情報を設定し、
前記計算機から前記第１のファイルへのリードアクセスを受信した際に前記第４のファイルを参照する様に、前記第１のファイルの管理情報を設定するとともに、前記第１のファイルの管理情報から、前記第１のファイルの実データ格納領域を示す管理情報を削除する、
ことを特徴とする請求項３記載のファイルストレージ装置。
【請求項５】
前記バイナリ比較の結果バイナリが異なった場合には、
前記コントローラは、
前記第３のディレクトリに第４のファイルを作成し、
前記第４のファイルの実データの格納領域として前記第１のファイルの実データ格納領域を示す様に、前記第４のファイルの管理情報を設定し、
前記計算機から前記第１のファイルへのリードアクセスを受信した際に前記第４のファイルを参照する様に前記第１のファイルの管理情報を設定するとともに、前記第１のファイルの管理情報から、前記第１のファイルの実データ格納領域を示す管理情報を削除する、
ことを特徴とする請求項３記載のファイルストレージ装置。
【請求項６】
前記バイナリ比較時に、
前記コントローラは、
前記第１のファイルおよび前記第３のファイルのハッシュ値を計算し、
前記第３のファイルを前記第３のファイルのハッシュ値含む名前に変更し、
前記第４のファイルを前記第１のファイルのハッシュ値含む名前で作成する
ことを特徴とする請求項５記載のファイルストレージ装置。
【請求項７】
前記サイズ比較の結果データサイズが同一であった場合、
前記コントローラは、
前記第３のディレクトリに格納されるファイルの数が閾値以上であるかを調査し、
前記調査の結果前記第３のディレクトリに格納されるファイルの数が閾値以上であった場合には、
前記第３のディレクトリに格納されるファイルと前記第１のファイルとでハッシュ値を比較し、
前記ハッシュ値比較の結果前記第１のファイルとハッシュ値が同じファイルについて、
前記第１のファイルとバイナリ比較をする
ことを特徴とする請求項３記載のファイルストレージ装置。
【請求項８】
前記ハッシュ値比較は、計算した前記第１のファイルのハッシュ値と前記第３のディレクトリに格納されるファイルの名前に含まれるハッシュ値を比較することで行う
ことを特徴とする請求項７記載のファイルストレージ装置。
【請求項９】
前記コントローラは
前記第３のファイルが前記第１のディレクトリに格納される前記複数ファイルから参照されている数をカウントし、
前記被参照数が０になった場合には、
前記コントローラは前記第３のファイルを削除し、
前記第３のファイルを削除した結果前記第３のディレクトリにファイルがなくなった場合、
前記コントローラは、前記第３のディレクトリを削除する
ことを特徴とする請求項３記載のファイルストレージ装置。
【請求項１０】
前記コントローラは
前記第１のファイルが備える前記更新データについて、前記第３のファイルが備える前記実データに対する前記更新データの割合を観測し、
前記観測した割合が閾値以上になった場合、前記第３のファイルが備える前記実データのうち前記更新データ以外の部分について、前記第３のファイルから前記第１のファイルにコピーし、前記第１のファイルの管理情報から前記第３のファイルを参照する旨を削除する
ことを特徴とする請求項２記載のファイルストレージ装置。
【請求項１１】
前記第１のディレクトリに格納されるファイルのうち、データの大きいファイルから、
前記サイズ比較を行うことを特徴とする請求項１記載のファイルストレージ装置。
【請求項１２】
前記第２のディレクトリは隠しディレクトリであることを特徴とする請求項１記載のファイルストレージ装置。
【請求項１３】
ファイルストレージ装置のシングルインスタンス化方法であって、
前記ファイルストレージ装置は、
それぞれ管理情報と実データを備える複数のファイルを管理するコントローラと、前記複数のファイルを格納するボリュームを構成する記憶媒体を備え、
前記ボリュームは第１のディレクトリ及び第２のディレクトリを備え、
前記第１のディレクトリには第１のファイル及び第２のファイルが格納され、
前記コントローラは
前記第２のディレクトリに、第３のファイルを作成し、前記第３のファイルの実データの格納領域として前記第２のファイルの実データ格納領域を示す様に、前記第３のファイルの管理情報を設定し、
計算機から前記第２のファイルへのリードアクセスを受信した際に前記第３のファイルを参照する様に前記第２のファイルの管理情報を設定するとともに、前記第２のファイルの管理情報から、前記第２のファイルの実データ格納領域を示す管理情報を削除し、
前記第１のファイルの実データと前記第３のファイルの実データのサイズを比較し、
前記サイズ比較の結果データサイズが同一であった場合には、前記第１のファイルの実データと前記第３のファイルの実データのバイナリを比較し、
前記バイナリ比較の結果バイナリが同一だった場合には、前記計算機から前記第１のファイルへのリードアクセスを受信した際に前記第３のファイルを参照する様に前記第１のファイルの管理情報を設定するとともに、前記第１のファイルの管理情報から前記第１のファイルの実データ格納領域を示す管理情報を削除する
ことを特徴とするシングルインスタンス化方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ファイルストレージ装置及びその管理方法の技術に関するものである。
【背景技術】
【０００２】
ＮＡＳ（Network  Attached  Storage）は、ネットワークを介して多数のコンピュータがファイルデータを共有するのに相応しいストレージデバイスである。現在では、ファイルデータストレージの多くがＮＡＳデバイスを利用している。
【０００３】
高性能なプライマリーファイルサーバに格納されるデータ量が急増している。それに伴い、ファイルサーバへ接続するディスク数やサイズも増加しており、ディスクの購入や維持にかかるコストが増加している。ディスクにかかるコストを削減するため、プライマリーファイルサーバへ保存したデータ量を削減する重複排除技術が注目されている。重複排除技術は主に、ブロック単位で重複排除を行うブロックレベル重複排除と、ファイル単位で重複排除を行うファイルレベル重複排除に分類でき、ファイルレベル重複排除技術は特にシングルインスタンス技術と呼ばれる。
【０００４】
シングルインスタンス技術は、ファイルのデータ全体が一致するファイル群のデータを1つにまとめて、物理的なデータ容量を削減する技術である。シングルインスタンス技術は、ファイル毎に処理を行うためブロックレベル重複排除技術と比較して負荷が低く、プライマリーファイルサーバに適用しやすい。シングルインスタンス技術の一般的な実現方式は特許文献1に記載されている。シングルインスタンス化可能なファイルの重複判定は、一般的にはファイルのハッシュ値を計算し、ハッシュ値比較の結果、一致したファイルに関してさらにバイナリ比較を行うことで判定される。
【０００５】
また、よりサイズの大きいファイルをシングルインスタンス化した方が、データ容量削減効果が大きいため、重複判定の対象となるファイルを、一定以上のサイズのファイルに限定して判定を行う技術についても特許文献１に記載がある
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】米国特許6,477,544号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
しかし、何れの技術においても、重複判定はハッシュ値比較を用いており、ハッシュ値比較によるファイル重複検出は、対象ファイルの全ハッシュ値を計算する必要があり、ハッシュ値計算のためにはファイルの実データをリードしなければならない。
【０００８】
つまり、重複していないファイルに関してもファイル重複検出のためにファイルの実データをリードする必要があり、膨大な数のファイル群から一致するファイルを検出してシングルインスタンス化するのは時間がかかる。また、ハッシュ値計算のための処理オーバーヘッドによりファイルサーバの性能低下要因にもなりうる。
【課題を解決するための手段】
【０００９】
ここで我々は実験結果から、ある程度ファイルサイズの大きなファイルに関しては、ファイルサイズが一致していると、バイナリ比較の結果も一致している確率が高いという知見を得た。前述した様に、大きなサイズのファイルの方がシングルインスタンス化の効果があり、重複比較の対象となる事が多いため、ファイル重複検出にファイルサイズの比較が有効であると考えた。そこで、上記課題を解決するために、本発明は、まずファイルサイズ比較によりファイル重複検出を行い、ファイルサイズが一致したファイルに関してバイナリ比較を行う。
【００１０】
より具体的には、ファイルストレージ装置であって、それぞれ管理情報と実データを備える複数のファイルを管理するコントローラと、前記複数のファイルを格納するボリュームを構成する記憶媒体を備え、前記ボリュームは第１のディレクトリ及び第２のディレクトリを備え、前記第１のディレクトリには第１のファイル及び第２のファイルが格納され、前記コントローラは前記第２のディレクトリに、第３のファイルを作成し、前記第２のファイルの実データを前記第３のファイルに移動し、前記第２のファイルが前記計算機からのリードアクセスを受信した際に前記第３のファイルを参照する様に前記第２のファイルの管理情報を設定し、前記第１のファイルの実データと前記第３のファイルの実データのサイズを比較し、前記サイズ比較の結果データサイズが同一であった場合には、前記第１のファイルの実データと前記第３のファイルの実データのバイナリを比較し、前記バイナリ比較の結果バイナリが同一だった場合には、前記第１のファイルが前記計算機からのリードアクセスを受信した際に前記第３のファイルを参照する様に前記第１のファイルの管理情報を設定し、前記第１の実データを削除する構成を備える。
【００１１】
また、前記第１のファイルへのライト要求を受信した場合には、前記コントローラは前記第１のファイルに更新データを格納し、前記更新データでない前記第１のファイルへのリード要求を受信した場合には、前記第３のファイルを参照し前記第３のファイルの実データを読み出し、前記更新データについて前記第１のファイルへのリード要求を受信した場合には、前記第１のファイルが備える前記更新データを読み出す構成を備える。
【００１２】
更に、前記第２のファイルの実データの前記第３のファイルへの移動は、前記コントローラが、前記第３のファイルの管理情報において前記第３のファイルの実データの格納領域として前記第２のファイルの実データ格納領域を示す様に管理情報を設定し、前記第２のファイルの管理情報において前記第２のファイルの実データ格納領域を示す管理情報を削除する構成を備える。
【００１３】
また、前記第２のディレクトリはインデックスディレクトリであって、前記第２のディレクトリに格納されるファイルのサイズをディレクトリ名とする第３のディレクトリを備え、前記第３のファイルは前記第３のファイルのサイズをディレクトリ名とする第３のディレクトリに作成され、前記第３のファイルの実データのサイズと前記第１のファイルの実データのサイズの比較には、前記コントローラは前記第３のファイルの実データのサイズに代えて、前記第３のディレクトリ名に記載のサイズと比較をする構成を備える。
【００１４】
更に、前記サイズ比較の結果データサイズが異なった場合には、前記コントローラは、前記第２のディレクトリに前記第１のファイルサイズをディレクトリ名とする第４のディレクトリを作成し、前記第４のディレクトリに第４のファイルを作成し、前記第１のファイルの実データを前記第４のファイルに移し、前記第１のファイルが前記計算機からのリードアクセスを受信した際に前記第４のファイルを参照する様に前記第１のファイルの管理情報を設定する構成を備える。
【００１５】
また、前記バイナリ比較の結果バイナリが異なった場合には、前記コントローラは、前記第３のディレクトリに第４のファイルを作成し、前記第１のファイルの実データを前記第４のファイルに移し、前記第１のファイルが前記計算機からのリードアクセスを受信した際に前記第４のファイルを参照する様に前記第１のファイルの管理情報を設定する構成を備える。
【００１６】
更に、前記バイナリ比較時に、前記コントローラは、前記第１のファイルおよび前記第３のファイルのハッシュ値を計算し、前記第３のファイルを前記第３のファイルのハッシュ値含む名前に変更し、前記第４のファイルを前記第１のファイルのハッシュ値含む名前で作成する構成を備える。
【００１７】
また、前記サイズ比較の結果データサイズが同一であった場合、前記コントローラは、前記第３ディレクトリに格納されるファイルの数が閾値以上であるかを調査し、前記調査の結果前記第３のディレクトリに格納されるファイルの数が閾値以上であった場合には、前記第３のディレクトリに格納されるファイルと前記第１のファイルとでハッシュ値を比較し、前記ハッシュ値比較の結果前記第１のファイルとハッシュ値が同じファイルについて、前記第１のファイルとバイナリ比較をする構成を備える。加えて、前記ハッシュ値比較は、計算した前記第１のファイルのハッシュ値と前記第３のディレクトリに格納されるファイルの名前に含まれるハッシュ値を比較することで行う構成を備える。
【００１８】
また、前記コントローラは前記第３のファイルが前記第１のディレクトリに格納される前記複数ファイルから参照されている数をカウントし、前記被参照数が０になった場合には、前記コントローラは前記第３のファイルを削除し、前記第３のファイルを削除した結果前記第３のディレクトリにファイルがなくなった場合、前記コントローラは、前記第３のディレクトリを削除する構成を備える。
【００１９】
また、前記コントローラは前記第１のファイルが備える前記更新データについて、前記第３のファイルが備える前記実データに対する前記更新データの割合を観測し、前記観測した割合が閾値以上になった場合、前記第３のファイルが備える前記実データのうち前記更新データ以外の部分について、前記第３のファイルから第１のファイルにコピーし、前記第１のファイルの管理情報から前記第３のファイルを参照する旨を削除する構成を備える。
【００２０】
また、前記第１のディレクトリに格納されるファイルのうち、データの大きいファイルから、前記ファイルサイズ比較を行うことにある。加えて、前記第２のディレクトリは隠しディレクトリであることにある。
【００２１】
本発明に関連する更なる特徴は、以降に続く記述に一部は明記され一部は本記述から明らかになり、或は本発明の実施により学ぶことが出来る。本発明の態様は、要素及び多様な要素の組み合わせ及び以降の詳細な記述と添付されるクレームの様態により達成され実現される。
【発明の効果】
【００２２】
全ファイルのハッシュ値計算を行う必要がなく、高速にシングルインスタンス化することができる。
【図面の簡単な説明】
【００２３】
【図１】本発明の典型的なシステム（情報処理システム）の物理的構成を示すブロック図である。
【図２】本発明の情報処理システムのより詳細な物理的及び論理的構成を示す図である。
【図３】本発明の実施形態による、ファイルクローン化及びIndexディレクトリへのファイル登録の動作を説明するためのフローチャートである。
【図４】本発明のIndexディレクトリとファイルクローン技術の関係を説明するための図である。
【図５】本発明のファイルクローン技術を使ってIndexディレクトリへの登録動作を説明するための図である。
【図６】本発明のファイルクローン技術を使ってシングルインスタンス化動作（１）を説明するための図である。
【図７】本発明のファイルクローン技術を使ってシングルインスタンス化動作（２）を説明するための図である。
【図８】本発明のシングルインスタンス化後のファイル更新動作を説明するための図である。
【図９】本発明の実施形態による、シングルインスタンスリスト作成処理を説明するためのフローチャートである。
【図１０】本発明の実施形態による、シングルインスタンス化処理を説明するためのフローチャートである。
【図１１】本発明の実施形態による、重複検出プログラムの処理（１）を説明するためのフローチャートである。
【図１２】本発明の実施形態による、重複検出プログラムの処理（２）を説明するためのフローチャートである。
【図１３】本発明のIndexディレクトリの構成を示す概念図である。
【図１４】本発明の第２の実施形態による情報処理システムの物理的及び論理的構成を示す図である。
【図１５】本発明の第２の実施形態による、クローン親ファイルの削除判定処理を説明するためのフローチャートである。
【図１６】本発明の第３の実施形態による情報処理システムの物理的及び論理的構成を示す図である。
【図１７】本発明の第３の実施形態による、スプリット処理を説明するためのフローチャートである。
【発明を実施するための形態】
【００２４】
以下、添付図面を参照して本発明の実施形態について説明する。添付図面では、機能的に同じ要素は同じ番号で表示される場合もある。なお、添付図面は本発明の原理に則った具体的な実施形態を示しているが、これらは本発明の理解のためのものであり、決して本発明を限定的に解釈するために用いられるものではない。
【００２５】
更に、本発明の実施形態は、汎用コンピュータ上で稼動するソフトウエアで実装しても良いし、専用ハードウエア又はソフトウエアとハードウエアの組み合わせで実装しても良い。なお、本明細書の図では、テーブルやリストを例にして本発明で用いられる情報について説明しているが、テーブルやリストの構造で提供される情報に限られるものではなく、データ構造に依存しない情報であっても良い。
【００２６】
本発明の実施形態によれば、ＮＡＳヘッドとＮＡＳストレージシステムから構成されるＮＡＳに於いて、シングルインスタンス機能が実現される。ただし、本発明の実施形態では、ＮＡＳヘッドとＮＡＳストレージシステムの構成に限定されず、ＮＡＳヘッドに内蔵ディスクを搭載したサーバ等で実現することも可能である。本発明の態様は、ＮＦＳ（Network  File  System）プロトコルの採用に限定されず、他のＣＩＦＳ（Common  Internet  File  System）、ＨＴＴＰ（Hypertext  Transfer  Protocol）等を含むファイル共有プロトコルを採用することも可能である。
【００２７】
（１）第１の実施形態
図１は、第1の実施形態が適用された計算機システムの一実施形態における、本発明の実施形態によるシステムの物理的概略構成を示す図である。ＮＡＳデバイス１０００は、ＮＡＳヘッド１１００とＮＡＳストレージシステム１１５０で構成される。ＮＡＳヘッド１１００はファイル共有機能を有し、ファイルデータを保存するボリュームを提供するＮＡＳストレージシステム１１５０とネットワーク１１９０結合する。ＮＡＳヘッド１１００とＮＡＳストレージシステム１１５０は合わせてＮＡＳデバイスとして動作する。
【００２８】
ＮＡＳヘッド１１００とＮＡＳストレージシステム１１５０はネットワーク１１９０を介して接続されている。また、ＮＡＳデバイス１０００は当該ＮＡＳデバイス１０００にアクセスする複数のＮＡＳクライアント１１８０乃至１１８２に、それぞれネットワーク１１９１を介して接続されている。ネットワーク１１９０はＦＣ（Fiber  Chanel）及び１１９１はＬＡＮ（Local  Area  Network）である。もちろんネットワークの種類は前記ネットワークに限定されず、種々のネットワークを利用可能である。ＮＡＳクライアント１１８０乃至１１８２は図示しないがそれぞれＣＰＵ及びメモリを含んでいる。
【００２９】
図１に示されるＮＡＳストレージシステム１１５０は、ＣＰＵ１１１０、メモリ１１２０及びキャッシュ１１３０を含んでいる。メモリ１１２０には、図２で述べるような各種プログラムが記憶される。例えば、ＮＦＳサーバプログラム１１２１、NOTIFYプログラム１１２２、ポリシー判定プログラム１１２３、シングルインスタンスプログラム１１２４及びファイルシステム１１２５である。メモリ１１２０には、各種ドライバソフトウェア等も記憶される。メモリ１１２０に記憶された各種プログラムは、ＣＰＵ１１１０がプログラムを読み込んで実行することにより、後述するシングルインスタンス機能等が実現される。以下の説明において、プログラムまたは機能が主語となる場合、実際には、プログラムを実行するＣＰＵや各種回路によって処理が実行されるものとする。
【００３０】
キャッシュ１１３０には、ＮＡＳヘッドが受信したライトデータや、ディスクドライブ１１７０から読み出されたデータ等が記憶される。ＮＡＳストレージシステム１１５０は、ストレージコントローラ１１６０と、ディスクドライブ１１７０と、を含んでいる。ストレージコントローラ１１６０は、ＣＰＵ１１６１と、メモリ１１６２と、キャッシュ１１６３と、を含んでいる。
【００３１】
図１に示されるように、ＮＡＳヘッド１１００及びＮＡＳストレージシステム１１５０は、自らをネットワーク又は他のデバイスに結合させる為に一つ以上のインターフェース（Ｉ／Ｆ）を有している。ＮＡＳヘッド１１００はＩ／Ｆ１１４０及び１１４１を有し、ストレージコントローラ１１６０はＩ／Ｆ１１６４及び１１６５を有している。また、図示は省略するがＮＡＳクライアントもＩ／Ｆを含む。
【００３２】
図２は、ＮＡＳデバイス及びＮＡＳクライアントの論理的構成の概略を示す図である。ＮＡＳデバイス１０００の各種要素に搭載されているファイルやアプリケーションについて説明する。ＮＡＳクライアント１１８０は、その上で動作するプログラムとしてアプリケーション１２１０と、ＮＦＳクライアント１２１１と、ＮＡＳマネージャ１２１２と、を含む。ＮＡＳマネージャ１２１２は、ＮＡＳデバイス１０００の設定を行う。
【００３３】
ＮＡＳストレージシステム１１５０は、ストレージコントローラ１１６０の制御によって提供される、ＮＡＳヘッド１１００が扱うデータ、例えば、データファイル及び各種管理用ファイルなどを格納するボリューム１２２０を含む。ボリューム１２２０はディスク１１７０の記憶領域を基に、ストレージコントローラ１１６０によって実現される。
【００３４】
ＮＦＳサーバプログラム１１２１は、ファイル共有のためのＮＦＳ（Network  File  System）機能を提供するアプリケーションプログラムである。ファイルシステム１１２５はＮＡＳヘッド１１００のファイルシステムで、ボリューム１２２０上にファイルを格納する。なお、本実施形態では、ファイルは、inode情報、ブロックポインタ及び実データが格納されるブロック領域から構成される。inode情報には、ファイルの構成とブロックポインタの対応関係情報が記録されている。
【００３５】
ファイルシステムとしては、例えばＬｉｎｕｘ（登録商標）向けのｅｘｔ２（second  extended  file  system）又はｅｘｔ３（third  extended  file  system）、ＮＴＦＳ（Windows  NT（登録商標）file  system）でよい。ストレージコントローラ１１６０はＦＣ−ＳＡＮ（Fibre  Channel  Storage  Area  Network）等のブロック形式のストレージ機能を提供する。ファイルシステム１１２５は、ストレージコントローラ１１６０が提供するボリューム１２２０上にデータを格納する。
【００３６】
ＮＯＴＩＦＹプログラム１１２２は、ファイルシステム１１２５と連携し、管理用ファイルであるファイルリスト１２３１を作成する。ファイルリスト１２３１には、ファイルシステム１１２５において、ある時点（例えば、前回シングルインスタンス処理時）以降に新規作成、更新されたファイルのファイルパスの一覧が記録されている。例えば、ファイルＡ１２４１、ファイルＢ１２４２、ファイルＣ１２４３のファイルパスがファイルリスト１２３１に記載されているとする（ファイルＤ１２４４、ファイルＥ１２４５は記載されていない）。初回は、例えばファイルシステムがfindコマンドなどを用いて、ファイルシステムの全ファイルのファイルパスが記載されたファイルリスト１２３１を作成して用いる。
【００３７】
ポリシー判定プログラム１１２３は、管理用ファイルであるシングルインスタンスポリシー１２３２を持ち、ＮＯＴＩＦＹプログラム１１２２とシングルインスタンスプログラム１１２４と連携し、管理用ファイルであるシングルインスタンスリスト１２３６を作成する。シングルインスタンスポリシー１２３２には、ファイルリスト１２３１からファイルを抽出してシングルインスタンスリスト１２３６を作成するためのポリシーが記録されている。
【００３８】
例えば、シングルインスタンス化による容量削減効果の高いものについてのみシングルインスタンス化するために、シングルインスタンスポリシー１２３２にファイルサイズが1MB以上というポリシーが記録されている場合、ファイルリスト１２３１に記載されているファイルのうち、ファイルサイズ1MB以上のファイルについてのみファイルパスの一覧がシングルインスタンスリスト１２３６に記録される。例えば、ファイルＡ１２４１、ファイルＢ１２４２及びファイルＣ１２４３が記載されることになる。
【００３９】
また、ファイルサイズ以外にも、更新頻度が閾値以下のファイルについてのみシングルインスタンス化するポリシーや、特定の拡張子のファイルのみをシングルインスタンス化するようここでポリシーを記録することが可能である。
【００４０】
シングルインスタンスプログラム１１２４は、シングルインスタンスリスト１２３６に記載されているファイルに関して、ファイルの重複を検出し、重複ファイルをシングルインスタンス化する機能を有する。シングルインスタンスプログラム１１２４は、ファイル分類プログラム１２３３と、重複検出プログラム１２３４と、ファイルクローンプログラム１２３５と、シングルインスタンスリスト１２３６と、を含む。
【００４１】
ファイル分類プログラム１２３３は、最終的にバイナリ比較によってファイルの重複を判定するファイルの分類を行う。ファイル分類プログラム１２３３は、ファイルサイズ比較により重複ファイルの一次検出を行う。また、ファイルサイズの一致するファイルを検出した場合、前記ファイルのバイナリ比較を行うために重複検出プログラム１２３４を起動する。
【００４２】
さらに、ファイルサイズ比較を高速化するために、ボリューム１２２０にIndexディレクトリ１２５０を作成する。実サイズディレクトリ作成Indexディレクトリ１２５０は隠しディレクトリであり、シングルインスタンスプログラム１１２４が利用する情報を格納する。隠しディレクトリとすることで、ユーザによるクローン親ファイル（詳しくは後述する）の更新を防ぐことが出来る。
【００４３】
ただし、Indexディレクトリ１２５０は必ずしも隠しディレクトリでなくてもよい。また、Indexディレクトリには、例えばファイル拡張子情報を格納するExtentionディレクトリなど他のディレクトリがあってもよい。Exportディレクトリ１２４０には一般ユーザがアクセスするファイルが格納されており、Indexディレクトリ１２５０に登録されたファイルはクローン子ファイル（詳しくは後述する）となる。
【００４４】
ここで、ファイルのクローン化とは、同一内容のファイルが複数ある場合、もしくは同一内容のファイルを複製した場合、同一内容の複数のファイルのうち一つのファイルをクローン親ファイルとし、同一内容の複数の他のファイルについてクローン子ファイルとする。クローン子ファイルのinode情報のファイルの構成とブロックポインタの対応関係情報を変更し、クローン子ファイルにアクセスがあった場合にクローン親ファイルのinode情報のうちファイル構成とブロックポインタの対応関係情報が参照されるようにする。そして、クローン子ファイルの実データを削除するものである。これにより、クローン子ファイルはスタブ化され、実データを持つのはクローン親ファイルだけとなり必要な記憶容量を削減する事が出来る。
【００４５】
クローン子ファイルへライトアクセスがあった際には、ブロックポインタがポイントする論理ブロック領域に物理ブロック領域を割り当て、前記物理ブロック領域にデータが格納される。また、クローン子ファイルのinode情報のファイルの構成とブロックポインタの対応関係情報について変更し、更新があった部分へのリード処理については、クローン子ファイルのブロックポインタを参照し、ブロックポインタがポイントする領域に格納されたデータをリードするようにする。前記物理ブロック領域へのアクセスについては当該領域のデータを参照し、他の領域の場合にはクローン親ファイルを参照するようにする。
【００４６】
次に、図３を用いて本実施形態におけるファイルクローン化及び、Indexディレクトリ１２５０へのファイル登録の流れについて説明する。Ｓ１７０１０において、Indexディレクトリの備える複数のレンジサイズディレクトリのうち、Exportディレクトリ１２４０に格納される登録対象のファイルのファイルサイズを格納対象とするレンジサイズディレクトリに、登録対象のファイルのファイルサイズディレクトリ名として持つ実サイズディレクトリが作成される。
【００４７】
Ｓ１７０２０において、Ｓ１７０１０で作成した実サイズディレクトリに登録対象のファイルと同一サイズであり、＜nohash＞．＜inode番号＞をファイル名とする空ファイルを作成する。このようにIndexディレクトリへの初回登録時は、ハッシュ値情報を登録しないことで、シングルインスタンスリスト１２３６に記載されている全ファイルのハッシュ値計算による処理オーバーヘッドを削減し、処理が高速化できる。なお、ファイル名はハッシュ値計算が未実施であることをあらわすために定義された任意の文字列であればよい。
【００４８】
Ｓ１７０３０において、Ｓ１７０２０で作成した空ファイルのブロックポインタを登録対象のファイルの実データを参照するように変更する。Ｓ１７０４０において、登録ファイルのinode情報をＳ１７０３０で作成したファイルのinode情報を参照するように変更する。Ｓ１７０５０において、登録対象のファイルのブロックポインタを削除する。
【００４９】
本処理により、Exportディレクトリ１２４０に親ファイルを参照するスタブファイルであるクローン子ファイル、Indexディレクトリに参照されるクローン親ファイルが作成される。結果、隠しディレクトリであるIndexディレクトリにクローン親ファイルを置くことができ、ユーザによるクローン親ファイルの更新を防ぎ、管理情報の変更による負荷を低減することができる。また、本処理は、コピー処理なしでデータを登録対象のファイルからIndexディレクトリの作成したファイルに移すことができるため、移行処理に伴う負荷を低減することができる。
【００５０】
図２に戻り、例えば、ファイルＡ１２４１、ファイルＢ１２４２及びファイルＣ１２４３のファイルパスがシングルインスタンスリスト１２３６に記載されているとする。ファイルＡが実サイズディレクトリ１２５１内の＜nohash.100＞ファイル１２５２としてクローン親ファイルが登録され、Exportディレクトリ１２４０内のファイルＡ１２４１はクローン子ファイル化される。また、ファイルＢ１２４２に関しても、ファイルＡ１２４１同様、実サイズディレクトリ１２５３及びクローン親ファイル１２５４としてIndexディレクトリ１２５０に登録され、Exportディレクトリ内のファイルＢ１２４２はクローン子ファイル化される。
【００５１】
重複検出プログラム１２３４は、ハッシュ値比較を行わない重複検出プログラム処理Ａと、ハッシュ値比較を行う重複検出プログラム処理Ｂを備える。以下区別の必要がない場合には重複検出プログラム１２３４と呼ぶ。重複検出プログラム１２３４は、ファイルサイズが同一のファイルについてバイナリ比較を行う。例えば、ファイルＢ１２４２とファイルＣ１２４３に関して、バイナリ比較を行う。
【００５２】
また、この時にバイナリ比較のためにリードしたデータを利用して、ハッシュ値計算も行う。これは、中身は異なるがファイルサイズが同じファイルが大量にある場合、ファイルサイズ比較による重複ファイル検出は、バイナリ比較回数が増加し、重複ファイル検出に時間がかかってしまうという課題があるためである。これを解決するために、中身が異なるがファイルサイズが同じファイルの数が閾値以上である場合には、重複検出プログラムＢの処理の一部として、ハッシュ値比較も行えるようにするためである。
【００５３】
重複検出プログラム１２３４は、計算したハッシュ値を用いて、＜nohash＞．＜inode番号＞のファイル名を、＜ハッシュ値＞．＜inode番号＞にリネームする。バイナリ比較の結果、バイナリ一致の場合は、ファイルクローンプログラム１２３５によって、ファイル重複が検出されたファイル、例えばファイルＣ１２４３を、クローン子ファイル化する。
【００５４】
前記プロセスで、ファイルＢとファイルＣのシングルインスタンス化が行われる。バイナリ比較の結果、バイナリ不一致の場合は、Indexディレクトリ１２５０への登録を行う。バイナリ比較時にハッシュ計算を行っているため、＜ハッシュ値＞．＜inode番号＞のファイル名でクローン親ファイルを登録する。また、クローン親ファイルはいくつのクローン子ファイルから参照されているかを管理する参照カウンタを持つ。クローン親ファイルの削除処理は後述するが、クローン子ファイルが削除されるとクローン親ファイルの参照カウンタが減らされ、全てのクローン子ファイルが削除されると参照カウンタは0となり、クローン親ファイルは不要となるため、クローン親ファイルが自動的に削除される。
【００５５】
ＮＦＳクライアント１２１１は、ＮＦＳプロトコルを介して、アプリケーション１２１０がＮＡＳデバイス１０００上のデータファイル内のデータにアクセス可能にする、ＮＦＳクライアント機能を含み、ＮＡＳヘッド１１００のＮＦＳサーバプログラム１１２１にアクセスする。ＮＦＳサーバプログラム１１２１は、ＮＦＳクライアント１２１１に代わって、ＮＡＳヘッド１１００に結合するＮＡＳストレージシステム１１５０上のボリューム１２２０にデータが格納されているファイルシステム１１２５にアクセスする。
【００５６】
次に、図４から図９を用いて、ファイルクローン機能を用いた具体的なシングルインスタンス化の流れについて説明をする。図４は、シングルインスタンスプログラム１１２４が実行される前のファイルB１３０２の状態を示す。Exportディレクトリ１２４０はユーザがアクセスするファイルが格納されている。ファイルＢ１３０２はファイルサイズが3.2MB、inode番号が240である。ファイルＢ１３０２は、inode情報１４１０、ブロックポインタ１４２０及び実データが格納されるブロック領域１４３１及び１４３２から構成されている。
【００５７】
Indexディレクトリ１２５０直下にはSizeディレクトリ１３２０があり、図４〜図９では省略しているが、ファイルサイズとハッシュ値以外の情報を格納するためのディレクトリ、例えばファイル拡張子情報を格納するExtentionディレクトリなどがあってもよい。前述したレンジサイズディレクトリは、図４〜図９では4Mディレクトリ１３３５のみ示し、他のレンジサイズディレクトリは省略している。
【００５８】
図５は、BファイルＢ１３０２がシングルインスタンスプログラム１１２４によってIndexディレクトリ１２５０に登録される処理を示す図である。レンジサイズディレクトリである4Mディレクトリ１３３５に、ファイルＢ１３０２のファイルサイズをディレクトリ名として持つ3.2Mディレクトリ１３４２が作成される。続いて、3.2Mディレクトリ１３４２に＜nohash＞．＜inode番号＞をファイル名とする空ファイルを作成する。ファイルＢ１３０２の場合は、＜nohash.240＞がファイル名となる。なお、ファイル名はハッシュ値計算が未実施であることをあらわすために定義された任意の文字列であればよい。
【００５９】
＜nohash.240＞ファイル１３５２は、inode情報１５１０、ブロックポインタ１５２０を持ち、ブロックポインタ１５２０は、ファイルＢ１３０２のブロックポインタ１４２０と同じブロック領域１４３１及び１４３２をポインタする。そして、ファイルＢ１３０２のinode情報１４１０を変更して、ファイルＢ１３０２へのデータアクセス時は、＜nohash.240＞ファイル１３５２のinode情報１５１０を経由してブロック領域１４３１及び１４３２を参照されるようにする。こうすることで、コピー処理なしでデータをファイルＢ１３０２から＜nohash.240＞ファイル１３５２に付け替える。この状態の＜nohash.240＞ファイル１３５２をクローン親ファイル、ファイルＢ１３０２をクローン子ファイルであり、実データを持っているのはクローン親ファイルで、クローン子ファイルはクローン親ファイルを経由して実データを参照する。
【００６０】
図６は、同一の内容のファイルであるファイルＢ１３０２とファイルＣ１３０３のシングルインスタンス化の処理を示す図である。Exportディレクトリ１２４０に、クローン子ファイル化されたファイルＢ１３０２と通常のファイルであるファイルＣ１３０３がある。ファイルＣ１３０３はファイルサイズが3.2MB、inode番号が260である。ファイルＣ１３０３は、inode情報１６１０、ブロックポインタ１６２０及び実データが格納されるブロック領域１６３１及び１６３２から構成されている。ファイルＢ１３０２とファイルＣ１３０３は同一ファイルであるため、ブロック領域１４３１と１６３１には同じデータが、ブロック領域１４３２と１６３２には同じデータが格納されている。
【００６１】
ファイルＣ１３０３のファイルサイズを取得され、＜nohash.240＞ファイル１３５２のファイルサイズの比較が行われる。結果、両ファイルは同じファイルサイズであるため両ファイルのバイナリ比較が行われる。具体的には、ブロック領域１４３１、１４３２とブロック領域１６３１、１６３２のバイナリ比較がなされ、バイナリ一致を確認される。また、バイナリ比較時にディスクリードしたデータを利用して、ハッシュ値が計算される。そして、前記ハッシュ値を用いて、＜nohash.240＞ファイル１３５２を＜5AF4B.240＞にファイル名がリネームされる。
【００６２】
ファイルＣ１３０３のinode情報１６１０を変更して、ファイルＣ１３０３へのデータアクセス時は、＜5AF4B.240＞ファイル１３５２のinode情報１５１０を経由してブロック領域１４３１及び１４３２が参照されるようにする。そして、ファイルＣ１３０３のブロックポインタ１６２０のポインタ先のブロック領域１６３１及び１６３２のデータが削除される。
【００６３】
図７が、ファイルＢ１３０２とファイルＣ１３０３のシングルインスタンス化の処理後を示す図である。ファイルＣ１３０３は、＜5AF4B.240＞ファイル１３５２をクローン親ファイルとするクローン子ファイルとなる（ファイルＣのinode情報１６１０はinode情報１７１０へ、ブロックポインタ１６２０はブロックポインタ１７２０へと変更する）。ファイルＢ１３０２とファイルＣ１３０３はともにクローン子ファイルとなり、クローン親ファイルのブロック領域１４３１及び１４３２をともに参照するシングルインスタンス化が実現される。
【００６４】
図８は、ファイルＢ１３０２の2つ目の論理ブロック領域１８３２及びファイルＣ１３０３の1つ目の論理ブロック領域１８３３が更新された場合の処理を示す図である。シングルインスタンス化処理後、ファイルＢ１３０２へのファイル更新が行われるまでは、ファイルＢ１３０２のブロックポインタ１４２０がポインタする論理ブロック領域１８３１及び１８３２には、物理ブロック領域は割り当てられていない。
【００６５】
ファイル更新により、ファイルＢ１３０２の2つ目の論理ブロック領域１８３２のデータが変更された場合、ブロックポインタ１４３０がポイントする論理ブロック領域１８３２に物理ブロック領域が割り当てられ、前記物理ブロック領域にデータが格納される。ファイルＣ１３０３のファイル更新も同様に、1つ目の論理ブロック領域１８３３が更新された場合は、ブロックポインタ１７３０がポイントする論理ブロック領域１８３３に物理ブロック領域が割り当てられ、前記物理ブロック領域にデータが格納される。このときに、ファイルＢ及びファイルＣのinode情報を書き換え、物理ブロックが割り当てられた領域にアクセスが来た場合は、当該領域に格納されるデータが参照されるようにする。
【００６６】
ファイル更新後のファイルＢ１３０２へのデータアクセス時は、1つ目の論理ブロック領域１８３１に関しては、物理ブロック領域が割り当てられていないため、クローン親ファイルのinode情報１５１０を経由して、ブロック領域１４３１のデータを参照する。2つ目の論理ブロック領域１８３２に関しては、物理ブロック領域が割り当てられているため、前記物理ブロック領域１８３２のデータを参照する。
【００６７】
ファイル更新後のファイルＣ１３０３へのデータアクセス時は、1つ目の論理ブロック領域１８３３に関しては、物理ブロック領域が割り当てられているため、前記物理ブロック領域１８３３のデータを参照する。2つ目の論理ブロック領域１８３４に関しては、物理ブロック領域が割り当てられていないため、クローン親ファイルのinode情報１５１０を経由して、ブロック領域１４３２のデータを参照する。
【００６８】
特許文献１のシングルインスタンス化方法では、シングルインスタンス後にファイル更新を行うと、ファイルの全領域が実体化（物理ブロック領域の割り当て）するため、シングルインスタンス化による容量削減効果が０になってしまう。一方で本発明の方式では、シングルインスタンス後のファイル更新データをクローン子ファイル側で持つため、データ更新されなかった領域は、シングルインスタンス化されたファイル間で引き続き共有するため、データ更新されなかった領域に関するシングルインスタンス化による容量削減効果は維持される。
【００６９】
なお、スナップショット技術においても、更新データを別途持つということが行われているが、本発明の方が管理情報を少なくて済むという違いがある。スナップショットは通常複数世代のスナップショットを取得するため、各世代それぞれ全領域がそれぞれ対応するデータ領域の管理情報を持たなければならない。それに対して、本発明では更新があった部分はクローン子ファイル側を参照し、更新がなかった部分はクローン親ファイル側を参照するという方式のため、追加の管理情報は更新データをクローン子ファイル側で持つだけで、当該更新データがなければクローン親ファイル側を参照するという方式のため、全領域がそれぞれ対応するデータ領域の管理情報は不要である。
【００７０】
Indexディレクトリ１２５０のツリー構造は、登録されるファイルのファイルサイズによって格納されるディレクトリが決まり、格納されるファイルのファイル名は、ハッシュ値とinode番号で決まる。仮に、Indexディレクトリ１２５０に格納されるファイルのファイルサイズ、ハッシュ値及びinode番号が途中で変更されると、ファイル移動やリネームといった処理によるIndexディレクトリ１２５０のメンテナンス処理が必要になる。前記処理による負荷によって、ファイルストレージの性能が低下する場合があると考えられる。
【００７１】
本実施の形態では、Indexディレクトリ１２５０に格納されるのはクローン親ファイルであり、シングルインスタンス化されるExportディレクトリ１２４０のファイルは全てクローン子ファイルとし、更新データをクローン子ファイル側で持つことにより、隠しディレクトリであるIndexディレクトリ１２５０に格納されるクローン親ファイルがユーザに更新されないようにしている。そのため、Indexディレクトリ１２５０に格納されたファイルは、Exportディレクトリ１２４０のファイルが更新されても、ファイルサイズ、ハッシュ値及びinode番号が変更されることはない。このため、Indexディレクトリ１２５０のメンテナンス処理が不要であり、メンテナンス処理の負荷による、ファイルストレージの性能が低下を防ぐことができる。
【００７２】
図９はシングルインスタンスリスト作成フローである。本処理は、ポリシー判定プログラム１１２３により実行され、シングルインスタンスリスト１２３６が作成される。本フローはシングルインスタンス化の可否の判断の前に、各ファイルをシングルインスタンス化すべきファイルかどうかを判断する処理といえる。
【００７３】
Ｓ１００１０において、シングルインスタンスポリシーファイル１２３２が読込まれる。このシングルインスタンスポリシーファイル１２３２には、シングルインスタンスリストファイル作成時に用いられるポリシーが記載されている。ポリシーとしては、例えば、作成日時、更新日時、アクセス日時、ファイルサイズ、ファイル拡張子、ファイルシステム名、ディレクトリ名、ファイル名などが設定される。これらのポリシーはＮＡＳマネージャ１２１２や接続される入力装置を介し、ユーザのシステム管理者等により設定される。例えば、ファイルがシングルインスタンス化（若しくは図３の様なクローン化）されると、ファイルアクセス応答速度が落ちる可能性があるため、ファイルアクセス確率が高くなりがちな更新日時の新しいファイルについては、シングルインスタンス化しない様に設定をする事が出来る。
【００７４】
Ｓ１００２０において、ファイルリストファイル１２３１を読込む。このファイルリストファイル１２３１は、NOTIFYプログラム１１２２により作成される。ファイルシステム１１２５は、ファイルの新規作成、ファイル更新、ファイル削除といったファイルへの変更があった場合、NOTIFYプログラム１１２２に通知する。NOTIFYプログラム１１２２は、前記通知を受信したら、当該ファイルのファイルパスをファイルリストファイル１２３１に追加する。
【００７５】
Ｓ１００３０において、ファイルリストファイル１２３１に記載されているファイルであって、まだポリシー判定をしていないファイルの一つを選択する。Ｓ１００４０において、Ｓ１００３０で選択したファイルがシングルインスタンスポリシーファイル１２３２に記載されているポリシーをもとに判定する。ポリシーに合致すればＳ１００５０にすすみ、合致しなければＳ１００６０にすすむ。
【００７６】
Ｓ１００５０において、ポリシーに合致したファイルのファイルパスをシングルインスタンスリストファイル１２３６に追加する。ここのシングルインスタンスリストファイル１２３６に追加されたファイルをシングルインスタンス化することが可能かどうかを判断されるファイルである。Ｓ１００６０において、ファイルリストファイル１２３１に次のファイルがある場合はＳ１００３０に戻り、ファイルリストファイル１２３１に記載されている全ファイルのポリシー判定が終了した場合は本処理を終了する。
【００７７】
＜シングルインスタンス化処理のフローチャート＞
図１０、図１１及び図１２は、シングルインスタンス化処理を説明するためのフローチャートである。本処理は、シングルインスタンスプログラム１１２４によって実行される。シングルインスタンスプログラム１１２４は、ファイル分類プログラム１２３３、重複検出プログラム１２３４及びファイルクローンプログラム１２３５から構成され、各プログラムが連携してシングルインスタンス化処理が行われる。
【００７８】
ファイル分類プログラム１２３３が主に図１０に示すシングルインスタンス化処理の全体的な制御を行い、重複検出プログラム１２３４が図１１及び図１２に示す処理を行う。ファイルクローンプログラム１２３５は、図１０、図１１及び図１２における、ファイルのクローン化処理が行なわれる。
【００７９】
図１０を参照して、Ｓ１１０１０において、ファイル分類プログラム１２３３が、シングルインスタンスリスト１２３６を読込み、シングルインスタンスリスト１２３６に記載されているファイルを順番に処理する。処理する順番に制限はないが、ファイルサイズの大きなファイルの方が、容量削減量が大きい傾向にあるため、例えばファイルサイズの大きなファイルから順番に処理する。但し大きなファイルから順番に処理するには容量を調べる負荷がかかるため、シングルインスタンスポリシー１２３２で規定する、シングルインスタンス化対象ファイルサイズを徐々に小さくしていくことで、並び替えと同様の効果を得る事が出来る。あらかじめ設定した所定時間以内にシングルインスタンス化処理が終わらなかったら、処理を打ち切ってもよい。こうすることで、容量削減効果の大きいファイルサイズの大きなファイルのシングルインスタンス化が完了すれば、ある程度の容量削減ができているためである。
【００８０】
Ｓ１１０２０において、Ｓ１１０１０で選択したファイルのファイルサイズを取得する。例えば、ファイルシステム１１２５のSTATシステムコール機能を用いて取得する。Ｓ１１０３０において、Ｓ１１０１０で選択したファイルと同一ファイルサイズのファイルが重複検出プログラム１２３４で処理中でないかチェックし、処理されている場合は当該ファイルへの処理は後回しにし、Ｓ１１０１０に戻って次のファイルを処理する。
【００８１】
これは、後述するファイルサイズ比較においてIndexディレクトリ１２５０が利用されるが、Indexディレクトリへのファイル登録は重複検出プログラム１２３４も行うので、同じファイルサイズのファイルをファイル分類プログラム１２３３と重複検出プログラム１２３４で同時に処理すると、ファイルサイズ比較で漏れてしまう可能性があるためである。同じファイルサイズのファイルが重複検出プログラム１２３４で処理されていなければ、Ｓ１１０４０にすすむ。
【００８２】
この制御により、ファイル分類プログラム１２３３は、重複検出プログラム１２３４起動後、プログラム終了を待たずに次の処理を開始することができ、ファイル分類プログラム１２３３と重複検出プログラム１２３４が並行して同時に実行されることで処理の高速化が可能である。また、重複検出プログラム１２３４を複数並行して同時に起動することも可能である。
【００８３】
Ｓ１１０４０において、Ｓ１１０１０で選択したファイルと同一ファイルサイズのファイルがIndexディレクトリ１２５０に登録されているかチェックする。Indexディレクトリには実サイズディレクトリ名としてファイルサイズが記憶されており、ディレクトリのフルパスも事前に分かっているため、例えば、前記実サイズディレクトリをopendirもしくはstatシステムコールなどファイルシステムへ発行した時の、その返り値で、同一ファイルサイズのファイルがIndexディレクトリ１２５０に登録されているか判定可能である。この結果、Indexサイズリストを作成し、バイナリサーチを行うよりも高速にファイルサイズ判定が行える。登録されていない場合はＳ１１０６０に進み、登録されている場合はＳ１１０５０に進む。
【００８４】
Ｓ１１０５０においては、前記同一ファイルサイズのファイルの数が閾値未満かを判断し、閾値未満であった場合にはＳ１１０５１に進み重複検出プログラムＡを起動し、閾値以上であった場合にはＳ１１０５２に進み重複検出プログラムＢを起動する。この閾値は、ＮＡＳデバイス１０００で設定可能とし、例えばＮＡＳマネージャ１２１２を用いて設定する。重複検出処理は、同一ファイルサイズのファイルが１個や２個など、少ない場合はハッシュ値比較を用いずに、総当たりでバイナリ比較を行った方が、処理時間が短い場合が多い。
【００８５】
一方で、同一ファイルサイズのファイルが多い場合は、総当たりでバイナリ比較を行うと長時間を要する場合がある。また、ファイルサイズが大きくてバイナリ比較時間が長く、簡易なハッシュ計算であれば、１つ目のファイル比較からハッシュ値比較を用いた方がトータルの処理時間は短くなる場合がある。また逆にファイルサイズが小さくてバイナリ比較時間が短い場合は、実サイズディレクトリ内のファイルが２つなど少ない場合は、ハッシュ値比較を行わずにバイナリ比較のみで判定した方がトータルの処理時間が短くなる場合があるため、実サイズディレクトリ内の３つ目からや４つ目からなどで、ハッシュ値比較を行うとしてもよい。実サイズディレクトリ内の何個目からのファイル比較からハッシュ値比較を併用した方がトータルの処理時間が短くなるかは、比較対象のファイルサイズに依存するため、レンジサイズディレクトリごとに実サイズディレクトリ内の何個目からハッシュ値比較を行うかを変更してもよい。この課題を解決するため、同一ファイルサイズのファイルが多い場合はさらにハッシュ値比較も行うよう、重複検出プログラムＢを起動する。
【００８６】
Ｓ１１０１０で選択したExportディレクトリ１２４０のファイルと、Ｓ１１０４０で見つけたIndexディレクトリ１２５０のファイルを指定して、重複検出プログラム１２３４を起動する。Indexディレクトリ１２５０のファイルは、同一ファイルサイズのファイルが複数ある場合は、該当するファイル全てを指定する。Ｓ１１０３０で説明した制御があるため、起動した重複検出プログラム１２３４の終了は待たずにＳ１１０７０に進む。重複検出プログラム１２３４は複数同時起動可能である。Ｓ１１０６０において、Ｓ１１０１０で選択したExportディレクトリ１２４０のファイルに関して、図３及び図５で説明したIndexディレクトリ１２５０へのファイル登録とクローン子ファイル化を行う。
【００８７】
Ｓ１１０７０において、Ｓ１１０１０で選択したExportディレクトリ１２４０のファイルのシングルインスタンス化処理が終了した後、シングルインスタンス化されたファイルをシングルインスタンスリスト１２３６から削除する。Ｓ１１０８０において、シングルインスタンスリスト１２３６にファイルが残っている場合は、Ｓ１１０１０に戻り、次のファイルの処理を行う。ファイルが残っていない場合は、シングルインスタンス化処理は終了とする。
【００８８】
図１１は図１０のＳ１１０５１で起動される重複検出プログラムＡの処理のフローチャートである。Ｓ１２０１０において、ファイル分類プログラム１２３３によって指定されたファイル間でバイナリの比較を行う。バイナリが一致しなかった場合はＳ１２０２０へ進み、バイナリが一致した場合はＳ１２０３０に進む。
【００８９】
Ｓ１２０２０において、Indexディレクトリ１２５０に同一ファイルサイズのファイルが複数個あった場合は、ファイル分類プログラム１２３３によって複数個のIndexディレクトリ１２５０のファイルが指定される。次のバイナリ比較候補がある場合はＳ１２０１０に戻る。次のバイナリ比較候補がない場合はＳ１２０４０に進む。Ｓ１２０４０において、ファイル分類プログラム１２３３によって指定されたExportディレクトリ１２４０のファイルに関して、図３及び図５で説明したIndexディレクトリ１２５０へのファイル登録とクローン子ファイル化を行う。
【００９０】
Ｓ１２０３０において、ファイル分類プログラム１２３３によって指定されたExportディレクトリ１２４０のファイルに関して、図６で説明したシングルインスタンス化を行う。Ｓ１２０５０において、ハッシュ値計算が必要かどうかの判定を行う。Indexディレクトリ１２５０へのファイル登録は、ファイル分類プログラム１２３３が指定したIndexディレクトリ１２５０のファイルに＜nohash＞のファイルが含まれている場合は、＜nohash＞ファイルのハッシュ値計算を行う必要があり、Ｓ１２０６０に進む。＜nohash＞のファイルが含まれていない場合は、ハッシュ値計算は不要であり、重複検出プログラムＡの処理を終了する。
【００９１】
Ｓ１２０６０において、＜nohash＞のファイルのハッシュ値計算を行う。バイナリ比較後にハッシュ値計算を行えば、ハッシュ値計算で必要となるファイルの実データはキャッシュヒットする確率が高く、高速に処理できる可能性が高い。また、バイナリ比較時のファイルの実データリード時に、ハッシュ値計算も行ってしまってもよい。Ｓ１２０７０において、Ｓ１２０６０で計算したハッシュ値を用いて、＜ハッシュ値＞．＜inode番号＞にリネーム処理し、重複検出プログラムＡの処理を終了する。
【００９２】
図１２を参照して、Indexディレクトリに同一ファイルサイズのファイル数が閾値以上の場合に実施される場合の重複検出プログラムＢについて説明をする。Ｓ１３０１０において、ファイル分類プログラム１２３３によって指定されたExportディレクトリ１２４０のファイルのハッシュ値を計算する。
【００９３】
Ｓ１３０２０において、ファイル分類プログラム１２３３によって指定されたIndexディレクトリ１２５０のファイルに関して、ハッシュ値がまだ計算されていない＜nohash＞のファイルがある場合はハッシュ値計算とリネーム処理が必要である。＜nohash＞のファイルがありリネーム処理が必要である場合はＳ１３０３０に進み、不必要であればＳ１３０５０に進む。Ｓ１３０３０において、リネーム処理が必要なファイルのハッシュ値を計算する。Ｓ１３０４０において、Ｓ１３０３０で計算したハッシュ値を用いて、＜ハッシュ値＞．＜inode番号＞にリネーム処理する。
【００９４】
Ｓ１３０５０において、Ｓ１３０１０で計算したハッシュ値と、ファイル分類プログラム１２３３によって指定されたIndexディレクトリのファイルのハッシュ値はファイルネームとして記録されているため、それと比較を行う。ハッシュ値が一致しなかった場合はＳ１３０６０へ進み、ハッシュ値が一致した場合はＳ１３０８０に進む。Ｓ１３０６０において、Indexディレクトリ１２５０に同一ファイルサイズのファイルが複数個あり、次のハッシュ値比較候補がある場合はＳ１３０５０に戻る。次のハッシュ値比較候補がない場合はＳ１３０７０に進む。
【００９５】
Ｓ１３０７０において、ファイル分類プログラム１２３３によって指定されたExportディレクトリ１２４０のファイルに関して、図３及び図５で説明したIndexディレクトリ１２５０へのファイル登録とクローン子ファイル化を行う。この時、Ｓ１３０１０においてExportディレクトリ１２４０のファイルのハッシュ値が計算されているため、＜nohash＞．＜inode番号＞ではなく、＜ハッシュ値＞．＜inode番号＞のファイル名でIndexディレクトリ１２５０に登録し、重複検出プログラムＢの処理を終了する。
【００９６】
Ｓ１３０８０において、ハッシュ値が一致していた場合、さらにバイナリ比較を行う。バイナリが不一致だった場合はＳ１３０６０に進み、バイナリが一致していた場合はＳ１３０９０に進む。Ｓ１３０９０において、ファイル分類プログラム１２３３によって指定されたExportディレクトリ１２４０のファイルに関して、図６で説明したシングルインスタンス化を行い、重複検出プログラムＢの処理を終了する。また、バイナリ比較時にハッシュ値計算も行っておくことで、中身が異なるがファイルサイズが同じファイルが多い場合でも、ハッシュ値比較により無駄なバイナリ比較回数を減らすことができる。
【００９７】
図１３を用いて本発明の処理の一例を示す。Indexディレクトリ１２５０のシングルインスタンスリスト１２３６に、ファイルＡ１３０１、ファイルＢ１３０２、ファイルＣ１３０３、ファイルＦ１３０６、ファイルＧ１３０７、ファイルＨ１３０８、ファイルＩ１３０９及びファイルＪ１３１０が記載されていた場合（ファイルＤ１３０４、ファイルＥ１３０５、ファイルＫ１３１１、ファイルＬ１３１２は未記載）、どのようにIndexディレクトリ１２５０に登録されるかを例として示す。ファイルＡ１３０１のファイルサイズは1.1MB、ファイルＢ１３０２とファイルＣ１３０３のファイルサイズは3.2MBで中身も同じデータ、ファイルＦ１３０６、ファイルＧ１３０７、ファイルＨ１３０８、ファイルＩ１３０９及びファイルＪ１３１０は全てファイルサイズが3.42MBで同じだが、ファイルＦ１３０６とファイルＧ１３０７の中身が同じデータで、ファイルＨ１３０８、ファイルＩ１３０９及びファイルＪ１３１０の中身が同じデータで、ファイルＦ１３０６及びファイルＧ１３０７とは異なるとする。
【００９８】
Indexディレクトリ１２５０の下にSizeディレクトリ１３２０があり、前記ディレクトリにファイルサイズ情報とハッシュ値を登録する。本明細書では説明を省略するが、ファイルの拡張子を利用してファイル重複検出を行う場合は、Extensionディレクトリ１３２１を作成し、前記ディレクトリに拡張子情報を登録していく。Sizeディレクトリ１３２０、Extensionディレクトリ１３２１以外にも、ファイル重複検出に利用する情報を登録するための各種ディレクトリを作成してもよい。
【００９９】
Sizeディレクトリ１３２０内に、レンジサイズディレクトリ１３３１〜１３３６を作成する。レンジサイズディレクトリは、ファイルシステムの性能低下を避けるため、格納されるディレクトリやファイルが特定のディレクトリに集中しないようにするためのものである。例えば、256Kディレクトリ１３３１には、ファイルサイズが256KB未満のファイルを登録する。512Kディレクトリ１３３２には、ファイルサイズが256KB以上512KB未満のファイルを登録する。1Mディレクトリ１３３３には、ファイルサイズが512KB以上1MB未満のファイルを登録する。2Mディレクトリ１３３４には、ファイルサイズが1MB以上2MB未満のファイルを登録する。4Mディレクトリ１３３５には、ファイルサイズが2MB以上4MB未満のファイルを登録する。8Mディレクトリ１３３６以降も同様である。
【０１００】
レンジサイズディレクトリの粒度は自由に設定可能であり、理想的には各レンジサイズディレクトリに格納されるディレクトリ数、ファイル数が平準化されるように設定されるのがよい。シングルインスタンス化を行うファイルシステムのファイルを分析し、各ファイルサイズレンジのファイル分布を分析して、レンジサイズディレクトリを設定してもよい。
【０１０１】
初期状態では、Sizeディレクトリ１３２０とレンジサイズディレクトリ１３３１〜１３３６が作成されている。ファイルＡ１３０１に関する処理を以下に示す。まずファイルＡ１３０１と同じファイルサイズがIndexディレクトリ１２５０にすでに登録されていないかチェックする。ファイルＡと同じ1.1Ｍのファイルはまだ登録されていないため、2Mディレクトリ１３３４にファイルサイズをディレクトリ名とする実サイズディレクトリ１３４１を作成する。ファイルＡ１３０１に関しては、1.1Mディレクトリ１３４１が作成される。そして、前記実サイズディレクトリに＜nohash＞．＜100（ファイルＡのinode番号）＞をファイル名とするクローン親ファイル１３５１を作成し、Exportディレクトリ１２４０に格納されているファイルＡ１３０１をクローン子ファイル化する。
【０１０２】
次に、ファイルＢ１３０２に関する処理を以下に示す。ファイルＡ１３０１同様、Indexディレクトリにまだ登録されていないファイルサイズのため、レンジサイズディレクトリである4Mディレクトリ１３３５に実サイズディレクトリである3.2Mディレクトリ１３４２を作成し、前記ディレクトリに＜nohash＞．＜240（ファイルＢのinode番号）＞をファイル名とするクローン親ファイル１３５２を作成し、Exportディレクトリ１２４０に格納されているファイルＢ１３０２をクローン子ファイル化する。
【０１０３】
次に、ファイルＣ１３０３に関する処理を以下に示す。ファイルＢ１３０２とファイルＣ１３０３は同一ファイルであるため、シングルインスタンス化されるべきファイルである。まずIndexディレクトリ１２５０にすでに同一ファイルサイズが登録されていないかチェックし、3.2Mディレクトリ１３４２があるため、すでに同一ファイルサイズのファイルが存在することが分かる。前記チェックがファイル重複検出のためのファイルサイズ比較であり、例えば、opendirシステムコールによって実サイズディレクトリをオープンしたり、もしくはstatシステムコールによって実サイズディレクトリ情報を取得するなどすると、その返り値で同一ファイルサイズのファイルがすでに存在するかが分かる。ファイルサイズ比較の結果、同一ファイルサイズのファイルがすでに存在したため、実サイズディレクトリ１３４２に格納されているファイル１３５２とファイルＣ１３０３でバイナリ比較を行う。
【０１０４】
ファイルＢ１３０２とファイルＣ１３０３は同一ファイルであるため、ファイル１３５２とファイルＣ１３０３のバイナリ比較の結果は一致する。バイナリ比較の結果、ファイルＣ１３０３を、ファイル１３５２をクローン親ファイルとするクローン子ファイルとする。これにより、ファイルＢ１３０２とファイルＣ１３０３のシングルインスタンス化が実現される。また、バイナリ比較時にハッシュ値計算も行う。ハッシュ関数は何を用いてもよく、ファイルの全データを使用する通常のハッシュ計算以外に、例えば、ファイルの先頭4KBと末尾4KBそれぞれを、SHA1（Secure  Hash  Algorithm  1）ハッシュ関数でハッシュ値を計算し、それぞれを加算した値の先頭5桁をハッシュ値として使用してもよい。最終的なファイル重複判定はバイナリ比較により行うため、計算コストの小さいハッシュ値計算方式でも十分である。この計算したハッシュ値をもちいて、ファイル１３５２を、＜nohash.240＞から＜5AF4B.240＞にファイル名をリネームする。
【０１０５】
次に、ファイルＦ１３０６に関する処理を以下に示す。ファイルＡ１３０１同様、Indexディレクトリにまだ登録されていないファイルサイズのため、レンジサイズディレクトリである4Mディレクトリ１３３５に実サイズディレクトリである3.42Mディレクトリ１３４３を作成し、前記ディレクトリに＜nohash＞．＜263（ファイルFのinode番号）＞をファイル名とするクローン親ファイル１３５３を作成し、Exportディレクトリ１２４０に格納されているファイルＦ１３０６をクローン子ファイル化する。
【０１０６】
次に、ファイルＧ１３０７に関する処理を以下に示す。ファイルＦ１３０６とファイルＧ１３０７は同一ファイルであるため、シングルインスタンス化されるべきファイルである。まずIndexディレクトリ１２５０にすでに同一ファイルサイズが登録されていないかチェックし、3.42Mディレクトリ１３４３があるため、すでに同一ファイルサイズのファイルが存在することが分かる。ファイルサイズ比較の結果、同一ファイルサイズのファイルがすでに存在したため、実サイズディレクトリ１３４３に格納されているファイル１３５３とファイルＧ１３０７でバイナリ比較を行う。
【０１０７】
ファイルＦ１３０６とファイルＧ１３０７は同一ファイルであるため、ファイル１３５３とファイルＧ１３０７のバイナリ比較の結果は一致する。そのため、ファイルＧ１３０７を、ファイル１３５３をクローン親ファイルとするクローン子ファイルとする。これにより、ファイルＦ１３０６とファイルＧ１３０７のシングルインスタンス化が実現される。また、バイナリ比較時にハッシュ値計算も行う。計算したハッシュ値をもちいて、ファイル１３５３を、＜nohash.263＞から＜2B44F.263＞にファイル名をリネームする。
【０１０８】
次に、ファイルＨ１３０８に関する処理を以下に示す。ファイルＨ１３０８は、ファイルＦ１３０６とファイルＧ１３０７とファイルサイズは等しいが、中身のデータが異なるため、シングルインスタンス化されるファイルではない。まずIndexディレクトリ１２５０にすでに同一ファイルサイズが登録されていないかチェックし、3.42Mディレクトリ１３４３があるため、すでに同一ファイルサイズのファイルが存在することが分かる。ファイルサイズ比較の結果、同一ファイルサイズのファイルがすでに存在したため、実サイズディレクトリ１３４３に格納されているファイル１３５３とファイルＨ１３０８でバイナリ比較を行う。
【０１０９】
ファイルＦ１３０６とファイルＨ１３０８は同一ファイルでないため、ファイル１３５３とファイルＨ１３０８のバイナリ比較の結果は一致しない。この時、以降の処理でファイルＨ１３０８と同一ファイルがあった場合、シングルインスタンス化するため、ファイルＨ１３０８をIndexディレクトリ１２５０に登録する。前記バイナリ比較時にハッシュ値計算を行っておき、3.42Mディレクトリ１３４３に＜ハッシュ値＞．＜ファイルＨのinode番号＞をファイル名（3AB8F.431）とするクローン親ファイル１３５４を作成し、Exportディレクトリ１２４０に格納されているファイルＨ１３０８をクローン子ファイル化する。
【０１１０】
バイナリ比較は、ファイルサイズが大きいファイルの場合はファイル全体がメモリ上に格納できないため、通常は一定サイズずつメモリに読込み、データ比較を行う。この時、データ不一致が発生した時点で、以降のデータ読込みはキャンセルしてしまってよい。そのため、ハッシュ値計算を先頭4KBと末尾4KBのデータを使用する方式としている場合は、バイナリ比較中にデータ不一致が発生した場合は、先頭から順にバイナリ比較を行うと末尾4KBのデータが読込まれていない場合がある。そこで、バイナリ比較は先頭と末尾をまず行う方式とすることで、ハッシュ値計算時のキャッシュヒット率をあげることができる。
【０１１１】
次に、ファイルＩ１３０９に関する処理を以下に示す。ファイルＨ１３０８とファイルＩ１３０９は同一ファイルであるため、シングルインスタンス化されるべきファイルである。まずIndexディレクトリ１２５０にすでに同一ファイルサイズが登録されていないかチェックし、3.42Mディレクトリ１３４３があるため、すでに同一ファイルサイズのファイルが存在することが分かる。ここでは同一ファイルサイズのファイルがすでに存在したため、実サイズディレクトリ１３４３に格納されているファイル１３５３及びファイル１３５４と、ファイルＩ１３０９でバイナリ比較を行う。ファイル１３５３とファイル１３５４はバイナリ比較の結果、バイナリ不一致であったためIndexディレクトリ１２５０に別々に登録されているので、実サイズディレクトリ内に複数ファイルが格納されている場合、それぞれのファイルのバイナリが異なることが保証されている。
【０１１２】
Indexディレクトリ１２５０に登録されているファイル１３５３とファイル１３５４はファイル名にハッシュ値が入っているため、ハッシュ値計算しなくてもハッシュ値比較を行うことができるが、ファイルＩ１３０９のハッシュ値は計算しないと分からないため、まずはファイルＩ１３０９とファイル１３５３のバイナリ比較を行い、バイナリ比較と一緒にハッシュ値計算を行う。ファイルＩ１３０９とファイル１３５３の中身のデータは異なるため、バイナリ比較の結果は、バイナリ不一致となる。
【０１１３】
次に、ファイルＩ１３０９とファイル１３５４の比較であるが、この時にはファイルＩ１３０９のハッシュ値が分かっているため、まずファイルＩ１３０９とファイル１３５４のハッシュ値比較を行う。ハッシュ値が一致した場合は、さらにバイナリ比較を行い、ハッシュ値若しくはバイナリ不一致だった場合は、実サイズディレクトリ内に次の比較対象がある場合は次のファイルとハッシュ値比較をする。ファイルＩ１３０９の場合は、ファイル１３５４とのハッシュ値比較の結果、ハッシュ値が一致し、さらにバイナリ比較の結果もバイナリ一致となる。
【０１１４】
そのため、ファイルＩ１３０９を、ファイル１３５４をクローン親ファイルとするクローン子ファイルとする。これにより、ファイルＨ１３０８とファイルＩ１３０９のシングルインスタンス化が実現される。なお、何れの実ファイルともハッシュ値若しくはバイナリがバイナリ不一致となった場合は、当該実サイズディレクトリに＜ハッシュ値＞．＜inode番号＞をファイル名とするクローン親ファイルを作成し、Exportディレクトリに格納されているファイルをクローン子ファイル化する。
【０１１５】
次に、ファイルＪ１３１０に関する処理を以下に示す。ファイルＨ１３０８、ファイルＩ１３０９及びファイルＪ１３１０は同一ファイルであるため、シングルインスタンス化されるべきファイルである。まずIndexディレクトリ１２５０にすでに同一ファイルサイズが登録されていないかチェックし、3.42Mディレクトリ１３４３があるため、すでに同一ファイルサイズのファイルが存在することが分かる。ファイルサイズ比較の結果、同一ファイルサイズのファイルがすでに存在するため、実サイズディレクトリ１３４３に格納されているファイル１３５３及びファイル１３５４と、ファイルＪ１３１０でバイナリ比較を行う。
【０１１６】
ファイルＪ１３１０とファイル１３５３の中身のデータは異なるため、バイナリ比較の結果は、バイナリ不一致となる。つぎに、ファイルＪ１３１０とファイル１３５４の比較であるが、この時にはファイルＪ１３１０のハッシュ値が分かっているため、まずファイルＪ１３１０とファイル１３５４のハッシュ値比較を行う。ファイルＪ１３１０とファイル１３５４とのハッシュ値比較の結果、ハッシュ値が一致し、さらにバイナリ比較の結果もバイナリ一致となる。そのため、ファイルＪ１３１０を、ファイル１３５４をクローン親ファイルとするクローン子ファイルとする。これにより、ファイルＨ１３０８、ファイルＩ１３０９及びファイルＪ１３１０のシングルインスタンス化が実現される。
【０１１７】
また、前記では実サイズディレクトリの1つ目のファイルとの比較はバイナリ比較、2つ目のファイルからハッシュ値比較としたが、まずExportディレクトリのファイルのハッシュ値を計算し、実サイズディレクトリの1つ目のファイルからハッシュ値比較としてもよい。ファイルサイズが大きくてバイナリ比較時間が長く、簡易なハッシュ計算であれば、1つ目のファイル比較からハッシュ値比較を用いた方がトータルの処理時間は短くなる場合がある。また逆にファイルサイズが小さくてバイナリ比較時間が短い場合は、実サイズディレクトリ内のファイルが２つなど少ない場合は、ハッシュ値比較を行わずにバイナリ比較のみで判定した方がトータルの処理時間が短くなる場合があるため、実サイズディレクトリ内の３つ目からや４つ目からなどで、ハッシュ値比較を行うとしてもよい。実サイズディレクトリ内の何個目からのファイル比較からハッシュ値比較を併用した方がトータルの処理時間が短くなるかは、比較対象のファイルサイズに依存するため、レンジサイズディレクトリごとに実サイズディレクトリ内の何個目からハッシュ値比較を行うかを変更してもよい。
【０１１８】
このように本発明は、まずファイルサイズ比較によりファイル重複検出を行い、ファイルサイズが一致したファイルに関してバイナリ比較を行う。ファイルサイズ比較の場合、ファイルのメタデータのみリードすればよいため、ハッシュ値計算のようにファイルの実データをリードする必要がなく、リード処理によるオーバーヘッドがなく処理が高速化できる。
【０１１９】
また、本願発明はファイルサイズが同じ場合にバイナリ比較の結果も同一である傾向の多いファイルサイズの大きなファイルに特に有効だが、ファイルサイズが小さいもので会ってもシングルインスタンス技術の目的である容量削減効果および処理の高速化に有効である。
【０１２０】
そして、バイナリ比較を行った時にハッシュ値計算も行い、Indexディレクトリにハッシュ値情報を追加することで、ファイルサイズは同じだが、中身のデータは異なるファイルが多かった場合には、ハッシュ値比較も可能とすることで、無駄なバイナリ比較を減らすことができる。
【０１２１】
（２）第２の実施形態
以下、本発明の第２の実施形態について説明する。なお、以下の説明では、第１の実施形態との相違点を主に説明し、第１の実施形態との共通点については説明を省略、或いは簡略する。
【０１２２】
本発明の第２の実施形態では、クローン親ファイルの自動削除処理について示す。クローン親ファイルは隠しディレクトリであるIndexディレクトリ１２５０に格納されているため、ユーザには非公開である。そのため、不要となったクローン親ファイルはＮＡＳデバイス１０００が削除しなければ、ゴミファイルとして残ってしまう。そこで、ＮＡＳデバイス１０００は、クローン親ファイルが不要となった時点で、自動的にクローン親ファイルが削除される機能を有する。例えば、前記機能はファイルシステム１１２５で実現される。クローン親ファイルが不要となるのは、クローン親ファイルを参照しているクローン子ファイルがなくなった時である。そのため、クローン子ファイルが削除された時、クローン親ファイルの削除処理を行うか判定する。
【０１２３】
図１４において、ファイルＢ１３０１０とファイルＣ１３０２０が、ファイル１３０３０をクローン親ファイルとしてシングルインスタンス化されている場合において、ファイルＢ１３０１０とファイルＣ１３０２０がユーザによって削除されて、ファイル１３０３０が自動削除される場合を例として示す。
【０１２４】
ユーザは、ＮＦＳクライアント１３０５０を使用して、ＮＦＳサーバプログラム１３０６０を介して、ファイルシステム１３０７０にアクセスする。ユーザには、Exportディレクトリ１２４０のファイルが公開されており、Indexディレクトリ１２５０のファイルは見えない。クローン親ファイルであるファイル１３０３０は、ファイルＢ１３０１０とファイルＣ１３０２０に参照されているため、参照カウンタは２となっている。まず、ユーザがファイルＢ１３０１０を削除する。クローン子ファイルが削除された場合、参照先であるクローン親ファイルの参照カウンタを−１する。これにより、クローン親ファイルであるファイル１３０３０の参照カウンタは１となる。クローン親ファイルであるファイル１３０３０は、まだファイルＣ１３０２０に参照されているため、削除されない。
【０１２５】
次に、ユーザがファイルＣ１３０２０を削除する。クローン親ファイルであるファイル１３０３０の参照カウンタは、さらに−１され、０となる。クローン親ファイルであるファイル１３０３０を参照しているクローン子ファイルがなくなったため、ファイル１３０３０は不要であるため、システムによって、例えばファイルシステム１３０７０によって、ファイル１３０３０は削除される。
【０１２６】
さらに、ファイル１３０３０が格納されていた実サイズディレクトリ１３０４０が空になったため、3.2MBのファイルサイズのファイルがIndexディレクトリ１２５０に登録されていないため、実サイズディレクトリ１３０４０も削除される。また、実サイズディレクトリの削除に関しては、ファイル分類プログラム１２３３において、ファイルサイズ比較時に、実サイズディレクトリは存在するが、実サイズディレクトリ内のファイル数が０の場合は、Indexディレクトリへのファイル登録処理が行われるようにすることで、前記実サイズディレクトリの削除処理を代替えしてもよい。
【０１２７】
図１５において、クローン親ファイルの削除判定処理のフローチャートを示す。本処理は、例えばファイルシステム１３０７０が実行する。ユーザがExportディレクトリ１２４０に格納されているクローン子ファイルを削除したのを契機に、ファイルシステム１３０７０が図１５で示す処理を実行する。
【０１２８】
Ｓ１４０１０において、クローン子ファイルが削除される。Ｓ１４０２０において、削除されたクローン子ファイルが参照しているクローン親ファイルの参照カウンタを−１する。Ｓ１４０３０において、前記クローン親ファイルの参照カウンタが０になった場合はＳ１４０４０に進み、０にならなかった場合は本処理を終了する。Ｓ１４０４０において、前記クローン親ファイルを削除する。
【０１２９】
Ｓ１４０５０において、前記クローン親ファイルが格納されていた実サイズディレクトリ１３０４０に格納されているファイル数が０になった場合はＳ１４０６０に進み、０にならなかった場合は本処理を終了する。Ｓ１４０６０において、前記実サイズディレクトリを削除し、処理を終了する。
【０１３０】
本処理により、クローン子ファイルが削除等によりなくなった場合には、不要となるクローン親ファイルが削除される事となる。これによりデータを持つクローン親ファイルがボリューム上に残される事がなくなり効率的にボリュームの記憶容量を使う事が出来る。また、実サイズディレクトリも削除するため、図１０のファイルサイズ比較において、空のディレクトリとの比較をすることもなくなるため、処理は高速化し、エラーも減少する。
【０１３１】
（３）第３の実施形態
以下、本発明の第３の実施形態について説明する。なお、以下の説明では、第１の実施形態との相違点を主に説明し、第１の実施形態との共通点については説明を省略、或いは簡略する。
【０１３２】
本発明の第３の実施形態では、スプリット処理について示す。スプリット処理とは、クローンファイルを通常ファイルに戻す処理であるが、本願発明において、シングルインスタンス化されたファイルを通常ファイルに戻す処理において、スプリット処理を利用する。スプリット処理すると、クローン親ファイルを参照しているクローン子ファイルが減るため、クローン親ファイルを参照しているクローン子ファイルがなくなった場合は、クローン親ファイルの削除も行う。
【０１３３】
スプリットが使用されるケースは、例えば、クローン子ファイルに更新が行われることで、クローン子ファイルとクローン親ファイルの差分が大きくなってきた場合にはクローン親ファイルのデータが無駄になる場合があり、前記状況を解消するために用いられたり、誤ったファイルをクローン子ファイル化してしまった場合や、クローン子ファイルへのアクセス頻度が上がったために通常ファイルに戻したい場合などに用いられる。
【０１３４】
図１６において、ファイルＢ１５０１０とファイルＣ１５０２０が、ファイル１５０３０をクローン親ファイルとしてシングルインスタンス化されている場合において、ファイルＢ１５０１０とファイルＣ１５０２０がスプリット処理された場合を例として示す。スプリット処理は、例えばＮＡＳマネージャ１５２００を用いて、システム管理者がスプリットしたいファイルを指定してスプリットコマンドをＮＡＳデバイス１０００に発行することで実行される。
【０１３５】
システム管理者が、まずファイルＢ１５０１０をスプリットする。ファイルＢ１５０１０が持っている更新データ以外の部分、つまりクローン親ファイルを参照している部分を、クローン親ファイルからクローン子ファイルにデータコピーし、ファイルＢ１５０１０がクローン子ファイルから通常ファイルに変換される。そして、参照先であったクローン親ファイルの参照カウンタを−１する。これにより、クローン親ファイルであるファイル１５０３０の参照カウンタは１となる。クローン親ファイルであるファイル１５０３０は、まだファイルＣ１５０２０に参照されているため、削除されない。
【０１３６】
次に、システム管理者が、ファイルＣ１５０２０をスプリットする。ファイルＣ１５０２０が持っている更新データ以外の部分、つまりクローン親ファイルを参照している部分を、クローン親ファイルからクローン子ファイルにデータコピーし、ファイルＣ１５０２０がクローン子ファイルから通常ファイルに変換される。そして、クローン親ファイルであるファイル１５０３０の参照カウンタは、さらに−１され、０となる。
【０１３７】
クローン親ファイルであるファイル１５０３０を参照しているクローン子ファイルがなくなったため、ファイル１５０３０は不要であるため、システムによって、例えばファイルシステム１５０７０によって、ファイル１５０３０は削除される。さらに、ファイル１５０３０が格納されていた実サイズディレクトリ１５０４０が空になったので、3.2MBのファイルサイズのファイルがIndexディレクトリ１２５０の登録されていないため、実サイズディレクトリ１５０４０も削除される。
【０１３８】
図１７において、スプリット処理のフローチャートを示す。本処理は、例えばファイルシステム１５０７０が実行する。システム管理者がＮＡＳマネージャ１５２００を用いてＮＡＳデバイス１０００にスプリットコマンドを発行し、前記コマンドを受領したＮＡＳデバイス１０００がファイルシステム１５０７０にスプリット処理開始を通知し、ファイルシステム１５０７０が図１７で示す処理を実行する。
【０１３９】
また、クローン子ファイルとクローン親ファイルの差分が大きくなってきたかどうかは、システム管理者には分かりにくいため、ファイルシステム１５０７０が判定する方式としてもよい。スプリットコマンド発行時に、クローン子ファイル側の更新データが全体の何%以上になったらスプリット処理を行うかのしきい値をオプション指定する。しきい値のオプション指定が省略された場合は、Ｓ１６００１の判定により、Ｓ１６０１０の処理から始まりスプリット処理が行われる。しきい値のオプションが指定された場合は、Ｓ１６００２において、クローン子ファイルが持つ更新データ容量をチェックし、しきい値を超えていればＳ１６０１０に進んでスプリット処理が行われる。しきい値を超えていなければスプリット処理は行われず、処理終了となる。
【０１４０】
さらに、スプリットコマンドはファイル指定、ディレクトリ指定、ファイルシステム指定をサポートする。ディレクトリ指定の場合は当該ディレクトリ内のファイル全てに関してスプリット処理が行われ、ファイルシステム指定の場合は当該ファイルシステム内のファイル全てに関してスプリット処理が行われる。
【０１４１】
Ｓ１６０１０において、クローン子ファイルが持っている更新データ以外の部分、つまりクローン親ファイルを参照している部分を、クローン親ファイルからクローン子ファイルにデータコピーする。これにより、クローン子ファイル側で全データを持った状態となる。Ｓ１６０２０において、クローン子ファイルのinode情報を変更して通常ファイルに変換する。Ｓ１６０３０において、通常ファイルに変換されたクローン子ファイルが参照しているクローン親ファイルの参照カウンタを−１する。
【０１４２】
Ｓ１６０４０において、前記クローン親ファイルの参照カウンタが０になった場合はＳ１６０５０に進み、０にならなかった場合は本処理を終了する。Ｓ１６０５０において、前記クローン親ファイルを削除する。Ｓ１６０６０において、前記クローン親ファイルが格納されていた実サイズディレクトリ１６０４０に格納されているファイル数が０になった場合はＳ１６０７０に進み、０にならなかった場合は本処理を終了する。Ｓ１６０７０において、前記実サイズディレクトリを削除し、処理を終了する。
【０１４３】
上記実施形態の効果として、クローン親ファイルとクローン子ファイルの差が大きくなった場合に、スプリットされるため、クローン親ファイルのデータが無駄になるのを防ぐことが出来る。以上、本発明の好適な幾つかの実施形態を説明したが、これらは本発明の説明のための例示であって、本発明の範囲をこれらの実施形態にのみ限定する趣旨ではない。本発明は、他の種々の形態でも実施することが可能である。
【０１４４】
最後に、ここで述べたプロセス及び技術は本質的に如何なる特定の装置に関連することはなく、コンポーネントの如何なる相応しい組み合わせによってでも実装できることを理解する必要がある。更に、汎用目的の多様なタイプのデバイスがここでの記述に従って使用可能である。
【０１４５】
加えて、本技術分野の通常の知識を有する者には、本発明のその他の実装がここに開示された本発明の明細書及び実施形態の考察から容易に明らかになる。明細書と具体例は典型的なものに過ぎず、記述された実施形態の多様な態様及び／又はコンポーネントは、データを管理する機能を有するコンピュータ化ストレージシステムに於いて、単独又は如何なる組み合わせでも使用することが出来る。
【符号の説明】
【０１４６】
１０００  ＮＡＳデバイス
１１００  ＮＡＳヘッド
１１２２  NOTIFYプログラム
１１２３  ポリシー判定プログラム
１１２４  シングルインスタンスプログラム
１１２５  ファイルシステム
１１５０  ＮＡＳストレージシステム
１１６０  ストレージコントローラ
１１８０、１１８１、１１８２  ＮＡＳクライアント
１２４０  Exportディレクトリ
１２５０  Indexディレクトリ
【図１】
0005856680.tif 000002
【図２】
0005856680.tif 000003
【図３】
0005856680.tif 000004
【図４】
0005856680.tif 000005
【図５】
0005856680.tif 000006
【図６】
0005856680.tif 000007
【図７】
0005856680.tif 000008
【図８】
0005856680.tif 000009
【図９】
0005856680.tif 000010
【図１０】
0005856680.tif 000011
【図１１】
0005856680.tif 000012
【図１２】
0005856680.tif 000013
【図１３】
0005856680.tif 000014
【図１４】
0005856680.tif 000015
【図１５】
0005856680.tif 000016
【図１６】
0005856680.tif 000017
【図１７】
0005856680.tif 000018