【実施例1】
【0021】
図1〜
図11を用いて第1実施例を説明する。
図1は、本実施例によるストレージシステムを含む情報処理システムの全体構成を示す。情報処理システムは、例えば、少なくとも一つのクライアント端末10と、少なくとも一つの仮想化サーバ20と、少なくとも一つのファイルサーバ30と、少なくとも一つのストレージ装置40と、少なくとも一つの管理端末50を含んで構成されている。
【0022】
クライアント端末10は、エンドユーザが仮想PC201(
図2参照)を利用するために使用する計算機である。クライアント端末10は、例えば、CPU11と、メモリ12と、ネットワークインターフェース13とを含んで構成されており、それらは内部バス14によって相互に接続されている。
【0023】
メモリ12には、仮想化サーバ20で動作する仮想PC201へ接続するための仮想デスクトップクライアントプログラム101が格納されている。CPU11は、メモリ12に格納されたプログラム101を実行する。以降の説明では、特に断らない限り、プログラムはCPUによって実行される。
【0024】
仮想化サーバ20は、仮想PC201を動作させる計算機である。仮想化サーバ20の内部処理は後述する。
【0025】
LAN(Local Area Network)60は、クライアント端末10と仮想化サーバ20と管理端末50とファイルサーバ30とを接続するバスである。LAN60は、Ethernet(登録商標)や無線LANアクセスポイント装置などを用いて構成しても良い。本実施例はLAN60の接続形態を限定しない。
【0026】
管理端末50は、ストレージシステムを管理するために用いる計算機であり、ストレージシステムの管理者によって使用される。管理端末50は、例えば、CPU51と、メモリ52と、ネットワークインターフェース53とを含んで構成されており、それらは内部バス54により相互に接続されている。メモリ52には、管理インターフェース501と、管理プログラム502とが格納されている。
【0027】
管理インターフェース501は、GUI(Graphical User Interface)による設定画面を管理者に提供するためのプログラムである。管理プログラム502は、管理インターフェース501を通して入力された設定値をファイルサーバ30へ送信して値を設定するためのプログラムである。
【0028】
管理端末50は、管理端末50に情報を入力するための情報入力装置と、管理端末50から情報を出力するための情報出力装置を備える(いずれも不図示)。情報入力装置としては、例えば、キーボード、ポインティングデバイス、視線検出装置、動作検出装置、音声入力装置などがある。情報出力装置としては、例えば、ディスプレイ、音声合成装置、プリンタなどがある。
【0029】
ファイルサーバ30は、仮想化サーバ20にファイル共有サービスを提供する計算機である。ファイルサーバ30の内部処理は後述する。
【0030】
ストレージ装置40は、ファイルサーバ30と例えばSAN(Storage Area Network)などのネットワーク61を介して相互に接続されるディスク装置である。ストレージ装置40は、ファイルサーバ30が利用するディスク領域を持つ。ストレージ装置40の内部処理は後述する。
【0031】
図2は、仮想化サーバ20の構成を示す。仮想化サーバ20はファイルサーバ30と共に「コントローラ」の一例を構成する。さらに、仮想化サーバ20は、「仮想化管理サーバ」の一例に該当する。仮想化サーバ20は、例えば、CPU21と、メモリ22と、ネットワークインターフェース23とを含んで構成され、それらはバス24で相互に接続されている。
【0032】
メモリ22には、例えば、仮想PC201と、ハイパバイザプログラム202と、ファイルアクセスプログラム203とが格納されている。仮想PC201は、仮想的な計算機であり、ハイパバイザプログラム202によって作成される。仮想PC201は、物理的な計算機と同様の機能を持つ。仮想PC201上では、仮想デスクトップサーバプログラム2011と、アプリケーションプログラム2012が動作する。
【0033】
仮想PC201の利用するディスクは、ストレージ装置40に格納されたファイル(VMDKファイル)であり、ハイパバイザプログラム202から割り当てられる。仮想デスクトップサーバプログラム2011は、クライアント端末10に仮想PC201のデスクトップ環境を提供するためのプログラムである。仮想デスクトップサーバプログラム2011は、クライアント端末10の仮想デスクトップクライアントプログラム101からアクセス要求を受け付けると、デスクトップ環境をネットワーク60経由で、クライアント端末10へ提供する。
【0034】
アプリケーションプログラム2012は、例えば、文書や図形または表などを作成したり編集したりするためのオフィスソフトウェア、ウェブサーバを閲覧するためのウェブブラウザ、電子メールを送受信するための電子メール管理ソフトウェアなどのプログラムである。
【0035】
ハイパバイザプログラム202は、仮想PC201を作成するコンピュータプログラムである。ハイパバイザプログラム202は、仮想PC201の起動および停止を管理したり、CPU資源やディスク資源やメモリ資源などの割り当てなどを管理したりする。
【0036】
ファイルアクセスプログラム203は、ファイルサーバ30の提供するファイル共有サービスを利用するためのプログラムである。仮想化サーバ20は、ファイルアクセスプログラム203を通してファイルサーバ30へアクセスし、ファイルサーバ30に接続されたストレージ装置40に格納されているVMDKファイルへアクセスする。
【0037】
図3は、ファイルサーバ30の構成を示す。ファイルサーバ30は、仮想化サーバ20と共に「コントローラ」の一例を構成する。ファイルサーバ30は、「ファイル管理コントローラ」の一例に該当する。仮想化サーバ20を第1コントローラまたは第2コントローラと呼ぶ場合、ファイルサーバ30を第2コントローラまたは第1コントローラと呼ぶこともできる。
【0038】
ファイルサーバ30は、例えば、CPU31と、メモリ32と、ネットワークインターフェース33と、SAS(Serial Attached SCSI)などを利用するストレージインターフェース34とを含んで構成されており、それらはバス35で相互に接続されている。
【0039】
メモリ32には、例えば、ファイルサーバプログラム301と、ファイルシステムプログラム302と、ディスク45から読み込んだファイル303と、第1キャッシュ304と、第2キャッシュ305とが格納されている。
【0040】
ファイルサーバプログラム301は、仮想化サーバ20のファイルアクセスプログラム203から発行されるファイルアクセス要求を受理し、ファイルの読み書き処理を行うプログラムである。ファイルシステムプログラム302は、ディスク45に格納されているデータをファイルとして管理し、リードデータやライトデータのキャッシュ制御を行うプログラムである。
【0041】
ファイル303は、ファイル管理情報3031と、データブロック3032とから構成される。ファイル管理情報3031とは、具体的には、所有ユーザIDおよびデータブロック3032の格納先情報などを持つinodeである。データブロック3032は、例えばオフィス文書の内容といったファイルの内容(コンテンツ)である。
図3は、ディスク45に格納されたファイルのデータがメモリ32へ読み込まれている状態を示す。
【0042】
第1キャッシュ領域304は、後述するクローンファイル303Bのファイルキャッシュデータ71B(
図7参照)を格納するためのメモリ領域である。第2キャッシュ305は、後述する共有ファイル303Aのファイルキャッシュデータ71A(
図7参照)を格納するためのメモリ領域である。
【0043】
第1キャッシュ領域304と第2キャッシュ領域305とは、メモリ32の領域上に明確に区別して設定されているわけではない。クローンファイル303Bのキャッシュデータ71Bを記憶するセグメント(記憶単位)の集合体が第1キャッシュ領域304として認識される。同様に、共有ファイル303Aのキャッシュデータ71Aを記憶するセグメントの集合体が第2キャッシュ領域305として認識される。
【0044】
以下の説明では、ファイルキャッシュされるデータをキャッシュデータまたはファイルキャッシュと略する場合がある。第1キャッシュ領域304および第2キャッシュ領域305を第1キャッシュ304および第2キャッシュ305と略する場合がある。
【0045】
ファイルサーバ30は、ストレージインターフェース34からFC(Fibre Channel)などのネットワーク61を介してストレージ装置40と通信可能に接続されている。
【0046】
ファイルサーバ30は、共有ファイル303Aを参照する複数のクローンファイル303Bからなるグループを複数管理することができる。つまり、或る共有ファイル303Aを参照するクローンファイル群303Bと、他の共有ファイル303Aを参照する他のクローンファイル群303Bを、一つのファイルサーバ30で管理できる。
【0047】
図4は、ストレージ装置40の構成を示す。ストレージ装置40は、例えば、CPU41と、メモリ42と、ストレージインターフェース43と、ディスクコントローラ44とを含んで構成され、それらはバス46で相互に接続されている。ディスクコントローラ44と少なくとも一つ以上のディスク45とは、冗長化された通信経路を介して相互に接続されている。
【0048】
メモリ42は、例えば、ストレージを管理するためのストレージ管理プログラム401を格納している。ディスクコントローラ44は、RAID(Redundant Array of Inexpensive Disks)機能を有し、複数のディスク45を冗長化させることにより、ディスク45の耐障害性を向上させている。
【0049】
「記憶装置」の例であるディスク45としては、例えば、ハードディスクデバイス、半導体メモリデバイス、光ディスクデバイス、光磁気ディスクデバイス等のデータを読み書き可能な種々の記憶装置を利用可能である。
【0050】
例えば、FC(Fibre Channel)ディスク、SCSI(Small Computer System Interface)ディスク、SATAディスク、ATA(AT Attachment)ディスク、SAS(Serial Attached SCSI)ディスク等を用いることができる。また例えば、フラッシュメモリ、FeRAM(Ferroelectric Random Access Memory)、MRAM(MagnetoresistiveRandom Access Memory)、相変化メモリ(Ovonic Unified Memory)、RRAM(登録商標)等の種々の記憶装置を用いることもできる。さらに、例えば、フラッシュメモリデバイスとハードディスクデバイスのように、種類の異なる記憶装置をストレージ装置40内に混在させる構成でもよい。
【0051】
ストレージ管理プログラム401は、ディスクコントローラ44の持つRAID機能を管理するプログラムである。例えば、ストレージ管理プログラム401は、「6D+2P」等のような冗長化構成を設定する。本実施例において、ストレージ装置40は、冗長化機能を備えているストレージでもよいし、備えていないストレージでもよい。ストレージ装置40は、ファイル303のデータブロック3032を保存する機能を備えていればよく、記憶装置の種類および制御方法などは限定しない。
【0052】
なお、ディスク45に格納されているデータは、重複排除処理が実施されており、基本的に重複データはディスク45に記憶されていないものとして説明する。
【0053】
図5は、クローンファイルの構造を示す。この構造は、ディスク45とファイルサーバ30のメモリ32とに作成される。ファイルアクセス時に、ディスク45からファイルが読み込まれることで、メモリ32上に
図5に示す構造が作成される。
【0054】
クローンファイル303Bへのデータ書き込みなどにより、この構造が更新されると、ディスク45へ書き戻される。このように、この構造は、ディスク45とメモリ32とで一致するように制御される。
【0055】
クローンファイル303Bは、共有ファイル303Aを参照するファイルである。共有ファイル303Aは、複数のクローンファイル303Bが共有するデータブロック3032を保持するファイルである。
図5に示す例では、2つのクローンファイル303Bが1つの共有ファイル303Aを参照している。各クローンファイル303Bと共有ファイル303Aとは、ファイル管理情報3031と、ブロックポインタ3033と、データブロック3032とを含んで構成される。理解の容易のために、クローンファイル303Bに関する構成には符号の末尾に「B」を付し、共有ファイル303Aに関する構成には符号の末尾に「A」を付す。両構成を特に区別しない場合は、符号の末尾に「A」も「B」も付さずに説明する。
【0056】
ファイル管理情報3031は、ファイルの種類や所有者などを保持する管理データであり、例えば、個々のファイルを識別する識別番号D11と、参照情報D12と、フラグD13とを含む。さらに、後述のように、ファイル管理情報3031は、キャッシュ管理データ70(
図7参照)を含むこともできる。それらデータの利用は後述する。
【0057】
ブロックポインタ3033は、ストレージ装置40のディスク45に格納されたデータブロック3032を参照するデータである。共有ファイル303Aのデータブロック3032Aは、複数のクローンファイル303Bから共有されている。いずれのクローンファイル303Bが更新された場合でも、共有ファイル303Aのデータブロック3032Aは、更新されない。一方、各クローンファイル303Bのデータブロック3032Bは、クローンファイルの更新データである。つまり、クローンファイル303Bのデータブロック3032Bは、共有ファイルのデータブロック3032Aとの差分である。
【0058】
個々のファイルを一意に識別するために、識別番号D11が用いられる。識別番号D11は、ファイル毎に異なる番号が割り当てられる。識別番号は識別情報、識別子などと呼び変えてもよい。
【0059】
参照情報D12Bは、クローンファイル303Bが共有ファイル303Aを参照するために用いるデータである。参照情報D12Bには、参照先の共有ファイル303Aのアドレスと、その共有ファイル303Aの識別番号D11Aとが格納される。それらに限らず、参照情報D12Bは、共有ファイル303Aを特定できる情報であれば何でもよい。本実施例は、参照情報D12Bの構成を限定しない。
【0060】
クローンファイル303Bと共有ファイル303Aとを識別するために、フラグD13には、クローンファイルフラグまたは共有ファイルフラグのいずれか一方が設定されるようになっている。ファイルがクローンファイル303Bである場合、クローンファイルフラグがフラグD13Bへ設定される。一方、ファイルが共有ファイル303Aである場合は、共有ファイルフラグがフラグD13Aに設定される。
【0061】
図5に示すクローンファイルの構造により、複数のクローンファイル303Bは、共有ファイル303Aが保持するデータを共有することができる。また、共有ファイル303Aを参照する新たなクローンファイル303Bを作成する場合、新規作成したクローンファイル303Bの参照情報D12Bに、参照先の共有ファイル303Aについての参照情報D12Bを設定する。このように動作することによって、ファイルを丸ごとコピーする場合に比べて、クローンファイルを高速かつ小さいデータサイズで作成できる。
【0062】
図6は、クローンファイル303Bの構成を示す。クローンファイル303Bは、クローンファイル303Bへ格納されたデータブロック3032Bと、共有ファイル303Aに格納されたデータブロック3032Aとを重ね合わせることで構成される。
【0063】
例えばクローンファイル303Bが作成されたばかりで未だ更新されていない場合に、そのクローンファイル303Bについて読出し要求を受領すると、共有ファイル303Aのデータブロック3032Aが読出し要求の発行元に返される。読出し対象のクローンファイル303Bは、参照先である共有ファイル303Aとの差分データを持っていないためである。
【0064】
これに対し、クローンファイル303Bにデータが書き込まれてファイル内容が更新されている場合において、そのクローンファイル303Bについての読出し要求を受領すると、クローンファイル303Bのデータブロック3032Bまたは共有ファイル303Aのデータブロック3032Aのいずれかが読み出し要求の発行元に返信される。
【0065】
読出し対象データがクローンファイル303Bの持つ差分データである場合、クローンファイル303Bのデータブロック3032Bが読み出し要求の発行元に返される。読出し対象データが参照先である共有ファイル303Aの持つ共有データである場合、共有ファイル303Aのデータブロック3032Aが読み出し要求の発行元に返信される。
【0066】
図6の例では、クローンファイルの0番目のブロックを読み込むと、クローンファイル303Bの差分データ「0’」が読み込まれる。差分データが無いクローンファイルの2番目のブロックを読み込むと、共有ファイル303Aの持つ共有データ「2」が読み込まれる。このように、クローンファイル303Bのデータブロック3032Bは、共有ファイル303Aのデータブロック3032Aをマスクするように構成されている。
【0067】
図7は、ファイルキャッシュの構造を示す。キャッシュ管理データ70は、ファイルサーバ30のメモリ32に読み込まれたファイル管理情報3031に追加される。ディスク45のデータブロック3032からファイルサーバ30のメモリ32へ読み込まれたデータをキャッシュデータ71として管理するため、キャッシュ管理データ70は、メモリアドレスなどをキーとしてキャッシュデータ71を参照する。
【0068】
アプリケーションプログラム2012がファイルへアクセスすると、キャッシュ管理データ70の参照情報を用いてキャッシュデータ71を特定し、データを取得する。また、ディスク45のデータブロック3032からメモリ32へ読み込まれていない部分は、キャッシュデータ71には現れない。
【0069】
ファイルキャッシュデータ71は、ファイル毎に作成される。つまり、クローンファイル303Bのファイルキャッシュデータ71Bと共有ファイル303Aのファイルキャッシュデータ71Aとは、別々に管理される。前述のとおり、クローンファイル303Bのファイルキャッシュデータ71Bは第1キャッシュ304として、共有ファイル303Aのファイルキャッシュ71Aは第2キャッシュ305として、認識される。
【0070】
図8は、ファイルシステムプログラム302がファイルキャッシュを検索する動作の概要を示す図である。
【0071】
ファイルサーバ30のメモリ32に読み込まれたクローンファイル303Bのファイル管理情報3031Bの参照情報D12Bには、メモリ32に読み込まれた共有ファイル303Aのメモリアドレスが設定されている。前述のとおり、共有ファイル303Aのファイル管理情報3031Aが特定できるのであれば、参照情報D12Bにはどのような値を用いても良い。
【0072】
クローンファイル303Bのキャッシュ管理データ70Bには、クローンファイル303Bのデータブロック3032Bのキャッシュデータ71B(第1キャッシュ304のデータ)の管理情報が格納される。共有ファイル303Aのキャッシュ管理データ70Aには、共有ファイル303Aのデータブロック3032Aのキャッシュデータ71A(第2キャッシュ305のデータ)の管理情報が格納される。
【0073】
ファイルシステムプログラム302によるファイルキャッシュの検索動作の概要を説明する。ファイルサーバプログラム301は、仮想化サーバ20のファイルアクセスプログラム203からクローンファイル303Bへのアクセス要求を受理すると、ファイルシステムプログラム302へファイルアクセス要求を発行する。
【0074】
ファイルシステムプログラム302は、アクセス先のクローンファイル303Bについて第1キャッシュ304のキャッシュデータ71Bを調べる。ファイルシステムプログラム302は、第1キャッシュ304のキャッシュデータ71Bにアクセス対象データがある場合、そのデータをファイルサーバプログラム301へ返却する(S1)。
【0075】
ファイルシステムプログラム302は、キャッシュデータ71Bにアクセス対象データが無い場合、ディスク45にアクセス対象データがあるかを調べる(S2)。アクセス対象データがキャッシュデータ71Bには無く、ディスク45に記憶されている場合とは、例えば、アクセス対象データを初めて読み出す場合などである。ファイルシステムプログラム302は、ディスク45にアクセス対象データ(ここでは、データ「1’」のブロック)が有る場合、そのデータをメモリ32に読み込み、第1キャッシュ304として保持する(S3)。
【0076】
ディスク45のクローンファイル303Bにアクセス対象データ(ここではデータ「2’」のブロック)が無い場合、ファイルシステムプログラム302は、共有ファイル303Aのキャッシュデータ71Aを有する第2キャッシュ305を検索する(S4)。
【0077】
ファイルシステムプログラム302は、第2キャッシュ305にアクセス対象データがある場合、そのデータをファイルサーバプログラム301へ返却する。ファイルシステムプログラム302は、アクセス対象データ(ここではデータ「2」のブロック)が第2キャッシュ305に無く、ディスク45内の共有ファイル303Aに有る場合、そのデータをメモリ32へ読み込み、第2キャッシュ305のキャッシュデータ71Aとして保持する(S5)。
【0078】
ファイルシステムプログラム302は、ディスク45の共有ファイル303Aにもアクセス対象データが無い場合、ファイルサーバプログラム301へ「0」で埋めたゼロパディングデータを返却する(S6)。
【0079】
以上のようにファイルシステムプログラム302が動作することによって、
図8のクローンファイル303B(1)を読み込んだ場合に、クローンファイル303B(1)にデータブロック3032が無ければ、共有ファイル303Aへ第2キャッシュ305が設定される。
【0080】
従って、これ以降に、クローンファイル303B(2)を読み込んだ場合、第2キャッシュ305のキャッシュデータ71Aを利用できる。このように、本実施例では、共有ファイル303Aのデータブロック3032Aのキャッシュデータ71Aを、複数のクローンファイル303Bで共有できる。その結果、共有ファイル303Aのデータブロック3032Aは1度だけディスク45から読み込んで、第2キャッシュ305のキャッシュデータ71Aとして管理すればよい。この結果、例えば、同一OSが複数の仮想PC201で稼働する場合などでは、複数のクローンファイル303Bが1つの共有ファイル303Aのキャッシュデータ71Aを比較的多く共有でき、共有効果が高まるため、ディスク45へのI/O発行数を削減できる。
【0081】
図9は、ファイルシステムプログラム302がファイルキャッシュを検索する処理のフローチャートである。ファイルシステムプログラム302は、ファイルアクセス要求を受理すると、対象データについて、クローンファイル303Bの第1キャッシュ304または共有ファイル303Aの第2キャッシュ305を検索する。ファイルシステムプログラム302は、まず最初に、クローンファイル303Bの第1キャッシュ304にキャッシュデータ71Bが設定されているかどうかを調べる(S11)。
【0082】
ファイルシステムプログラム302は、第1キャッシュ304にキャッシュデータ71Bが設定されていると判定した場合(S11:YES)、そのキャッシュデータ71Bを呼び出し元へ返却して、本処理を終了する(S19)。
【0083】
一方、ファイルシステムプログラム302は、第1キャッシュ304にキャッシュデータ71Bが設定されていないと判定した場合(S11:NO)、クローンファイル303Bのデータブロック3032Bがあるかどうかを調べる(S12)。ファイルシステムプログラム302は、差分データを格納するデータブロック3032Bがあると判定した場合(S12:YES)、そのデータブロック3032Bをキャッシュデータ71Bへ読み込む(S13)。ファイルシステムプログラム302は、読み込んだデータを第1キャッシュ304に属するキャッシュデータとし、そのデータを呼び出し元へ返却して本処理を終了する(S19)。
【0084】
ファイルシステムプログラム302は、クローンファイル303Bにデータブロック3032Bが無いと判定した場合(S12:NO)、共有ファイル303Aの第2キャッシュ305にキャッシュデータ71Aがあるか調べる(S14)。ファイルシステムプログラム302は、キャッシュデータ71Aがあると判定した場合(S14:YES)、ステップ20以降の処理を実施する。
【0085】
一方、ファイルシステムプログラム302は、第2キャッシュ305にキャッシュデータ71Aが無いと判定した場合(S14:NO)、共有ファイル303Aのデータブロック3032Aがあるかどうかを調べる(S15)。ファイルシステムプログラム302は、共有ファイル303Aのデータブロック3032Aがあると判定した場合(S15:YES)、そのデータを読み出して第2キャッシュ305へ設定する(S16)。そして、キャッシュ検索処理がクローンファイルの部分書き込みであるか判定する(S50)。部分書き込みであった場合(S50:YES)、第2キャッシュ305のデータを第1キャッシュ304へコピーし(S51)、第1キャッシュのデータを呼び出し元へ返却する(S19)。一方、部分書き込みで無かった場合(S50:NO)、第2キャッシュ305のデータを呼び出し元へ返却する(S17)。ファイルシステムプログラム302は、共有ファイル303Aにデータブロック3032Aが無いと判定した場合(S15:NO)、0で埋められたデータを呼び出し元へ返却する(S18)。
【0086】
以上に説明したようにファイルシステムプログラム302が動作すると、クローンファイル303Bのデータブロック3032Bは第1キャッシュ304へ設定され、共有ファイル303Aのデータブロック3032Aは第2キャッシュ305へ設定される。その結果、複数のクローンファイル303Bが共有ファイル303Aのキャッシュデータ71Aを共有することができる。
【0087】
図10は、ファイルサーバ30のファイルシステムプログラム302がファイルを読み込む処理のフローチャートを示す。
【0088】
エンドユーザは、クライアント端末10の仮想デスクトップクライアントプログラム101を用いて、仮想化サーバ20の仮想デスクトップサーバプログラム2011へ接続する。仮想デスクトップサーバプログラム2011は、アプリケーションプログラム2012を動作させる。アプリケーションプログラム2012が、クローンファイル303Bとして作成されたVMDKファイルのデータブロック3032を読み込む場合、アプリケーションプログラム2012は、ハイパバイザプログラム202を通して、ファイルアクセスプログラム203を呼び出す。
【0089】
呼び出されたファイルアクセスプログラム203は、ファイルサーバ30のファイルサーバプログラム301へファイル読み込み要求を送信する。ファイルサーバ30のファイルサーバプログラム301は、ファイル読み込み要求を受理する(S31)。
【0090】
ファイルサーバプログラム301はファイルシステムプログラム302へファイル読み込み要求を送信し、ファイルシステムプログラム302は、そのファイル読み込み要求を受理して処理を行う(S32)。
【0091】
ファイルシステムプログラム302は、
図9で述べたキャッシュ検索処理を呼び出す(S33)。キャッシュ検索処理によって、VMDKファイルのデータブロック3032のデータが読み込まれて、そのデータが返却される。ファイルシステムプログラム302は、キャッシュ検索処理から返却されたデータブロック3032を、ファイルサーバプログラム301へ返却する(S34)。
【0092】
ファイルサーバプログラム301は、ファイルアクセスプログラム203へデータを返却する(S35)。仮想化サーバ20のファイルアクセスプログラム203は、受け取ったデータを、ハイパバイザプログラム202を通してアプリケーションプログラム2012に渡す。
【0093】
図11は、ファイルサーバ30のファイルシステムプログラム302が実行するファイル書き込み処理のフローチャートである。
【0094】
エンドユーザは、クライアント端末10の仮想デスクトップクライアントプログラム101を用いて、仮想化サーバ20の仮想デスクトップサーバプログラム2011へ接続する。仮想デスクトップサーバプログラム2011は、アプリケーションプログラム2012を動作させる。アプリケーションプログラム2012が、クローンファイル303Bとして作成されたVMDKファイルのデータブロック3032にデータを書き込む場合、アプリケーションプログラム2012は、ハイパバイザプログラム202を通して、ファイルアクセスプログラム203を呼び出す。
【0095】
呼び出されたファイルアクセスプログラム203は、ファイルサーバ30のファイルサーバプログラム301へファイル書き込み要求および書き込みデータを送信する。ファイルサーバプログラム301は、そのファイル書き込み要求を受理し、書き込みデータを受け取る(S41)。ファイルサーバプログラム301は、ファイルシステムプログラム302へファイル書き込み要求および書き込みデータを送信し、ファイルシステムプログラム302がファイル書き込み要求を受理する(S41)。
【0096】
ファイルシステムプログラム302は、受け取った書き込みデータのサイズを調べる(S42)。すなわち、ファイルシステムプログラム302は、書き込みデータサイズがファイルシステムプログラム302のデータ管理サイズであるブロックサイズと等しいか調べる(S42)。
【0097】
ここで、ファイルシステムプログラム302のデータ管理単位であるブロックとファイル303のデータの書き換えとの関係について説明する。ファイルシステムプログラム302は、ファイル303に保存されているデータを、ブロックと呼ぶ大きさに区切って管理している。
【0098】
ファイルシステムプログラム302は、ブロック単位で、ファイルのデータを読み書きする。ブロックの大きさは、例えば、4KBである。ファイルサイズが4KBの大きさの場合は1ブロックとなる。ファイルシステムプログラム302は、4KB未満のデータを用いてブロックを更新する場合(部分更新)、ディスク45からメモリ32へデータを読み込み、更新データで内容を書き換えたデータをそのブロックへ書き込む。
【0099】
4KBのデータの場合、ブロック全体が書き換えられるため、ディスク45からメモリ32へデータを読み込む必要はない。ファイルサイズが5KBの大きさの場合は、2ブロックとなる。このファイルを書き換える場合、ファイルシステムプログラム302は、まず先頭の4KB(1ブロック目)を書き換え、次に、後半の1KB(2ブロック目)を部分更新する。なお、2ブロック目のデータのうち後半の3KBは使用しない。このように、ファイル303に格納されているデータはある大きさのブロックに分けられて管理されており、その大きさの単位で読み書きされる。
【0100】
図11に戻る。ステップS42で、書き込みデータサイズがブロックサイズと同じサイズであると判定した場合、ファイルシステムプログラム302は、第1キャッシュ304へデータを書き込む(S43)。ファイルシステムプログラム302は、第1キャッシュ304に書き込んだデータをディスク45へ書き込む(S46)。ファイルシステムプログラム302は、書き込みデータが全て処理したか判断する(S47)。ファイルシステムプログラム302は、書き込みが終わっていないと判定した場合(S47:NO)、次の書き込みデータブロックを選択して(S48)、ステップS42に戻る。
【0101】
ステップS42で、書き込みデータの大きさがファイルシステムプログラム302で扱うブロックサイズより小さいと判定した場合(S42:NO)、ファイルシステムプログラム302は、部分更新を行うために、
図9で述べたキャッシュ検索処理を呼び出す(S44)。ファイルシステムプログラム302は、第1キャッシュ304へデータを部分的に書き込み(S45)、ステップS46以降を実行する。
【0102】
ファイルシステムプログラム302は、ステップS47で、受信した書き込みデータを全て書き込んだと判断した場合(S47:YES)、書き込み結果をファイルサーバプログラム301へ返却する(S49)。
【0103】
ファイルサーバプログラム301は、ファイルシステムプログラム302から受領した書込み結果を、ファイルアクセスプログラム203へ返却する。仮想化サーバ20のファイルアクセスプログラム203は、ハイパバイザプログラム202を通して、アプリケーションプログラム2012へ書き込み結果を渡す。
【0104】
以上のように本実施例では、クローンファイル303Bに格納されているデータ(つまり、クローンファイル303Bへ書き込まれた差分データ)については、第1キャッシュ304に格納されファイル毎に管理される。一方でファイルクローン機能により作成した複数のクローンファイル303Bで共有されるデータについては共有ファイル303Aのファイルキャッシュ71(第2キャッシュ305のデータ)に格納されて共有される。よって、例えば、同じOSが動作する仮想PC201を多量に作成する場合などのように、1つの共有ファイル303Aを複製して大量のクローンファイル303Bを生成する場合に、本実施例によればクローン毎に同じデータをキャッシュする必要がなくなり、効率的なキャッシュの利用を可能とする。
【0105】
従って、先に実行されたクローンファイル303Bへのファイルアクセスによって読み込まれたキャッシュデータ71Aを、次のクローンファイル303Bについてのファイルアクセス処理で利用することができる。この結果、ディスク45へのI/O数を削減でき、ファイルサーバ30およびストレージ装置40の負荷を軽減できる。又、読み出しは、第1キャッシュ304に対象データが無い場合に第2キャッシュ305を検索するようにすることで、新たな計算負荷等を要求せずに、新たな書込みを受けて差分データを有するクローンファイル含めて差分データと共有データを矛盾なく読み出すことができる。