(57)【特許請求の範囲】
【請求項１】
プロセッサにより実行されると該プロセッサに、
ランダムアクセスメモリ内に仮想ディスクファイルのログのインスタンスを生成し、前記ログはログエントリの順序付きシーケンスを有し、各ログエントリは、前記シーケンス内の位置を示す識別子を有し、前記仮想ディスクファイルのメタデータの変更を記述するために作成され、
前記識別子に基づき前記ログ内のログエントリを識別し、該ログエントリは、前記仮想ディスクファイルのメタデータの変更を記憶装置に適用するためにキャッシュされた入力／出力ジョブを前記記憶装置にコミットする要求が発行された後に生成された、前記ログ内の最古のログエントリであり、
前記識別したログエントリの識別子を新たに生成したログエントリに追加し、
前記新たに生成したログエントリを前記ログに書き込ませる、
命令を有するコンピュータプログラム。
【請求項２】
前記命令は、実行されると前記プロセッサに、さらに、
キャッシュされた入力／出力ジョブをコミットさせる要求の受信に応答して、前記ログエントリ及び前記新たに生成したログエントリにより識別される前記仮想ディスクファイルに対する変更を適用させる、
請求項１に記載のコンピュータプログラム。
【請求項３】
プロセッサ、
前記プロセッサが電力を供給されるとき前記プロセッサと通信するメモリ、
を有し、前記メモリは、実行されると前記プロセッサに、
仮想ディスクファイルのログにアクセスし、前記ログは連続的順序で書き込まれたログエントリのシーケンスを有し、各ログエントリは、前記シーケンス内の位置を示す識別子を有し、前記仮想ディスクファイルに対する変更を記述するために作成され、
シーケンス内の各ログエントリが所定のフォーマットに適合する場合又はチェックサムによりシーケンス内の各ログエントリの有効性が示される場合に該シーケンスは有効であると決定し、該有効なシーケンスを選択し、前記有効なシーケンスは各ログエントリが有する識別子に基づき識別される最新のログエントリを有し、
前記有効なシーケンスの各ログエントリにより記述される変更を前記仮想ディスクファイルのセクタに適用させる、
命令を有する、コンピュータシステム。
【請求項４】
前記命令は、実行されると前記プロセッサに、さらに、
前記仮想ディスクファイルのＥＯＦ（End  Of  File）識別子が前記シーケンス内のログエントリに格納されたＥＯＦ識別子と一致しない場合、前記シーケンス内のログエントリに格納されたＥＯＦ識別子に基づき前記仮想ディスクファイルのＥＯＦ識別子を変更させる、
請求項３に記載のコンピュータシステム。
【請求項５】
前記命令は、実行されると前記プロセッサに、さらに、
前記仮想ディスクファイルを格納する記憶装置のセクタサイズが増大したという決定に応答して、第２のログを生成し、
増大したセクタサイズに適合する拡張されたサイズを有する拡張ログエントリを前記第２のログに書き込ませることにより前記ログを前記第２のログに変換させ、前記拡張ログエントリは、前記ログ内のログエントリから得た前記仮想ディスクファイルのセクタに対する変更を記述するビットパターンと該変更に関連し前記仮想ディスクファイルから得た更なるビットパターンとを有する、
請求項３に記載のコンピュータシステム。
【請求項６】
前記命令は、実行されると前記プロセッサに、さらに、
各ログエントリを前記ログに書き込む前に、前記仮想ディスクファイルのメタデータの変更を記憶装置に適用するためにキャッシュされた入力／出力ジョブを前記記憶装置にコミットする要求が発行された後に生成された、前記ログ内の最古のログエントリの識別子を各ログエントリに書き込ませる、
請求項３に記載のコンピュータシステム。
【請求項７】
前記命令は、実行されると前記プロセッサに、さらに、
前記仮想ディスクファイルを格納する記憶装置のセクタサイズが減少したという決定に応答して、第２のログを生成し、
第１の縮小ログエントリを前記第２のログの第１のログエントリに書き込ませ、及び第２の縮小ログエントリを前記第２のログの第２のログエントリに書き込ませることにより前記ログを前記第２のログに変換させ、前記第１の縮小ログエントリは前記ログ内のログエントリから得たビットパターンの一部を有し、前記第２の縮小ログエントリは前記ログ内の前記ログエントリから得た前記ビットパターンの残りの部分を有する、
請求項３に記載のコンピュータシステム。
【請求項８】
仮想マシンの仮想ディスクのインスタンスを生成するステップであって、前記仮想ディスクは仮想ディスクファイルによりバックアップされる、ステップと、
前記仮想ディスクファイルに書き込むべきビットパターンを決定するステップと、
ログに書き込むべき前記ビットパターンを有するログエントリを生成するステップであって、前記ログはログエントリの順序付きシーケンスを有し、前記ログはランダムアクセスメモリに格納される、ステップと、
前記仮想ディスクファイルのメタデータの変更を記憶装置に適用するためにキャッシュされた入力／出力ジョブを前記記憶装置にコミットする要求が発行された後に生成された、前記ログ内の最古のログエントリの識別子を前記ログに追加するステップと、
前記ログエントリを前記ログに書き込むステップと、
を有するコンピュータが実行する方法。
【請求項９】
前記ログエントリを前記ログに書き込むステップの後に、
記憶装置がフラッシュ動作を完了したことを示す信号の受信に応答して、前記ログエントリからの前記ビットパターンを前記仮想ディスクファイルに適用するステップと、
を更に有する請求項８に記載のコンピュータが実行する方法。
【請求項１０】
電源障害が生じたという決定に応答して、前記記憶装置に格納された前記ログのコピーをスキャンするステップであって、前記ログは連続的順序で書き込まれたログエントリのシーケンスを有し、各ログエントリは、前記シーケンス内の位置を示す識別子を有し、仮想ディスクファイルのセクタに対する変更を記述するために作成される、ステップと、
シーケンス内の各ログエントリが所定のフォーマットに適合する場合又はチェックサムによりシーケンス内の各ログエントリの有効性が示される場合に該シーケンスは有効であると決定し、前記ログの前記コピーから決定した有効なシーケンスを選択するステップであって、前記有効なシーケンスは各ログエントリが有する識別子に基づき識別される最新のログエントリを有する、ステップと、
前記有効なシーケンスの各ログエントリにより記述される変更を前記仮想ディスクファイルのセクタに適用するステップと、
を更に有する請求項９に記載のコンピュータが実行する方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、仮想記憶ディスク技術に関する。
【背景技術】
【０００２】
記憶装置の仮想化技術は、物理記憶からの論理記憶の区分を可能にする。記憶装置の仮想化に関する１つの例示的な使用例は、仮想マシンに含まれる。仮想化ソフトウェアのレイヤ（通常、ハイパーバイザ又は仮想マシンモニタと呼ばれる）は、コンピュータシステムにインストールされ、仮想マシンが物理的ハードウェアとどのように相互作用するかを制御する。ゲストオペレーティングシステムは、通常、物理的ハードウェアに対して排他的制御を実行するようコーディングされるので、仮想化ソフトウェアは、物理的ハードウェアのリソースを分割し、仮想マシン内の物理的ハードウェアの存在をエミュレートするよう構成され得る。記憶装置の仮想化に関する別の使用例は、記憶装置アレイを実装するよう構成されるコンピュータシステムに含まれる。この場合、物理的コンピュータシステム又は仮想マシンは、ｉＳＣＳＩプロトコル等を用いて記憶装置アレイに接続され得る。
【０００３】
記憶処理モジュールは、仮想又は物理的機械の記憶装置をエミュレートするために用いることができる。例えば、記憶処理モジュールは、仮想又は物理的機械により発行された記憶ＩＯジョブを、仮想ディスク、つまりブロックのような連続記憶領域の範囲を記述、つまり格納するために用いることができる１又は複数の仮想ディスクファイルから読み出し及びそれに書き込むことにより、処理できる。同様に、記憶処理プログラムは、仮想ディスクのビットパターンデータを１又は複数の仮想ディスクファイルに書き込むことにより書き込み要求に応答でき、該１又は複数の仮想ディスクファイルに格納された該ビットパターンデータを読み出すことにより読み出し要求に応答できる。
【発明の概要】
【課題を解決するための手段】
【０００４】
本願明細書は、仮想ディスクを達成する技術を記載する。例示的な構成では、仮想ディスクファイルは、ログ及びチェックポイントレコードの両方として動作するログに関連付けられ得る。ログエントリが生成されると、テイルを識別する情報が該ログエントリに格納され得る。この情報は、仮想ディスクファイルが不適切に閉じられた場合、つまりクラッシュ又は電源障害の場合に、再生すべきログエントリのシーケンスを発見するために使用できる。さらに、他の技術は、請求の範囲、詳細な説明及び図面に記載される。
【０００５】
当業者は、本開示の１又は複数の種々の態様が、限定ではなく、ここに言及される態様を達成する回路及びプログラムを有しても良く、該回路及びプログラムが、システム設計者の設計選択に依存してここに言及される態様を達成するよう構成されるハードウェア、ソフトウェア及び／又はファームウェアの実質的に如何なる組合せでもあり得ることを理解する。
【０００６】
以上は要約であり、したがって必然的に簡略化、一般化及び詳細の省略を含む。当業者は、この要約が単に説明のためであり、限定を意図しないことを理解する。
【図面の簡単な説明】
【０００７】
【図１】コンピュータシステムのハイレベルブロック図を示す。
【図２】仮想化ソフトウェアプログラムの例示的なアーキテクチャのハイレベルブロック図を示す。
【図３】仮想化ソフトウェアプログラムの別のアーキテクチャのハイレベルブロック図を示す。
【図４】仮想ディスクを達成するよう構成されるコンピュータシステムのローレベルブロック図を示す。
【図５Ａ】仮想ディスクを達成するよう構成されるコンピュータシステムのローレベルブロック図を示す。
【図５Ｂ】仮想ディスクを達成するよう構成されるコンピュータシステムのローレベルブロック図を示す。
【図６】仮想ディスクと仮想ディスクファイルとの間の関係のハイレベル図を示す。
【図７】例示的なログエントリフォーマットを示す。
【図８】時間期間に渡る例示的なログにログエントリを書き込む特定例を示す。
【図９】再生のために選択できるログエントリのシーケンスを選択する特定例を示す。
【図１０】拡張ログがどのように生成されるかの特定例を示す。
【図１１】縮小ログがどのように生成されるかの特定例を示す。
【図１２】コンピュータ可読記憶媒体内に具現化され及び／又はコンピュータシステムにより実行され得る動作手順を示す。
【図１３】図１２に示した動作と共に実行され得る追加動作を示す。
【図１４】図１３に示した動作と共に実行され得る追加動作を示す。
【図１５】コンピュータ可読記憶媒体内に具現化され及び／又はコンピュータシステムにより実行され得る動作手順を示す。
【図１６】図１５に示した動作と共に実行され得る追加動作を示す。
【図１７】コンピュータ可読記憶媒体内に具現化され及び／又はコンピュータシステムにより実行され得る動作手順を示す。
【図１８】図１７に示した動作と共に実行され得る追加動作を示す。
【発明を実施するための形態】
【０００８】
本願明細書で用いられる用語、回路は、ハードウェア割り込み制御部、ハードドライバ、ネットワークアダプタ、グラフィックプロセッサ、ハードウェアベースのビデオ／オーディオコーデックのようなハードウェアコンポーネント、及びこれらのハードウェアを動作させるファームウェアを含み得る。用語、回路は、マイクロプロセッサ、特定用途向け集積回路、及びファームウェア及び／又はソフトウェアにより構成されるプロセッサ、例えば命令をリードし及び実行する実行ユニットも含み得る。プロセッサ等は、メモリ、例えばＲＡＭ、ＲＯＭ、ファームウェア及び／又は大容量記憶装置から読み込んだ命令により構成され得る。このような命令は、１又は複数の機能を実行するようプロセッサを構成するロジックを用い得る。特定の例示的な回路は、ハードウェア及びソフトウェアの組合せを含み得る。この特定例では、実装者は、プロセッサにより実行可能な機械可読コードに後にコンパイルされる、ロジックを具現化するソースコードを記述しても良い。
【０００９】
当業者は、最先端では、ハードウェアで実装される機能とソフトウェアで実装される（後にハードウェアにより実行される）機能との間に僅かな差しかないことを理解する。したがって、ハードウェア又はソフトウェアで実装されるというような機能の記載は、単に設計選択である。端的に言うと、ソフトウェア処理は等価なハードウェア構造に変換でき、ハードウェア構造はそれ自体が等価なソフトウェア処理に変換できるので、命令で具現化されるよう記載される機能は代替としてハードウェアで実装でき、逆も同様である。
【００１０】
開示の主題は、１又は複数のコンピュータシステムを用いても良い。図１及び以下の議論は、開示の主題が実施され得る適切なコンピューティング環境の簡潔な概略的説明を提供することを目的とする。
【００１１】
図１を参照すると、例示的なコンピューティングシステム１００が示される。コンピューティングシステム１００は、プロセッサ１０２、例えば実行コアを有し得る。１つのプロセッサ１０２が図示されるが、多の実施形態では、コンピュータシステム１００は、複数のプロセッサ、例えばプロセッサ基板毎に複数の実行コアを及び／又はそれぞれ複数の実行コアを有する複数のプロセッサ基板を有しても良い。図示のように、種々のコンピュータ可読記憶媒体１１０が、種々のシステムコンポーネントをプロセッサ１０２に結合する１又は複数のシステムバスにより相互接続され得る。システムバスは、メモリバス又はメモリ制御部、周辺バス、及び種々のバスアーキテクチャのうちの任意のものを用いるローカルバスを含む複数種類のバス構造のうちの任意のものであっても良い。例示的な実施形態では、コンピュータ可読記憶媒体１１０は、例えばＲＡＭ（random  access  memory）、記憶装置１０６、例えば電気機械ハードドライブ、固体ハードドライブ等、ファームウェア１０８、例えばＦＬＡＳＨ  ＲＡＭ若しくはＲＯＭ，及び取り外し可能記憶装置１１８、例えばＣＤ−ＲＯＭ，フロッピディスク、ＤＶＤ、ＦＬＡＳＨドライブ、外部記憶装置等を有し得る。当業者に理解されるべきことに、磁気カセット、フラッシュメモリカード、及び／又はデジタルビデオディスクのような他の種類のコンピュータ可読記憶媒体を用いることができる。
【００１２】
コンピュータ可読記憶媒体１１０は、プロセッサ実行可能命令１２２、データ構造、プログラムモジュール、及び実行可能命令のようなコンピュータ１００のための他のデータの不揮発性及び揮発性記憶を提供し得る。ＢＩＯＳ（basic  input/output  system）１２０は、起動中のような、コンピュータシステム１００内の要素間の情報転送を助ける基本ルーチンを含み、ファームウェア１０８に格納され得る。オペレーティングシステム及び／又はアプリケーションプログラムを含む多数のプログラムが、ファームウェア１０８、記憶装置１０６、ＲＡＭ１０４、及び／又は取り外し可能記憶装置１１８に格納され、プロセッサ１０２により実行されても良い。例示的な実施形態では、コンピュータ可読記憶媒体１１０は、以下に詳述する仮想ディスクパーサ４０４を格納し得る。仮想ディスクパーサ４０４は、プロセッサ１０２により実行されることにより、コンピュータシステム１００を、特定目的のために構成されたコンピュータシステムに変える。つまり、コンピュータシステムは、本願明細書に記載される技術に従って構成される。
【００１３】
コマンド及び情報は、キーボード及びポインティングデバイスを含むがこれらに限定されない入力装置１１６を通じて、コンピュータ１００により受信されても良い。他の入力装置は、マイクロフォン、ジョイスティック、ゲームパッド、スキャナ等を有しても良い。上述の及び他の入力装置は、システムバスに結合されるシリアルポートインタフェースを通じて、プロセッサ１０２に接続される場合が多いが、パラレルポート、ゲームポート又はＵＳＢ（universal  serial  bus）ポートのような他のインタフェースにより接続することもできる。ディスプレイ又は他の種類のディスプレイは、グラフィックプロセッサユニット１１２の一部であり又はそれに接続されるビデオアダプタのようなインタフェースを介してシステムバスにも接続され得る。ディスプレイに加え、コンピュータは、通常、スピーカ及びプリンタ（図示しない）のような他の周辺出力装置を有する。図１の例示的なシステムは、ホストアダプタ、ＳＣＳＩ（Small  Computer  System  Interface）バス、及びＳＣＳＩバスに接続される外部記憶装置も有し得る。
【００１４】
コンピュータシステム１００は、遠隔コンピュータのような１又は複数のリモートコンピュータへの論理コネクションを用いてネットワーク環境で動作しても良い。リモートコンピュータは、別のコンピュータ、サーバ、ルータ、ネットワークＰＣ、ピア装置又は他の一般的なネットワークノードであって良く、通常、コンピュータシステム１００に関して上述した要素の多く又は全てを有し得る。
【００１５】
ＬＡＮ又はＷＡＮネットワーク環境で用いられるとき、コンピュータシステム１００は、ネットワークインタフェースカード１１４を通じて、ＬＡＮ又はＷＡＮに接続され得る。ＮＩＣ１１４は、内蔵又は外付けであって良く、システムバスに接続され得る。ネットワーク環境では、コンピュータシステム１００に関連して示されたプログラムモジュール又はその部分は、遠隔メモリ記憶装置に格納されても良い。理解されるべきことに、本願明細書に記載されたネットワーク接続は例であり、コンピュータ間の通信リンクを確立する他の手段を用いることが出来る。さらに、本開示の多数の実施形態はコンピュータ化されたシステムに特に良く適すると考えられるが、本願明細書はこのような実施形態に本開示を限定するものではない。
【００１６】
図２を参照すると、仮想マシンを生成するために用いることができる例示的な仮想化プラットフォームが示される。本実施形態では、マイクロカーネルハイパーバイザ２０２は、コンピュータシステム２００のハードウェアを制御し、該ハードウェアへのアクセスを調停するよう構成され得る。マイクロカーネルハイパーバイザ２０２は、Ｃｈｉｌｄパーティション１乃至Ｎ（ここで、Ｎは１より大きい整数である）のようなパーティションと呼ばれる実行環境を生成し得る。ここで、Ｃｈｉｌｄパ―ティションは、マイクロカーネルハイパーバイザ２０２によりサポートされる分離の基本単位である。マイクロカーネルハイパーバイザ２０２は、あるパーティションのプロセスを、別のパーティションのリソースへのアクセスから隔離できる。特に、マイクロカーネルハイパーバイザ２０２は、ゲストオペレーティングシステムのカーネルモードコードを、別のパーティションのリソースへのアクセス及びユーザモードプロセスから隔離できる。各Ｃｈｉｌｄパーティションは、マイクロカーネルハイパーバイザ２０２の制御下にあるハードウェアリソース、例えばメモリ、装置、プロセッササイクル等のセットにマッピングされ得る。実施形態では、マイクロカーネルハイパーバイザ２０２は、スタンドアロン型ソフトウェア、オペレーティングシステムの一部であり、マザーボードのファームウェア内に組み込まれ、専用集積回路であり、又はそれらの組合せであり得る。
【００１７】
マイクロカーネルハイパーバイザ２０２は、ゲストオペレーティングシステムの、物理コンピュータシステム内のメモリの視野（メモリビュー）を制限することにより、パーティションを実行できる。マイクロカーネルハイパーバイザ２０２は、仮想マシンのインスタンスを生成するとき、システム物理メモリ（system  physical  memory：ＳＰＭ）のページ、例えば開始アドレス及び終了アドレスを有する固定長メモリブロックを、ゲスト物理メモリ（guest  physical  memory：ＧＰＭ）として仮想マシンに割り当てることができる。ここで、ゲストの、システムメモリの制限された視野は、マイクロカーネルハイパーバイザ２０２により制御される。用語、ゲスト物理メモリは、仮想マシンの観点からメモリページを記述する省略表現である。また、用語、システム物理メモリは、物理システムの観点からメモリページを記述する省略表現である。したがって、仮想マシンに割り当てられるメモリページは、ゲスト物理アドレス（仮想マシンにより用いられるアドレス）及びシステム物理メモリ（ページの実際のアドレス）を有する。
【００１８】
ゲストオペレーティングシステムは、ゲスト物理メモリを仮想化しても良い。仮想メモリは、オペレーティングシステムに、メモリをコミットさせ、アプリケーションに論理的連続ワーキングメモリへの単独アクセスを与えさせる管理技術である。仮想化環境では、ゲストオペレーティングシステムは、本例ではゲストページテーブルと呼ばれる１又は複数のページテーブルを用い、仮想ゲストアドレスとして知られる仮想アドレスを、ゲスト物理アドレスに変換する。本例では、メモリアドレスは、ゲスト仮想アドレス、ゲスト物理アドレス、及びシステム物理アドレスを有しても良い。
【００１９】
図示の例では、Ｐａｒｅｎｔパーティションコンポーネントは、Ｘｅｎのオープンソースハイパーバイザのドメイン０と同様であるとも考えられ、ホスト環境２０４を含み得る。ホスト環境２０４はオペレーティングシステム（又は設定ユーティリティのセット）であり、ホスト環境２０４は、仮想化サービスプロバイダ２２８（ＶＳＰ）を用いることにより、Ｃｈｉｌｄパーティション１〜Ｎで実行するゲストオペレーティングシステムにリソースを提供するよう構成され得る。ＶＳＰ２２８は、通常、オーブンソースコミュニティでバックエンドドライバと呼ばれ、仮想化サービスクライアント（ＶＳＣ）（通常、オーブンソースコミュニティでフロントエンドドライバと呼ばれる、又は並列仮想化装置）を用いてハードウェアリソースへのインタフェースを多重化するために用いることができる。図示のように、仮想化サービスクライアントは、ゲストオペレーティングシステムの環境内で実行する。しかしながら、これらのドライバは、ハードウェア又はエミュレートされたハードウェアと通信する代わりにＶＳＰを介してホスト環境２０４と通信する点で、ゲスト内の残りのドライバと異なる。例示的な実施形態では、仮想化サービスクライアント２１６及び２１８と通信するために仮想化サービスプロバイダ２２８により用いられる経路は、Enlightened  ＩＯパスであると考えられる。
【００２０】
図示のように、エミュレータ２３４、例えば仮想化ＩＤＥ装置、仮想化ビデオアダプタ、仮想化ＮＩＣ等は、ホスト環境２０４内で動作するよう構成され、ゲストオペレーティングシステム２２０、２２２に利用可能なエミュレートされたハードウェアリソース、例えばＩＯポート、ゲスト物理アドレス範囲、仮想ＶＲＡＭ、エミュレートされたＲＯＭ範囲等に取り付けられる。例えば、ゲストＯＳがゲスト物理アドレスにマッピングされたゲスト仮想アドレスに触れるとき、マイクロカーネルハイパーバイザ２０２は、要求を傍受し、関連するエミュレータに書き込みしようとしたゲストに値を渡す。ここで、装置のレジスタは、メモリを割り付けられた装置のためである。また、本例のエミュレートされたハードウェアリソースは、仮想装置がゲスト物理アドレス空間内に位置付けられると考えられる。このようなエミュレータの使用は、エミュレーションパスと考えられる。エミュレーションパスは、装置をエミュレートするためにはＶＳＰとＶＳＣとの間でメッセージを通過させるよりも多くのＣＰＵ時間を必要とするので、Enlightened  IOパスと比べて非効率である。例えば、レジスタにマッピングされたメモリに対する幾つかの動作は、エミュレーションパスを介してディスクにバッファを書き込むために必要である。一方、これは、Enlightened  ＩＯパスではＶＳＣからＶＳＰへ渡される単一のメッセージにまで削減できる。ここで、ＶＭ内のドライバは、ハードウェアにアクセスするよう設計されるのではなく、仮想システムにより提供されるＩＯサービスにアクセスするよう設計される。
【００２１】
各Ｃｈｉｌｄパーティションは、１又は複数の仮想プロセッサ（２３０、２３２）を有し得る。ゲストオペレーティングシステム（２２０、２２２）は、仮想プロセッサを管理し、それらで実行すべきスレッドをスケジューリングする。概して、仮想プロセッサは、実行可能命令であり、特定アーキテクチャを有する物理的プロセッサを表す関連状態情報である。例えば、ある仮想マシンは、Ｉｎｔｅｌ  ｘ８６プロセッサの特徴を有する仮想プロセッサを有しても良い。また、別の仮想プロセッサは、ＰｏｗｅｒＰＣプロセッサの特徴を有しても良い。本例の仮想プロセッサは、コンピュータシステムのプロセッサにマッピングされ、仮想プロセッサを達成する命令が物理的プロセッサにより直接実行されるようにする。したがって、複数のプロセッサを有する一実施形態では、仮想プロセッサは複数のプロセッサにより同時に実行でき、同時に、例えば他のプロセッサはハイパーバイザ命令を実行する。パーティションにおける仮想プロセッサとメモリの組合せは、仮想マシンと考えられる。
【００２２】
ゲストオペレーティングシステム（２２０、２２２）は、例えばMicrosoft（登録商標）、Apple（登録商標）、オープンソースコミュニティ等によるオペレーティングシステムのような任意のオペレーティングシステムであり得る。ゲストオペレーティングシステムは、ユーザ／カーネル動作モードを有し、スケジューラ、メモリマネジャ等を含み得るカーネルを有し得る。一般的に、カーネルモードは、少なくとも特権的プロセッサ命令へのアクセスを許可する、プロセッサの実行モードを有し得る。各ゲストオペレーティングシステムは関連ファイルシステムを有し得る。ゲストオペレーティングシステムは、端末サービス、電子商取引サービス、電子メールサービス等のような関連ファイルシステムに格納されたアプリケーション、並びにゲストオペレーティングシステム自身を有し得る。ゲストオペレーティングシステムは、仮想プロセッサで実行すべきスレッドをスケジューリングでき、このようなアプリケーションのインスタンス化が達成できる。
【００２３】
図３を参照すると、図２で上述したものの代替の仮想プラットフォームを示す。図３は、図２と同様のコンポーネントを示すが、この例示的な実施形態では、ハイパーバイザ３０２が、マイクロカーネルコンポーネント、並びに仮想サービスプロバイダ２２８及びデバイスドライバ２２４のような図２のホスト環境２０４内のコンポーネントと同様のコンポーネントを含み得る。一方、管理オペレーティングシステム３０４は、例えばハイパーバイザ３０２を構成するために用いられる設定ユーティリティを有しても良い。このアーキテクチャでは、ハイパーバイザ３０２は、図２のマイクロカーネルハイパーバイザ２０２と同一の又は同様の機能を実行できる。しかしながら、このアーキテクチャでは、ハイパーバイザ３０２は、Enlightened  ＩＯパスを達成し、コンピュータシステムの物理的ハードウェアのためのドライバを有する。図３のハイパーバイザ３０２は、スタンドアロン型ソフトウェア、オペレーティングシステムの一部であり、マザーボードのファームウェア内に組み込まれ、又はハイパーバイザ３０２の一部が専用集積回路により達成され得る。
【００２４】
図４を参照すると、コンピュータシステム４００を示す。図４は、本願明細書に記載する技術を実行するために用いることができるコンポーネントのハイレベルブロック図である。簡単に言うと、コンピュータシステム４００は、図１〜３に関して上述したコンポーネントと同様のコンポーネントを有し得る。図４は、図２又は３により説明した仮想プラットフォームのハイレベル表現であると考えられる仮想システム４２０を示す。例えば、仮想システム４２０は、ハイパーバイザマイクロカーネル２０２及びホスト２０４により提供される機能の組合せのハイレベル表現と考えられる。或いは、仮想システム４２０は、ハイパーバイザ３０２及び管理ＯＳ３０４のハイレベル表現と考えられる。したがって、本願明細書を通じて用語「仮想システム４２０」の使用は、以下の段落で説明する仮想ディスク技術が任意の種類の仮想ソフトウェア層内で又は任意の種類の仮想プラットフォームで実装され得ることを示唆する。
【００２５】
仮想ディスクパーサ４０４は、特定の例示的な実施形態では実行可能命令であり、仮想ディスクファイルから仮想ディスクをインスタンス化し、仮想マシンの代わりに記憶ＩＯを処理するために用いることができる。図示のように、仮想ディスクパーサ４０４は、仮想ディスクファイル４０６のような１又は複数の仮想ディスクファイルを開き、仮想ディスク４０２を生成できる。
【００２６】
仮想ディスクパーサ４０４は、仮想システムファイルシステム４０８を介して記憶装置１０６から仮想ディスクファイル４０６を得ることができる。簡単に言うと、仮想システムファイルシステム４０８は、仮想ディスクファイル４０６のような、仮想システム４２０のコンピュータファイル及びデータを編成する実行可能命令を表す。仮想システムファイルシステム４０８は、このデータを固定サイズの物理的範囲のアレイ、つまり物理的記憶装置の連続記憶領域に格納できる。特定の例では、１つの範囲はクラスタであり、設定された長さを有する、複数ビットのバイトシーケンスである。例示的なクラスタのサイズは、通常、２の冪乗であり、５１２バイト乃至６４キロバイトである。特定の構成では、クラスタのサイズは、４キロバイトであり得る。
【００２７】
仮想ディスクファイル４０６を開く要求を受信すると、仮想システムファイルシステム４０８は、ファイルがディスクのどこに位置するかを決定し、ディスクの１又は複数の物理的範囲からデータを読み出すためにＩＯジョブをディスクデバイスドライバへ発行する。ファイルシステム４０８により発行されたＩＯジョブは、記憶装置１０６にある仮想ディスクファイル４０６の永続的コピーの位置を記述するディスクオフセット及び長さを決定し、ＩＯジョブを記憶装置１０６へ発行する。記憶装置がどのように動作するかのセマンティクスにより、書き込みＩＯジョブは、記憶装置１０６の回路が永続的記憶ユニット４６０の位置、例えばプラッタ、フラッシュメモリセル等にアクセスし、及び仮想ディスクファイル４０６の永続的コピーの新しいコンテンツを示すバッファリングされたビットパターンを永続的記憶ユニット４６０に書き込むことを決定するまで、キャッシュ４５４により表される揮発性メモリの１又は複数レベルのキャッシュにバッファリングされる。
【００２８】
仮想ディスクパーサ４０４は、仮想ディスクファイル４０６を示すビットパターンを得て、複数の仮想ディスク範囲を有するディスクとして仮想ディスクファイル４０６内にペイロード、例えばユーザデータを置く。一実施形態では、これらの仮想ディスク範囲は、固定サイズブロック、５１２キロバイト乃至６４メガバイトのサイズであり、複数のセクタに区分され得る。しかしながら、別の実施形態では、仮想ディスク範囲は、可変サイズの範囲であり得る。例示的な構成では、ゲストオペレーティングシステム４１２をブートする前に、エミュレート又はEnlightened記憶制御部及び仮想ディスクのEnlightened特徴に関連するリソースは、メモリをマッピングされたレジスタを有するエミュレートされた記憶制御部が仮想マシン４１０のゲスト物理アドレス空間内で実行されるよう、設定される。ブートコードが実行し、ゲストオペレーティングシステム４１２をブートし得る。仮想システム４２０は、ゲスト物理アドレス空間のこの領域へのアクセスの試みを検出し、ゲストオペレーティングシステム４１２に記憶装置がエミュレートされた記憶制御部に取り付けられると決定させる結果を返す。これに応答して、ゲストオペレーティングシステム４１２は、ドライバ（並列仮想ドライバ又は通常のドライバ）をロードし、該ドライバを用いて、検出した記憶装置へ記憶ＩＯ要求を発行する。仮想システム４２０は、記憶ＩＯ要求を仮想ディスクパーサ４０４へ転送できる。
【００２９】
ゲストオペレーティングシステム４１２は、実行された後、ファイルシステム４０８を介して仮想ディスク４０２へＩＯジョブを発行できる。これは、ゲストオペレーティングシステム４１２及びゲストオペレーティングシステム４１２にインストールされたアプリケーションのコンピュータファイル及びデータを編成する仮想システムファイルシステム４１４と似ている。ゲストオペレーティングシステム４１２は、オペレーティングシステムが物理的記憶装置と相互作用するのと同様の方法で、仮想ディスク４０２と相互作用でき、最終的にＩＯジョブは仮想ディスクパーサ４０４へ転送される。仮想ディスクパーサ４０４は、物理的記憶装置をエミュレートする方法で、ＩＯジョブにどのように応答するかを決定するロジックを有し得る。例えば、仮想ディスクパーサ４０４は、仮想ディスクファイル４０６からデータを読み出し、及び仮想ディスクファイル４０６にデータを書き込むことができる。また、仮想ディスクファイル４０６に書き込まれたデータは、仮想システムファイルシステム４０８を通じて転送され、永続的記憶ユニット４６０に格納された仮想ディスクファイル４０６の永続的コピーに又は永続的記憶ユニット４６０にコミットされる。
【００３０】
図５Ａを参照すると、本願明細書に記載される技術を実施するための代替のアーキテクチャを示す。図５に示すように、仮想ディスクパーサ４０４は、Microsoft（登録商標）により提供されるオペレーティングシステムのようなオペレーティングシステム５２０に実装できる。本例では、仮想ディスクパーサ４０４は、図１のコンピュータシステム１００と同様のコンポーネントを有し得る記憶サーバ５００で実行するよう構成され得る。本例では、記憶サーバ５００は、物理的記憶装置アレイ５１０を有し、サーバが利用可能な記憶を作るよう構成され得る。したがって、記憶は、オペレーティングシステム５０８にローカルに取り付けられるように見える。仮想ディスクパーサ４０４は、図４に関して説明したのと同様に動作する。相違点は、本構成では、ファイルシステム４１４により発行されるリード／ライトＩＯジョブが、ネットワーク接続を介して仮想ディスクパーサ４０４へ転送されることである。
【００３１】
図５Ｂを参照すると、本願明細書に記載される技術を実施するための更に別のアーキテクチャを示す。図５Ｂは、図５Ａと同様に、仮想ディスクパーサ４０４がオペレーティングシステム５０２に実装され、コンピュータシステム５１２が図１のコンピュータシステム１００と同様のコンポーネントを有し得る。しかしながら、本例は、図がループバックの取り付けられた仮想ディスク４０２を示す点が異なる。アプリケーション４２４のようなアプリケーションを含み、ファイルシステム４１４は、仮想ディスク４０２に格納され、また、仮想ディスクファイル４０６はコンピュータシステムファイルシステム５１４に格納され得る。
【００３２】
図６を参照すると、仮想ディスクファイル４０６により少なくとも部分的に説明された仮想ディスクを示す。図示のように、仮想ディスク４０２は、Ｎ個の記憶範囲（Ｎは０より大きい整数である）を有し、この特定の例では、仮想ディスク４０２は１０個の範囲を有する。仮想ディスク４０２は、ゲストオペレーティングシステム４１２の異なるファイル及びデータのビットパターンを有するとして示される。これらのビットパターンは、仮想ディスク範囲内の異なるハッチングにより区別される。
【００３３】
仮想ディスク４０２は物理的記憶装置ではないので、仮想ディスク範囲のための基本ペイロードデータは、仮想ディスクファイル４０６内の異なるセクション「により記述され」、つまり異なるセクションに格納され得る。例えば、仮想ディスクブロック１は、仮想ディスクファイルオフセット値０、又はペイロードデータを格納するために用いられ得る第１のオフセットにより定められる部分により記述される。割り当てテーブル４１６は、コンピュータシステム４００の動作中にランダムアクセスメモリに格納され、任意のセクションにある仮想ディスクファイル４０６内に存続し、複数のセクションに及び得る。簡単に言うと、割り当てテーブル４１６は、仮想ディスク範囲を仮想ディスクファイル４０６のセクションにリンク付けする情報を含み得る。例えば、割り当てテーブル４１６は、仮想ディスクブロック数、及びデータを格納する仮想ディスクファイル４０６のセクションを定める仮想ディスクファイルバイトオフセットを定める情報を格納し得る。矢印は、割り当てテーブル４１６に格納された関係を表す。
【００３４】
割り当てテーブル４１６又は他のメタデータに関する変更が仮想ディスクファイルに対して行われるとき、キャッシュ４５４がフラッシングされるまで、その変更が永続的記憶ユニット４６０により持続されることが保証されないという問題がある。予期しない電源断のように、メタデータ更新が生き残る前に仮想ディスクファイルが正しく閉じられない場合、永続的記憶ユニット４６０のセクタに格納された全てのメタデータエントリは、損傷してしまう。特に、メタデータが割り当てテーブル４１６のためのものである場合、複数の仮想ディスク範囲を仮想ディスクファイル４０６にリンク付けする情報が失われてしまう。したがって、単一セクタの損失は、多くの仮想ディスク範囲を使用不可能にしてしまう。
【００３５】
例示的な実施形態では、仮想ディスクファイルのメタデータのセクションの損傷が仮想ディスク４０２の複数のセクションを損傷する可能性を低減するために、ログ４２０が用いられ得る。したがって、仮想ディスクパーサ４０４は、仮想ディスクファイル４０６のメタデータの変更を示すビットパターンを有するログエントリを生成し、それらをログ４２０に記録し得る。仮想ディスクファイルが正しく閉じられない場合には、仮想ディスクパーサ４０４がリスタートされるとき、ログ４２０はメタデータの変更を再生するために用いられ得る。
【００３６】
図示のように、ログ４２０は、ログエントリ（図示の例ではログエントリ１〜６）の順序付きシーケンスとして構築され得る。各ログエントリは、該ログエントリが１番目、２番目、３番目、．．．のログエントリであることを識別するシーケンス番号を有し得る。さらに、実行時間中にログ４２０を格納するために用いられるランダムアクセスメモリは、仮想ディスクパーサ４０４により循環バッファとして用いられ得る。したがって、ログ４２０が一杯になると、仮想ディスクパーサ４０４は、ログ４２０の始めから古いログエントリに上書きし始める。古いエントリが上書きされ、仮想ディスクパーサ４０４はそれらをシーケンシャルに順序付けるので、仮想ディスクパーサ４０４は、ログエントリ１をログエントリ７で上書きし、ログエントリ２をログエントリ８で上書きし、以下同様である。
【００３７】
例示的な実施形態では、仮想ディスクパーサ４０４は、フラッシュに応答して仮想ディスクファイル４０６にログエントリを適用するよう構成され得る。簡単に言うと、フラッシュは、記憶装置の内部キャッシュの内容を永続的記憶に書き込むよう記憶装置に指示する要求である。記憶装置は、ＩＯジョブにより記述されるビットパターンが持続されるときを示さないので、フラッシュが発行されない限り、ＩＯジョブが永続的記憶装置４６０に格納される保証はない。例示的な構成では、仮想ディスクパーサ４０４がログを生成し仮想ディスクファイル４０６を更新する方法の副作用は、メタデータの変更を記述するログエントリを書き込む動作が、その変更を仮想ディスクファイル４０６に書き込むことと等価であることである。このため、これらの変更は、個々の変更を仮想ディスクファイル４０６に適用することにより引き起こされる性能への影響を低減するために、仮想ディスクファイル４０６に一括処理で適用され得る。したがって、この例示的な実施形態では、仮想ディスクファイル４０６への変更は、遅延され、例えばフラッシュに応答して一緒に書き込まれ得る。特定の例では、メタデータが割り当てテーブル４１６に格納され、仮想ディスクパーサ４０４は、ログエントリをログ４２０に書き込み、割り当てテーブル４１６のメモリ内コピーを更新し、フラッシュが生じたことを決定し、仮想ディスクファイル４０６を更新するよう構成され得る。また、仮想ディスクファイル４０６の更新は、今しがたフラッシュされたログエントリにより記述される変更を示すＩＯジョブを、記憶装置１０６へ送信させる。したがって、これらの変更は、永続的記憶ユニット４６０に格納された仮想ディスクファイルの永続的コピーに適用され得る。
【００３８】
例示的な実施形態では、永続的記憶ユニット４６０によるログエントリの格納が成功したとき、仮想ディスクパーサ４０４は、ログエントリを新しいログエントリで上書きし得る。上述のように、記憶装置１０６へ発行されたＩＯジョブは、揮発性メモリ、例えばキャッシュ４５４の１又は複数レベルに格納され得るので、及び幾つかの記憶装置はＩＯジョブが完了したときを報告しないので、例示的な構成では、仮想ディスクパーサ４０４は、永続的記憶ユニット４６０にフラッシュされたログエントリを上書きするよう構成され得る。
【００３９】
図７を参照すると、異なるログエントリフォーマットを示す。例示的な実施形態では、仮想ディスクパーサ４０４は、ログエントリ７０２、７０４、７０６及び／又は７０８と同様のログエントリを書き込むよう構成され得る。しかしながら、本開示は、図７に示すログエントリと同様の構造を有するログエントリを用いることに限定されない。図７に示すように、各ログエントリは、ヘッダを有し得る。ヘッダは、ログエントリのシーケンス番号、例えばログ番号１〜Ｍ（ここで、Ｍは１より大きい整数である）、ログエントリが現在のランの一部であることを識別する固有識別子、つまりログが仮想ディスク４０２がインスタンス化された前の時間ではなくこのランタイムのインスタンスのためのものであることを示す情報、及び「テイル（tail）」、つまりログ内のフラッシュされていない最古のログエントリの識別子を含み得る。これは後に詳述する。さらに、任意的な実施形態では、仮想ディスクパーサ４０４は、ファイルの終わり（end  of  file：ＥＯＦ）情報、例えば仮想ディスクファイル４０６の終わりを示す仮想ディスクファイルバイトオフセットを、各ログエントリに書き込み得る。ＥＯＦ情報は、仮想ディスクファイル４０６のＥＯＦがログ４２０により識別されるＥＯＦと一致しない場合に、仮想ディスクファイル４０６の長さを修復するために用いることができる。
【００４０】
図７に示すように、幾つかのログエントリは、ヘッダ及び記述子を有する。記述子セクションは、仮想ディスクファイル４０６内でペイロード、つまりビットパターンが書き込まれるべき場所のための仮想ディスクファイルオフセットへの参照を有し得る。例示的な実施形態では、ペイロードは、セクタのデータ価値を有し得る。例えば、記憶装置１０６が４ｋｂの大きさのセクタを使用する場合、各ログエントリ内のペイロードは、仮想ディスクファイル４０６のための４ｋｂ、つまりビットパターンだけ更新され得る。ログエントリ７０２及７０６は、ログエントリのペイロードが基本記憶装置、例えば記憶装置１０６のセクタの大きさに依存して異なり得ることを示す。例えば、ログエントリ７０２は４ｋ更新を記述し、一方、ログエントリ７０６は８ｋ更新を記述しても良い。
【００４１】
他方で、ログエントリ７０４は、複数の記述子及び複数のペイロードビットパターンを有する。ログエントリ７０４は、例示的なログエントリが複数のセクタの更新を記述し得ることを示す。仮想ディスクパーサ４０４は、複数の更新が同時にコミットされるよう要求されたとき、このようなログエントリを生成するよう構成されても良い。このような更新の１つの特定の例では、仮想ディスクパーサ４０４のデータがある仮想ディスクブロックから別のブロックへ移動される場合、仮想ディスクファイルのセクション内のペイロードを別のセクションにコピーするのではなく、仮想ディスクパーサ４０４が仮想ディスク範囲を仮想ディスクファイル４０６にリンク付けする情報を変更する。
【００４２】
ログエントリ７０８は、例示的な実施形態では、ログエントリがペイロードを有するのではなく、記述子が、仮想ディスクファイルオフセットと、セクタのペイロードが全て０、全て１等であることを示す識別子と、を有しても良いことを示す。例えば、仮想ディスクパーサ４０４は、全て０を有するよう仮想ディスクファイルの一部を変更するよう決定し、例えばファイルの終わりを延長する。本例では、仮想ディスクパーサ４０４は、ペイロードの代替である識別子を有するログエントリを生成し得る。このように、ログエントリはログ４２０内で少ない空間しか取らない。
【００４３】
また、ログエントリは、ログエントリ７１０と同様であり得る。この種のログエントリは、テイル位置を更新するために用いることができる。これは、以下に詳述する。簡単に言うと、ログ４２０が一杯である又は一杯に近く、ログエントリが上書きできない、つまりログエントリが永続的記憶ユニット４６０にフラッシュされていない場合、ログエントリ７１０と同様のログエントリは、テイルを進めるために用いることができる。これがどのように動作するかの特定の例では、仮想ディスクパーサ４０４は、ログ４２０内の利用可能な自由空間がどれだけあるかを決定して、閾と比較することにより、ログ４２０が一杯である又はほぼ一杯であると決定し得る。ログ４２０が一杯である又はほぼ一杯であると決定した後、仮想ディスクパーサ４０４は、エントリがフラッシュされていないことを決定することにより、古いエントリが上書きできないと決定し得る。次に、仮想ディスクパーサ４０４は、仮想化システムファイルシステム４０８又は記憶サーバファイルシステム５０４へフラッシュを発行し得る。フラッシュの完了後、仮想ディスクパーサ４０４は、ログエントリ７１０と同様のログエントリを生成し、フラッシュが生じたこと及びこのエントリが新しいテイルであることを示す情報をそのエントリ内に書き込み得る。
【００４４】
前述に加え、ログ４２０内のバイトシーケンスが単一の有効なログエントリであることを仮想ディスクパーサ４０４に示すために、データは特定の方法でログエントリに格納され得る。例えば、ヘッダは、チェックサム又はログエントリを有効にするために用いられる他のデータ、及び該ヘッダをヘッダとして識別する固有識別子を含み得る。記述子も、該記述子がヘッダに関連することを識別する固有識別子を割り当てられ得る。記述子の固有識別子のコピーは、例えばペイロード部の最初のバイト内に置かれ、ペイロードの最初のバイトは記述子に格納され得る。したがって、実際のペイロードは、ペイロード部の中のペイロードから最初のバイトを除き、記述子に格納されたバイトを加えたものであり得る。
【００４５】
一実施形態では、ログ４２０は、ログ及びチェックポイントレコードの両方として用いることができる。仮想ディスクパーサ４０４は、フラッシュされていないログに格納された最古のログエントリに関連する識別子である「テイル」の識別子を、生成された各ログエントリに追加し得る。識別子は、クラッシュの後に、どのログエントリが仮想ディスクファイル４０６のディスク上コピーに適用されたか及びどのログエントリが再生されるべきかを決定するために、仮想ディスクパーサ４０４により用いることができる。
【００４６】
図８を参照すると、どのように仮想ディスクパーサ４０４がログ４２０に上書きするかを経時的に示す。この特定の例では、ログ４２０は、８個の時点で示される（４２０−Ａ乃至４２０−Ｈ）４２０−Ａにより示される時間期間の前に、仮想ディスクパーサ４０４は、仮想ディスクファイル４０６を開き、仮想ディスク４０２はインスタンス化され得る。特定の例では、仮想ディスク４０２は、仮想マシン４１０内でインスタンス化され得る。つまり、コンピュータシステム４００は、ＩＯジョブを、仮想マシン４１０から仮想ディスクパーサ４０４へ転送し、仮想マシン４１０内の記憶装置の存在をエミュレートするよう構成され得る。別の構成では、オペレーティングシステム５０８は、仮想ディスク４０２をブートし、クライアントコンピュータシステム５０６で動作し始めることができる。
【００４７】
仮想ディスクファイル４０６のメタデータに変更を生じるＩＯジョブが発行されたと仮定する。また、これは、仮想ディスクパーサ４０４に、仮想ディスクファイル４０６内のメタデータに対する変更を示すビットパターンを書き込ませる。本例では、仮想ディスクパーサ４０４は、変更が適用されるべき仮想ディスクファイルのセクタサイズの部分のためのビットパターンを生成し、ログエントリ１を生成し得る。因みに、セクタサイズの更新が用いられる理由は、セクタが、記憶装置１０６が単一トランザクションで永続的記憶ユニット４６０にコミットできるデータ量であるからである。したがって、メタデータの変更が数バイトの大きさであっても、変更を表すビットパターンは、更新と、既に仮想ディスクファイル４０６に格納されているデータの残りとを含み得る。例に戻ると、仮想ディスクパーサ４０４は、テイルを識別するメモリポインタを調べることにより、テイル（最後のフラッシュ以来、記憶装置１０６にコミットされていない最古のログエントリ）の同一性を決定できる。本例では、テイルは、ログ４２０の先頭に初期化されている。したがって、仮想ディスクパーサ４０４は、ログエントリ１内の初期化ポイントに識別子を追加し（これは、ログエントリ１の中央から先頭を指す曲線矢印により示される）、ログエントリ１をログ４２０に書き込み、ログ４２０のディスク上コピーを更新するために、ログ４２０に対する変更を示すＩＯジョブを記憶装置１０６へ発行し得る。例示的な実施形態では、識別子は、ログエントリ１のシーケンス番号であり、ログエントリ１の最初のセクタを示す、ログ４２０内のバイトオフセット等であり得る。さらに、更新が割り当てテーブル４１６に対するものである場合、仮想ディスクパーサ４０４は、変更を含めるために、割り当てテーブル４１６のメモリ内コピーを更新し得る。
【００４８】
図８の説明を続け、ログ４２０−Ｂを参照すると、仮想ディスクパーサ４０４は、仮想ディスクファイル４０６に格納されたメタデータに対する変更を生じる別のＩＯジョブを受信すると仮定する。例えば、仮想ディスクブロックを仮想ディスクファイル４０６のセクションにリンク付けするために、割り当てテーブル４１６に対する変更が行われると仮定する。これに応答して、仮想ディスクパーサ４０４は、仮想ディスクブロックを仮想ディスクファイル４０６のセクションにリンク付けする情報を示す仮想ディスクファイル４０６のためのビットパターン並びに既にディスクにあるセクタからのデータを含むペイロードを有するログエントリ２を生成し得る。そして、仮想ディスクパーサ４０４は、最古の未フラッシュログエントリの同一性が、ログエントリ１としても分かっているログ４２０の最初にあることを決定し得る。例えば、仮想ディスクパーサ４０４は、最古の未フラッシュログエントリの最初を指すメモリポインタを調べ、識別子をログエントリ２に追加し、ログエントリ２をログ４２０に書き込み、ログ４２０のディスク上コピーを更新するためにＩＯジョブを発行し得る。本例のエントリ１及び２の両方は、両方とも最古の未フラッシュログエントリを明示的に識別するので、チェックポイントレコードである。
【００４９】
ログ４２０−Ｃを参照し、フラッシュ動作を開始するコマンドが処理されると仮定する。例えば、仮想ディスクパーサ４０４は、タイマの終了に基づき、又は未フラッシュログエントリを格納するために用いる所定の空間量を超過したために、記憶装置１０６にフラッシュコマンドを発行することを決定すると仮定する。代替として、フラッシュは、仮想マシン４１０のファイルシステム４１４により発行されると仮定する。どんな処理がフラッシュを開始したかに拘わらず、仮想ディスクパーサ４０４は、フラッシュ手順の開始を用いて、ログエントリを持続させ、仮想ディスクファイル４０６のディスク上コピーを更新するよう構成される。例えば、フラッシュを開始するコマンドの処理に応答して、仮想ディスクパーサ４０４は、記憶装置１０６にキャッシュ４５４の内容を永続的記憶ユニット４６０に書き込ませるフラッシュを発行し得る。また、これは、ログエントリ１及びログエントリ２を示すＩＯジョブが存続することを保証する。仮想ディスクパーサ４０４は、次のログエントリが書き込まれる第１の仮想ディスクファイルオフセットを示す位置、つまりログエントリ３へのメモリ内のポインタを更新し得る。
【００５０】
ログ４２０−Ｄを参照すると、仮想ディスクファイル４０６に対する変更を生じる別の更新が、仮想ディスクファイルメタデータに対して行われ得る。上述の動作手順と同様に、仮想ディスクパーサ４０４はログエントリ３を生成し、仮想ディスクパーサ４０４は、コミットされていない、つまりフラッシュ動作中に記憶装置１０６にコミットされなかった、及び適用されていない、つまり仮想ディスクファイル４０６に適用されていない最古のログエントリの同一性を決定し得る。例えば、仮想ディスクパーサ４０４は、ログエントリ２の最後を示すファイルオフセットを指すメモリポインタを調べ、ログエントリ３の識別子をログエントリ３に、例えばログエントリ３のヘッダ内に追加し得る。メモリポインタが本例でエントリ１と２の両方を超えて移動したという事実は、ログエントリ１及び２の両方がディスクにコミットされたことを示す。次に、仮想ディスクパーサ４０４は、ログエントリ３をＲＡＭ１０４内のログ４２０に書き込み、ログエントリ３を示すＩＯジョブを記憶装置１０６に発行し得る。
【００５１】
ログ４２０−Ｅを参照し、フラッシュ動作を開始する別のコマンドが処理されると仮定する。フラッシュを発行する要求の処理に応答して、仮想ディスクパーサ４０４は、フラッシュを発行し、記憶装置１０６にキャッシュ４６０の内容をディスクに書き込ませ得る。記憶装置１０６がフラッシュが終了したことを示す肯定応答を送信した後、仮想ディスクパーサ４０４は、次のログエントリ、つまりログエントリ４のための仮想ディスクファイルバイトオフセットを示すファイルオフセットを指すテイルポインタを更新し得る。
【００５２】
ログ４２０−Ｆを参照すると、仮想ディスクファイル４０６に対する変更を生じる別の更新が、仮想ディスクファイルメタデータに対して行われ得る。上述の動作手順と同様に、仮想ディスクパーサ４０４はログエントリ４を生成し、仮想ディスクパーサ４０４は、最古の未フラッシュログエントリ、例えば本例ではログエントリ４の同一性を決定し、ログエントリ４の識別子をログエントリ４に追加し、ログエントリ４をログ４２０に書き込み得る。
【００５３】
ログ４２０の大きさが限られており循環的方法で扱われると仮定する。ログ４２０−Ｇは、仮想ディスクパーサ４０４が古いフラッシュ済みエントリを新しいエントリで上書きするよう構成され得ることを示す。本例では、図示のように、仮想ディスクパーサ４０４は、前の変更よりも大きい、メタデータに対する変更を受信している。例えば、ログエントリ５は２つのペイロードを有すると仮定する。仮想ディスクパーサ４０４は、ログエントリ５を書き込むための十分な空間が存在しないことを決定し得る。この決定に応答して、仮想ディスクパーサ４０４は、テイルポインタを調べ、テイルポインタの仮想ディスクファイルオフセット値より前にログ４２０内に空間が存在することを決定することにより、ログ４２０内にフラッシュ済みログエントリが存在するか否かを決定し得る。次に、仮想ディスクパーサ４０４は、ログエントリ５を生成し、最古の未フラッシュログエントリがログエントリ４であると決定し、ログエントリ５をログ４２０に書き込む前に、ログエントリ４の識別子をログエントリ５に追加するよう構成される。図示のように、この場合、識別子は、ログエントリ５の後にログ４２０に書き込まれたかのように見えるログエントリを指す。しかしながら、図９の説明と関連して後に詳述するように、仮想ディスクパーサ４０４は、ログエントリ５が実際にはログエントリ４の後に書き込まれたと決定し得る。
【００５４】
ヘッドポインタがテイルポインタに達すると、フラッシュされたエントリが存在しない状況が生成され、したがって、仮想ディスクパーサ４０４はそれ以上エントリを上書きできない。この状況では、仮想ディスクパーサ４０４は、テイルを更新するために用いられるログエントリを上書きすることにより、ログ４２０内に空間を生成するよう構成され得る。ログエントリ４２０−Ｈにより示すように、仮想ディスクパーサ４０４は、フラッシュを発行し、フラッシュ済み（本例ではログエントリ４及び５）により記述される変更を示すＩＯジョブを記憶装置１０６に発行して仮想ディスクファイル４０６のディスク上コピーを更新し、ヘッダを含む点で図６のログエントリ６１０と同様に見えるログエントリ６を生成し、ログエントリ６の識別子をログエントリ６に追加し、該ログエントリをログ４２０に書き込んでも良い。したがって、仮想ディスクパーサ４０４は、以前にログエントリ３、５及び５の残り部分を格納していた空間を次のログエントリを格納するために使用することができる。
【００５５】
図９を参照すると、ログエントリが生成された後に、仮想ディスクファイル４０６は、電源障害又はクラッシュのために、不適切に閉じられ得る。仮想ディスクパーサ４０４が仮想ディスクファイル４０６に応答するとき、永続的ログ９０２又は９０６は、衝突し得る。例示的な永続的ログ９０２又は９０６は、図８の例示的なハイレベル図から生成されなくても良く、永続的ログ９０２又は９０６は、異なる例の一部であっても良い。仮想ディスクパーサ４０４は、これらのエントリをスキャンし、どのログエントリが仮想ディスクファイル４０６に適用されたか及びどのログエントリが永続的ログエントリに格納されたテイルポインタに基づき再生できるかを決定するよう構成され得る。
【００５６】
図示のログ９０２は、６個の有効なログエントリ、及び破損データを含む１個のエントリ、つまりログエントリ４を有する。ログ９０２を検出した後に、仮想ディスクパーサ４０４は、ログ４２０をスキャンして最新の有効なログエントリの位置を特定し、シーケンス、つまり最新の有効なログエントリが一部にある０以上の順序付きログエントリを適用するよう構成され得る。要するに、仮想ディスクパーサ４０４は、テイルとして識別されたログエントリ以外の、自身又は特定の他のログエントリへの識別子を含み得る、各ログエントリがテイルの識別子を有するログエントリのグループを選択することにより、最新の有効なログエントリが属するシーケンスを決定し得る。
【００５７】
テーブル９０４と共にログ９０２を参照すると、仮想ディスクパーサ４０４は、ログ９０２を渡り歩き、テーブル９０６を満たす。テーブル９０６が選択された後、仮想ディスクパーサ４０４は、最新の有効なログエントリを含むシーケンスを選択できる。例えば、仮想ディスクパーサ４０４は初期化されて、シーケンスが０に設定され、ログ９０２の先頭に不連続が設定される。要するに、不連続は、データが有効なログエントリを表さない、仮想ディスクファイル内の場所である。例えば、不連続の位置にあるデータは、異なるランタイムからのエントリ、エントリの一部、ランダムデータ等であり得る。仮想ディスクパーサ４０４は、最近の不連続点を追跡し、その位置を用いて、所与のシーケンスが全て有効なエントリを含むか否かを決定し得る。
【００５８】
仮想ディスクパーサ４０４は、ログエントリ１を読み出し、それが有効なログエントリか否かを決定し得る。例えば、仮想ディスクパーサ４０４は、ヘッダ、記述子及び／又はそのペイロード内の情報を調べ、それが有効なログエントリを示すフォーマットに適合するか否かを決定し得る。ログエントリ１が有効であると決定されると、仮想ディスクパーサ４０４は、その中に格納された情報を読み出し、ログエントリ１がコミットされたときのテイルポインタが何かを決定し得る。本例では、ログエントリ１は自身を指す。したがって、仮想ディスクパーサ４０４は、最新の有効なログエントリを含むイベントシーケンスがログエントリ１で開始し及びログエントリ１を含むことを示す情報を格納し得る。不連続は０に初期化されログエントリ１が有効なので、仮想ディスクパーサ４０４は、不連続オフセットを０に等しく保ち得る。
【００５９】
仮想ディスクパーサ４０４は、ログエントリ２をスキャンし、それが有効であり及びログエントリ１を指すと決定し得る。この決定に応答して、仮想ディスクパーサ４０４は、１乃至２である最近の有効なログエントリを含むシーケンスを決定し、この情報をテーブル９０４に格納し得る。本例では、仮想ディスクパーサ４０４は、「最新の」ログエントリからスキャンし始めるので、最後はログエントリ２までである。仮想ディスクパーサ４０４は、ログエントリ３を読み出し、それが有効であること及びそれがテイルがログエントリ２を示すファイルオフセットの位置にあることを示すと決定し得る。本例では、仮想ディスクパーサ４０４は、ログエントリが検出された最新の有効なログエントリであることを、そのシーケンス番号、タイムスタンプ等に基づき決定し、ログエントリ２の識別子がログエントリ３内に存在していることから、シーケンスがログエントリ２で開始すると決定し得る。因みに、ログエントリ２（１ではなく）を指すログエントリ３の存在は、ログエントリ２が生成された後且つログエントリ３が生成される前のあるときに、フラッシュ動作が生じたことを示す。したがって、ログエントリ３は、ログエントリ１が仮想ディスク４０６のディスク上コピーにコミットされた後に生成されたものである。
【００６０】
ログエントリ４を含むべき空間を参照すると、仮想ディスクパーサ４０４は、ログ４２０のこの部分をスキャンし、それが有効なログエントリを記述しないことを決定し得る。例えば、この部分は、誤ったセッション識別子、無効なチェックサムを含み、又はランダムデータである。この決定に応答して、仮想ディスクパーサ４０４は、ログエントリ５の最初のセクタを表すファイルオフセットへの不連続点を更新し、このエントリは有効なシーケンスを記述しないのでシーケンス値をブランクのままにし得る。
【００６１】
先行する動作と同様に、仮想ディスクパーサ４０４は、ログエントリ５をスキャンし、それが有効であり及びログエントリ２を指すと決定し得る。本例では、仮想ディスクパーサ４０４は、ログエントリ２の識別子がログエントリ５内に存在することから、シーケンスがログエントリ２で開始することを決定するよう構成され得る。シーケンス（２−５）内の各ログエントリは有効なエントリではないので、仮想ディスクパーサ４０４は、このシーケンスを検討から外し得る。しかしながら、ログエントリ５は有効であり最近のエントリなので、仮想ディスクパーサ４０４は、応答のためにそれを候補シーケンスに格納し得る。無効なエントリを含むシーケンスを除外する理由の１つは、仮想ディスクパーサ４０４が選択されたシーケンス内の各ログエントリのペイロードを適用するよう構成され、不良データを有するシーケンスを再生することは仮想ディスクファイル４０６を使用不可能にしてしまうからである。
【００６２】
例の説明を続けると、仮想ディスクパーサ４０４は、ログエントリ６を読み出し、それが有効であり及びログエントリ５を指すと決定し得る。この決定に応答して、仮想ディスクパーサ４０４は、最新のログエントリがログエントリ６であり、ログエントリ６はログエントリ５の識別子を含み、及びシーケンス５−６は不連続を有しないと決定し得る。この情報の決定に応答して、仮想ディスクパーサ４０４は、応答のためにシーケンス５乃至６が候補シーケンスであることを識別するために、テーブル９０４内のシーケンス値を更新し得る。テーブル９０４を更新した後、仮想ディスクパーサ４０４は、ログエントリ７を読み出し、それが有効であり及びログエントリ５を指すと決定し得る。この決定に応答して、仮想ディスクパーサ４０４は、最新のログエントリがログエントリ７であり、ログエントリ７はログエントリ５の識別子を含み、及びシーケンス５、６、７は不連続を有しないと決定し得る。この情報の決定に応答して、仮想ディスクパーサ４０４は、応答のためにシーケンス５乃至７が候補シーケンスであることを識別するために、テーブル９０４内のシーケンス値を更新し得る。
【００６３】
ログ７は永続的ログ９０３内に格納された最後のエントリであり、最近の有効なシーケンスを記述するので、仮想ディスクパーサ４０４は、候補シーケンス（本例ではログエントリ５−７）を選択し、それらのペイロードを仮想ディスクファイル４０６に適用し得る。例示的な実施形態では、仮想ディスクパーサ４０４は、各ログエントリの記述子及びペイロードを読み取り、該ペイロードを記述子内で識別されるファイルオフセットに書き込むことにより、変更を適用し得る。例えば、記述子が４０９６のファイルオフセットを有し、ペイロードが４ｋｂの場合、仮想ディスクパーサ４０４は、ファイルオフセット４０９６で開始する４ｋｂのペイロードを書き込み得る。
【００６４】
図９の説明を続け、永続的ログ９０６を参照すると、例示的な永続的ログ９０６、及び永続的ログ９０６の第１及び第２の通過中にテーブル８０８を満たすために実行される動作を示す。テーブル９０４と同様に、テーブル９０８は０で開始するよう初期化され得る。仮想ディスクパーサ４０４は、ログエントリ１２をスキャンすると、ログエントリ１２が有効であり、仮想ディスクパーサ４０４が未だ遭遇していないエントリであるログエントリ９を指すテイルの識別子を含むと決定し得る。したがって、仮想ディスクパーサ４０４は、最新のログエントリがログエントリ１２であり、ログエントリ１２はログエントリ９の識別子を含み、及びシーケンス９−１２は不連続を有しない、つまりログエントリ１０及び１１を示すログエントリであると決定し得る。この情報の決定に応答して、仮想ディスクパーサ４０４は、応答のためにシーケンス１２自体が候補シーケンスであることを識別するために、テーブル９０４内の「シーケンス」値を更新し得る。
【００６５】
テーブル９０８の残りは、仮想ディスクパーサ４０４がログ９０６のログエントリをスキャンするにつれて満たされ、終わりに達すると、仮想ディスクパーサ４０４は、ログ９０６の循環特性によりテーブル９０８を調整するために再び各エントリを再スキャンするよう構成され得る。本例では、ログエントリ１２が再び読み取られると、仮想ディスクパーサ４０４は、ログエントリ１２が有効であり、ログエントリ９を指すテイルの識別子を含み、シーケンスが不連続を含まないと決定し得る。図示のように、仮想ディスクパーサ４０４は、シーケンス９−１４が最新の有効なエントリ（１４）を含み及びシーケンス（９−１４）内の各ログエントリが有効なので、シーケンス９−１４が再生できると決定し得る。
【００６６】
図１０を参照すると、基礎的記憶装置により用いられるセクタサイズの変化を説明するために、ログエントリのサイズを拡張する技術を示す。例えば、仮想ディスクファイル４０６は、より大きなセクタサイズを有する記憶装置を含む新しいコンピュータシステムにコピーされても良い。基礎的記憶装置が変更され、より大きなセクタサイズを有する場合、仮想ディスクパーサ４０４は、各ログエントリにより格納されるペイロードを、セクタサイズに適合するよう拡張し得る。これに関し、ログエントリは、基礎的記憶装置と協調し続ける。
【００６７】
概して、仮想ディスクパーサ４０４が仮想ディスクファイル４０６を開き、セクタサイズが拡張されていると決定すると、仮想ディスクパーサ４０４は新しいログを生成し、古いログに格納されたログエントリを拡張ログエントリに変換するよう構成され得る。拡張処理が完了すると、仮想ディスクパーサ４０４は、ログエントリが再生される必要があるか否かを決定し、ログエントリを再生し、次に実行時間動作モードに入って、図７に関して説明した動作と同様の動作を実行するよう構成され得る。
【００６８】
一実施形態では、拡張処理は、古いセクタサイズと新しいセクタサイズとの間の差を決定し、この情報を用いて古いログエントリと等価なログエントリを生成することを含み得る。例えば、仮想ディスクパーサ４０４は、新しいセクタサイズで仮想ディスクファイルを分割し、新しいセクタの各々が開始する場所を決定し得る。新しいログ内の最初のエントリに対して、仮想ディスクパーサ４０４は、古いログエントリが拡張セクタ内に位置する場所を記述子から決定し、新しいセクタ内に位置する場所である、エントリのペイロードを書き込むペイロードを生成し、ペイロードの残りをディスクからのデータで満たし得る。後続のログエントリの各々に対して、仮想ディスクパーサ４０４は、ペイロードを含む拡張エントリを生成し、前に生成した拡張ログエントリがこのセクタへの変更を記述するか否かを決定し得る。前に生成した拡張ログエントリがこのセクタへの変更を記述する例では、仮想ディスクパーサ４０４は、前に生成した１又は複数の拡張エントリからペイロードをコピーし、ディスクから残りをコピーし得る。
【００６９】
特定の例では、仮想マシン４１０は、４ｋｂセクタを使用する記憶装置を含むコンピュータシステムから、８ｋｂセクタを使用するコンピュータシステムへ移動されると仮定する。この特定の例では、仮想ディスクパーサ４０４は、例えば新しい記憶装置の装置情報を問い合わせることにより、セクタサイズが増大されたと決定し、ログ４２０により使用されるセクタサイズを拡張することを決定し得る。仮想ディスクパーサは、未使用セクションについて仮想ディスクファイル４０６をスキャンし、未使用セクションを新しいログのために使用すると決定し得る。仮想ディスクパーサ４０４は、仮想ディスクファイル４０６の未使用セクション内に拡張ログ９１０を作成し、ログエントリ９０２及び９０４を拡張し始め得る。仮想ディスクパーサ４０４は、ログエントリ１００２をスキャンし、それが例えばファイルオフセット１６ｋｂの位置にあると決定し得る。仮想ディスクパーサ４０４は、１６ｋｂが８ｋｂに揃えられたセクタの最初の部分を表すと決定し得る（例えば、仮想ディスクパーサ４０４は、１６ｋｂを８ｋｂで割り、商が整数、つまり２であると決定し得る）。次に、仮想ディスクパーサ４０４は、拡張ログエントリ１００６を生成し、ログエントリ１００２（Ａ’）のペイロードをログエントリ１００６にコピーし得る。拡張ログ１０１０内のログエントリは８ｋｂなので、拡張ログ１０１０が再生されるとき、メモリ内の永続的仮想ディスクのコピーに書き込まれたデータが正しくなるように、第２の部分がログエントリ１００６に追加される必要がある。これを考慮して、仮想ディスクパーサ４０４は、ファイルオフセット２０ｋｂを更新するペイロードについて拡張ログ１０１０内のログエントリをスキャンし、存在しないと決定するよう構成され得る。この決定に応答して、仮想ディスクパーサ４０４は、永続的仮想ディスクファイル１０００内のファイルオフセット２０ｋｂを読み出し、それをログエントリ１００６にコピーし得る。
【００７０】
ログエントリ１００６が生成された後、仮想ディスクパーサ４０４は、ログエントリ１００４を読み出し、それが仮想ファイルオフセット２０ｋｂへの更新を含むと決定し得る。仮想ディスクパーサ４０４は、２０ｋｂが８ｋｂに揃えられたセクタの第２の部分を表すと決定し、拡張ログエントリ１００８を生成し、ログエントリ１００４のペイロード（Ｂ’）をログエントリ１００８の第２の４ｋｂの大きさの部分にログエントリ１００８にコピーし得る。仮想ディスクパーサ４０４は、ファイルオフセット２０ｋｂを更新するペイロードについて拡張ログ１０１０内のログエントリをスキャンし、ログエントリ１００６がオフセット１６ｋｂを変更したと決定するよう構成され得る。この決定に応答して、仮想ディスクパーサ４０４は、Ａ’をログエントリ１００８の第１の部分にコピーし得る。その結果、これら２つのログエントリが仮想ディスクパーサ４０４により適用されると、仮想ディスクファイルは、仮想ディスクオフセット１６ｋｂにＡ’及びＢ’を含む。各ログエントリが拡張されディスクに適用された後、仮想ディスク４０２は、仮想マシン４１０により使用され得る。
【００７１】
図１１を参照すると、ログエントリを縮小する技術を示す。ログエントリを縮小する基本的原理は、図１０に関して上述したものと同じであり、同様の動作がログを縮小するために用いることができる。図１１では、仮想マシン４１０は、８ｋｂセクタ（又は任意の他の２の冪乗の大きさのセクタ）を使用する記憶装置を含むコンピュータシステムから、４ｋｂセクタを使用するコンピュータシステムへ移動されると仮定する。仮想ディスクパーサ４０４は、所望の仮想ディスクファイル１１００を開き、ログエントリのうちの１つのヘッダ内の情報を新しい記憶装置により提供される情報と比較することにより、セクタサイズが変更されたと決定し得る。この比較に応答して、仮想ディスクパーサ４０４は、ログ４２０により使用されるセクタサイズを縮小するよう構成され得る。仮想ディスクパーサ４０４は、未使用セクションについて仮想ディスクファイル４０６をスキャンし、未使用セクションを新しいログのために使用すると決定し得る。仮想ディスクパーサ４０４は、仮想ディスクファイル４０６の未使用セクション内に縮小ログ１１１０を作成し、ログをスキャンし始め得る。仮想ディスクパーサ４０４は、ログエントリ１１０２をスキャンし、それがファイルオフセット１６ｋｂの位置にあり、及び第１の部分がファイルオフセット１６ｋｂへの変更を表し、第２の部分がファイルオフセット２０ｋｂへの変更を表すと決定し得る。次に、仮想ディスクパーサ４０４は、縮小ログエントリ１１０４及び１１０６を生成し、ログエントリ１１０２の第１の部分をログエントリ１１０４に、ログエントリ１１０２の第２の部分をログエントリ１１０６にコピーし得る。その結果、これら２つのログエントリが仮想ディスクパーサ４０４により適用されると、仮想ディスクファイル４０６は、仮想ディスクオフセット１６ｋｂ及び仮想ディスクファイル２０ｋｂにそれぞれＡ’及びＢを含む。各ログエントリが縮小されＲＡＭ内の仮想ディスクファイルのコピー（仮想ディスクファイル４０６）に適用された後、仮想ディスク４０２は、仮想マシン４１０により使用され得る。
【００７２】
以下に、動作手順を示す一連のフローチャートを示す。理解を容易にするために、フローチャートは、最初のフローチャートが全体的な「対局」図により実装を表し、以降のフローチャートが破線で示される更なる追加及び／又は詳細を提供するよう構成される。さらに、当業者は、破線で示した動作手順が任意と考えられることを理解する。
【００７３】
図１２を参照すると、動作１２００、１２０２、１２０４、１２０６、１２０８を含む動作手順を示す。動作１２００は動作手順を開始する。動作１２０２は、コンピュータシステムが、ランダムアクセスメモリ内の仮想ディスクファイルのログをインスタンス化するよう構成される回路を含むことを示す。ここで、該ログは、順序付きログエントリを有する。例えば、図４を参照すると、コンピュータシステム４００は仮想ディスクパーサ４０４を有し、仮想ディスクパーサ４０４は仮想ディスクファイル４０６からランダムアクセスメモリ内のログ４２０をインスタンス化し得る。図６を参照すると、仮想ディスクパーサ４０４は、ランダムアクセスメモリ内で仮想ディスクファイル４０６を開き、その中に格納されたログ４２０を検出し得る。次に、仮想ディスクパーサ４０４は、ログ４２０をランダムアクセスメモリ１０４内にコピーし得る。図６に示すように、ログ４２０に格納されたログエントリは順序付けられ得る。例えば、各エントリは、シーケンス番号、又はログエントリが書き込まれた順序を示すタイムスタンプのような特定の他の識別子を有し得る。
【００７４】
図１２の説明を続けると、動作１２０４は、コンピュータシステムが、ログ内のログエントリを識別するよう構成される回路を含むことを示す。ここで、該ログエントリは、キャッシュされた入力／出力ジョブを記憶装置にコミットする要求が発行された後に生成されたログ内の最古のログエントリである。仮想ディスクパーサ４０４は、プロセッサ１０２で実行し、テイルの位置を示すポインタを読み出し得る。この例では、テイルは、記憶ディスク１０６にフラッシュ済みログエントリの始めを示す仮想ディスクファイルオフセットを指し得る。言い換えると、テイルは、最古の未フラッシュログエントリを指し得る。図８を参照し、ログ４２０はログ４２０−Ｂと同様の状態にあると仮定する。本例では、仮想ディスクパーサ４０４は、テイルがログ４２０−Ａの始めにあること、例えば仮想ディスクファイルオフセット０又はログエントリ１の最初のオフセットを決定し得る。
【００７５】
図１２に戻ると、動作１２０６は、コンピュータシステムが、識別したログエントリの識別子を新たに生成したログエントリに追加する回路を含み得ることを示す。例えば、仮想ディスクパーサ４０４は、識別子、例えばログエントリ１を格納するために使用されるログ４２０内の最初のバイトを示す仮想ディスクファイルオフセット、識別したログエントリのシーケンス番号、等を新たに生成したログエントリに追加し得る。特定の例では、図８を参照し、ログ４２０はログ４２０−Ａにより示した状態にあると仮定する。本例では、仮想ディスクパーサ４０４は、ログエントリ２を生成し、ログエントリ１の識別子をログエントリ２のヘッダに追加し得る。
【００７６】
図１２の説明を続けると、動作１２０８は、コンピュータシステム４００が、新たに生成したログエントリをログに書き込む回路を含み得ることを示す。仮想ディスクパーサ４０４は、新たに生成したログエントリをログ４２０に書き込み得る。ログエントリを書き込むのに応答して、ログエントリを記述する１又は複数の入力／出力ジョブが、記憶装置１０６に発行され得る。１又は複数のＩＯジョブは、処理され、それらが最終的に永続的記憶ユニット４６０、例えばディスクプラッタ、フラッシュメモリの１又は複数のセル等にコミットされるまで、記憶装置１０６の種々のキャッシュに格納され得る。新たに生成されたログエントリは、記憶装置１０６によりコミットされると、（テイルが記憶装置１０６にコミットされ仮想ディスクファイル４０６に適用される前のイベントログを示す）チェックポイントレコードとして、及びログエントリとして動作する。
【００７７】
図１３を参照すると、図１２に示した動作と共に実行され得る追加動作を示す。動作１３１０は、一実施形態では、コンピュータシステムが、新たに生成したログエントリをログに書き込む回路を有し得ることを示す。ここで、該新たに生成したログエントリは、少なくとも記憶装置のセクタのサイズと同程度のサイズを有するビットパターンを含む。例えば、図７を参照すると、本例では、ログエントリは、永続的記憶ユニット４６０のセクタと同じ大きさのペイロード、例えばビットパターンを有し得る。特定の例では、ログエントリは、ログエントリ７０２、７０４又は７０６と同様であり得る。このログエントリが再生される例では、仮想ディスクパーサ４０４は、ペイロードの内容を、ログ４２０により識別される仮想ディスクファイル４０６内の仮想ディスクファイルオフセットに書き込み得る。
【００７８】
図１３の説明を続けると、動作１３１２は、コンピュータシステムが、新たに生成したログエントリをログに書き込む回路も有し得ることを示す。ここで、該新たに生成したログエントリは、ログエントリのビットパターンが全て０であることを識別する指標を有する。例えば、仮想ディスクパーサ４０４は、全て０のペイロードを有するログエントリを生成すると決定し得る。本例では、このようなログエントリを生成するのではなく、仮想ディスクパーサ４０４は、ペイロードが全て０であると示す記述子内の識別子を含むログエントリを生成し得る。この種のログエントリは、ログエントリがログ４２０内で要する空間量を低減するために用いられ得る。特定の例では、ログエントリは、図７のログエントリ７０８と同様であっても良い。
【００７９】
動作１３１４により示すように、コンピュータシステムは、新たに生成したログエントリをログに書き込む回路を更に有し得る。ここで、該新たに生成したログエントリは、第１のセクタサイズのビットパターン及び第２のセクタサイズのビットパターンを有する。例えば、仮想ディスクパーサ４０４は、互いに依存する仮想ディスクファイルメタデータに対する２つの変更、例えば割り当てテーブル４１６への２つの変更を行う要求を受信し得る。仮想ディスクパーサ４０４は、仮想ディスクファイルメタデータに対する単一の変更をキャプチャするために複数のセクタが変更される必要があるとき、又は別個の変更がトランザクション的に互いに依存するとき、これらの変更が互いに依存し合うと決定し、２以上のペイロードを有する単一のログエントリを生成するよう構成され得る。特定の例では、仮想ディスクパーサ４０４により生成されたログエントリは、図７のログエントリ７０４と同様であっても良い。
【００８０】
図１３の説明を続けると、動作１３１６は、コンピュータシステムが、仮想ディスクファイルのファイルオフセットの終わりを識別する情報を、新たに生成したログエントリに追加するよう構成される回路を有し得ることを示す。例えば、仮想ディスクパーサ４０４は、新たに生成したログエントリをログ４２０に書き込む前に、仮想ディスクファイル４０６のファイルの終わりを識別する情報を新たに生成したログエントリに追加し得る。例えば、仮想ディスクファイル４０６は、仮想ディスク４０２が仮想マシン４１０によりどのように使用されるかに基づき拡張され得る。仮想ディスクファイル４０６への他の書き込みと同様に、ＥＯＦ（end  of  file）を拡張する書き込みは、記憶装置１０６によりフラッシュが完了するまで永続的であることが保証されない。したがって、仮想ディスクパーサ４０４は、仮想ディスクファイル４０６のＥＯＦがログエントリ内のＥＯＦと異なる場合にＥＯＦを正すために、ログエントリが生成されるときＥＯＦを識別する情報を仮想ディスクファイル４０６に追加するよう構成され得る。
【００８１】
動作１３１８を参照すると、コンピュータシステムが、キャッシュされた入力／出力ジョブをコミットさせる要求を受信するのに応答して、ログエントリ及び新たに生成したログエントリにより識別される仮想ディスクファイルに対する変更を適用するよう構成される回路も含み得ることを示す。例えば、ログエントリがログ４２０に書き込まれた後のあるときに、フラッシュコマンドが発行され得る。フラッシュが記憶装置１０６に発行されると、仮想ディスクパーサ４０４は、仮想ディスクファイル４０６への最後のフラッシュ以来記録されたログエントリのペイロードセクション内の変更を適用し、それにより、ＩＯジョブを記憶装置１０６に発行させ得る。特定の例では、図７のログ４２０−Ｄ及び４２０−Ｅを参照し、フラッシュコマンドは、テイルポインタがログエントリ３の最初のセクタを指しているときに発行されたと仮定する。フラッシュの発行に応答して、仮想ディスクパーサ４０４は、最後のフラッシュ以来記録されたログエントリ、つまりテイルポインタがフラッシュはログエントリ２の後に完了したと示すのでログエントリ３を識別し、ログエントリ３のペイロードを仮想ディスクファイル４０６に適用し得る。特定の例では、ペイロードは、割り当てテーブル４１６に対する更新であり得る。ログエントリ３のペイロードが仮想ディスクファイル４０６に適用された後、仮想ディスクパーサ４０４は、ログ４２０−Ｅにより示すようにログエントリ４が書き込まれる場所を指すようテイルポインタを更新し得る。次に、仮想ディスクパーサ４０４は、別のフラッシュを発行し得る。しかしながら、ログエントリのフラッシュは、仮想ディスクファイル４０６に対するログエントリにより記述される変更のフラッシュと等価なので、仮想ディスクパーサ４０４は、別のフラッシュを発行する必要がない。
【００８２】
特定の例では、仮想ディスクパーサ４０４は、フラッシュコマンドを発行しても良い。例えば、仮想ディスクパーサ４０４は、所定の時間期間に設定されるタイマを有しても良い。タイマが終了すると、仮想ディスクパーサ４０４は、フラッシュコマンドを発行するよう構成され得る。当業者は、所定の時間間隔がコンピュータシステム内のハードウェアの種類に基づき及びフラッシュを完了するのに要する（時間的）コストを考慮して設定され得ることを理解する。追加で又は代替で、仮想ディスクパーサ４０４は、ログ４２０内のメモリプレッシャ（memory  pressure）に応答して、記憶装置１０６にフラッシュコマンドを発行するよう構成され得る。例えば、ログ４２０のサイズは限られても良く、仮想ディスクパーサ４０４は、ログファイルを格納するためにログ４２０内に所定量の空間が割り当てられる場合に、フラッシュコマンドを発行するよう構成されても良い。同様に、所定量の空間は、コンピュータシステム内のハードウェアの種類、ログ４２０のサイズ、フラッシュを完了するのに要する時間量、等に基づき設定され得る。図７を参照すると、ログエントリ７１０と同様のログエントリは、ログ４２０内のメモリプレッシャが閾を超える場合に、フラッシュ動作を開始するために用いられ得る。
【００８３】
フラッシュは、仮想マシン４１０又はクライアントコンピュータシステム５０６により発行され得る。例えば、アプリケーション４２４は、１０分毎に自動保存するよう設定されるワープロプログラムであると仮定する。タイマが終了すると、ワープロプログラムは、ファイルの内容を保存するためにゲストオペレーティングシステム４１２にフラッシュを発行し得る。フラッシュ要求の受信に応答して、ゲストオペレーティングシステム４１２は、ファイルシステム４１４にフラッシュするよう指示し、仮想ディスクパーサ４０４は最終的にフラッシュ要求を受信し得る。次に、仮想ディスクパーサ４０４は、仮想化システムファイルシステム４０８にフラッシュを発行し得る。したが、仮想ディスクファイルメタデータに対する変更は、仮想マシン４１０又はコンピュータシステム５０６により開始されたフラッシュ動作を外し得る。仮想ディスクパーサ４０４は、記憶装置１０６がフラッシュを完了したことを示す肯定応答信号を受信し、フラッシュの完了をファイルシステム４１４に報告し得る。
【００８４】
図１４を参照すると、図１３の動作１３１８と共に実行され得る追加動作を示す。動作１４２０により示すように、コンピュータシステムは、追加ログエントリをログに書き込む回路も含み得る。ここで、該追加ログエントリは追加ログエントリの識別子を含み、該追加ログエントリは、キャッシュされた入力／出力ジョブをコミットする要求が記憶装置に発行された後に生成されたログ内の最古のログエントリである。例えば、フラッシュ後のあるときに、仮想ディスクファイル４０６のメタデータに対する別の変更が、仮想ディスクパーサ４０４により行われ得る。本例では、仮想ディスクパーサ４０４は、変更を示すペイロードを有する別のログエントリを生成し、どの識別子を追加ログエントリに書き込むかを決定するために、テイルについてメモリポインタを調べる。ログエントリ及び新たに生成したログがフラッシュされるので、仮想ディスクパーサ４０４は、追加ログエントリの識別子を追加ログエントリに追加し、それをログ４２０に書き込み得る。図８、特にログ４２０−Ｅに戻り、仮想ディスクパーサ４０４が、ログエントリ４を生成し、ログエントリ１−３はコミット及び適用されたと決定すると仮定する。この決定に応答して、仮想ディスクパーサ４０４は、ログエントリ４の開始位置を示す仮想ディスクファイルオフセットをログエントリ４のヘッダに追加し、ログエントリ４をログ４２０に書き込み得る。
【００８５】
図１４に戻ると、動作１４２２は、一実施形態では、コンピュータシステムは、ログエントリが記憶装置にコミットされ仮想ディスクファイルに適用されたという決定に応答して、ログエントリを上書きする回路を有し得ることを示す。例えば、仮想ディスクパーサ４０４は、フラッシュされたログエントリを上書きするよう構成され得る。一実施形態では、テイルポインタの配置は、フラッシュ済みログエントリを未フラッシュログエントリと区別するために用いられ得る。仮想ディスクパーサ４０４は、テイルポインタを示す仮想ディスクファイルオフセット値よりも小さい仮想ディスクファイルオフセット値を有するログエントリを上書きするよう構成され得る。図８、特にログ４２０−Ｆ及び４２０−Ｇを参照すると、仮想ディスクパーサ４０４は、ログエントリ５を生成し、ログ４２０の終わりに達したと決定し得る。次に、仮想ディスクパーサ４０４は、テイルのアドレスを決定し、テイルポインタの位置によりログエントリ１−３がフラッシュされたと決定し得る。次に、仮想ディスクパーサ４０４は、ログ４２０−Ｇにより示すように、ログエントリ５をログ４２０に書き込み得る。
【００８６】
図１４の説明を続けると、動作１４２４は、コンピュータシステムが、仮想ディスクファイルが不適切に閉じられたという決定に応答してログをスキャンする回路、有効なログエントリのシーケンスを識別する回路であって、該シーケンスはログに書き込まれた最新の有効なログエントリを含み、シーケンス内の各ログエントリは不連続の後にログに書き込まれる、回路、及びログエントリのシーケンスにより識別された仮想ディスクファイルに対する変更を適用する回路、を有し得ることを示す。例えば、電源障害が、コンピュータシステム４００の動作中のあるときに生じ得る。コンピュータシステム４００は再起動されても良く、仮想化システム４２０が実行されても良い。仮想ディスクパーサ４０４が動作し始め、仮想マシン４１０を起動する要求が受信されても良い。仮想ディスクパーサ４０４は、記憶装置１０６に格納された仮想ディスクファイル４０６を開き、ログ４２０を開き得る。仮想ディスクパーサ４０４は、永続的ログ４２０に格納されたログエントリ４２０を読み出し、その中に有効なエントリのシーケンスが存在するか否かを決定し得る。次に、仮想ディスクパーサ４０４は、有効なエントリのシーケンスを選択し得る。つまり、シーケンス内の各エントリは有効であり、シーケンスは最近のエントリを有し、シーケンス内の各ログエントリは、最近の不連続ポイントの後に書き込まれている。シーケンスが識別されると、仮想ディスクパーサ４０４は、シーケンス内のログエントリから１又は複数のペイロードを抽出し、それらを仮想ディスクファイル４０６に適用し、仮想ディスクファイル４０６のディスク上コピーを変更するために、１又は複数のＩＯジョブを記憶装置１０６に発行させる。
【００８７】
特定の例では、図９を参照し、ログ４２０はリブート後に永続的ログ９０２と同様に見えると仮定する。本例では、仮想ディスクパーサ４０４は、最新の有効なエントリ（ログエントリ７）を含みシーケンス内の各ログエントリが最近の不連続（ログエントリ４）の後に書き込まれた有効なエントリのシーケンス（ログエントリ５−７）を識別し得る。この特定の例では、仮想ディスクパーサ４０４は、ログエントリ５−７を選択し、各ログエントリからペイロード及び仮想ディスクファイルオフセットを抽出するよう構成され得る。次に、仮想ディスクパーサ４０４は、仮想ディスクファイル４０６に各ペイロードを順次適用し得る。
【００８８】
図１４の説明を続けると、動作１４２６は、コンピュータシステムが、仮想ディスクファイルは拡張セクタサイズを有する第２の記憶装置に移動されたという決定に応答して、第２のログを生成する回路、及びログエントリから得たビットパターンと仮想ディスクファイルから得たビットパターンとを有する拡張ログエントリを第２のログエントリに書き込む回路、を有し得ることを示す。例えば、仮想ディスクファイル４０６は、コンピュータシステム４００から、同様の構成を有するが記憶装置のセクタサイズがより大きい異なるコンピュータシステムにコピーされると仮定する。例えば、記憶装置１０６のセクタサイズは４ｋｂであり、より大きい記憶装置のセクタサイズは８ｋｂであると仮定する。本例では、仮想ディスクパーサ４０４は、メモリ内で仮想ディスクファイル４０６を開き、ログ４２０を読み出し得る。仮想ディスクパーサ４０４は、より大きい記憶装置のセクタサイズがログエントリ内のペイロードよりも大きいと決定し、ログエントリのサイズを拡張することを決定し得る。特定の例では、仮想ディスクパーサ４０４は、仮想ディスクファイル４０６に適用すべきイベントのシーケンスを識別し、次に選択したシーケンスを反映する新しい拡張ログを生成し得る。特定の例では、拡張ログは、図１０に示した拡張ログ１０１０と同様であり、拡張ログエントリはログエントリ１００６と同様であり得る。拡張ログが生成された後、仮想ディスクパーサ４０４は、ログエントリからのペイロード及び仮想ディスクファイル４０６からのデータを有するログエントリを生成するよう構成され得る。
【００８９】
図１４の説明を続けると、動作１４２８は、コンピュータシステムが、仮想ディスクファイルは拡張セクタサイズを有する第２の記憶装置に移動されたという決定に応答して、第２のログを生成する回路、及び第２のログエントリから得た第２のセクタのビットパターンと第１のログエントリから得た第１のセクタのビットパターンとを有する拡張ログエントリを第２のログに書き込む回路、を有し得ることを示す。例えば、仮想ディスクファイル４０６は、コンピュータシステム４００から、同様の構成を有するが記憶装置のセクタサイズがより大きい異なるコンピュータシステムにコピーされると仮定する。例えば、記憶装置１０６のセクタサイズは４ｋｂであり、より大きい記憶装置のセクタサイズは８ｋｂであると仮定する。本例では、仮想ディスクパーサ４０４は、メモリ内で仮想ディスクファイル４０６を開き、ログ４２０を読み出し得る。仮想ディスクパーサ４０４は、より大きい記憶装置のセクタサイズがログエントリ内のペイロードよりも大きいと決定し、ログエントリのサイズを拡張することを決定し得る。次に、仮想ディスクパーサ４０４は、ログ４２０から得た複数のログエントリからのデータを含む拡張ログエントリを生成し得る。特定の例では、拡張ログは、図１０に示した拡張ログ１０１０と同様であり、拡張ログエントリはログエントリ１００８と同様であり得る。
【００９０】
図１５を参照すると、動作１５００、１５０２、１５０４、１５０６、１５０８を含む動作手順を示す。動作１５００は動作手順を開始する。動作１５０２は、コンピュータシステムが、仮想ディスクファイルのログにアクセスするよう構成される回路を含むことを示す。ここで、該ログは、連続的順序で書き込まれたログエントリを有する。例えば、仮想ディスクパーサ４０４は、ランダムアクセスメモリ１０４内で仮想ディスクファイル４０６を開き得る。仮想ディスクパーサ４０４は、仮想ディスクファイル４０６を読み出し、その中に格納されたログ４２０を検出し得る。特定の例では、ログ４２０は、図９のログ９０２又は９０６と同様であり得る。
【００９１】
図１５の説明を続けると、動作１５０４は、コンピュータシステム４００がシーケンス内の各ログエントリが有効であるという決定に応答して、最新の有効なログエントリを有するログエントリのシーケンスを選択する回路を含み得ること、及び各ログエントリはログファイル内の不連続の後にログに書き込まれたことを示す。例えば、仮想ディスクパーサ４０４は、ログ４２０内の各ログエントリをスキャンし、各有効なログエントリが属するシーケンスを識別する情報のテーブルを生成し得る。例えば、ログ４２０がログ９０６と同様であると仮定すると、仮想ディスクパーサ４０４は、テーブル９０８と同様のテーブルを生成し得る。テーブル９０８が満たされ、２回目にスキャンされた後、仮想ディスクパーサ４０４は、最新のログエントリを含み各ログエントリが不連続の後にログに書き込まれた有効なエントリのシーケンスを選択し得る。この特定の例では、仮想ディスクパーサ４０４は、最近の有効なログエントリ（ログエントリ１４）を含み各エントリが最近の不連続（ログエントリ８が存在すべき場所に位置する不連続）の後に書き込まれたシーケンス９−１４を選択し得る。
【００９２】
動作１５０６を参照すると、コンピュータシステム４００が、ログエントリのシーケンスにより識別される仮想ディスクファイルのセクタに対する変更を適用する回路も含み得ることを示す。図９に戻り、ログ４２０がログ９０８と同様である例では、仮想ディスクパーサ４０４は、ログイベント９−１４を再生することを決定し得る。仮想ディスクパーサ４０４は、ペイロード及び仮想ディスクファイルオフセット値を抽出し、仮想ディスク４０６にペイロードを書き込み得る。ペイロードの書き込みは、ディスクにそれらをコミットするために、記憶装置１０６にＩＯジョブを発行する。
【００９３】
図１６を参照すると、コンピュータシステムに実行され得る代替動作を示す。動作１６０８を参照すると、コンピュータシステムが、ログエントリのシーケンス内のログエントリに格納されたファイル識別子の終わりに基づき、仮想ディスクファイルのファイル識別子の終わりを変更する回路を含むよう構成され得ることを示す。例えば、仮想ディスクパーサ４０４は、仮想ディスクファイル４０６のＥＯＦが記録されたものと異なることを示す選択されたシーケンス内の１又は複数のログエントリを検出するのに応答して、仮想ディスクファイル４０６のＥＯＦを変更し得る。例えば、情報がＥＯＦが記録は拡張されたと示す場合、仮想ディスクパーサ４０４は、ログエントリ内に存在するものと一致するよう、仮想ディスクファイル４０６を拡張し得る。
【００９４】
動作１６１０を参照すると、一実施形態では、コンピュータシステムが、仮想ディスクファイルを格納する記憶装置のセクタサイズが増大したという決定に応答して、第２のログを生成する回路、及び仮想ディスクファイルから得たビットパターンとログ内のログエントリからのビットパターンとを有する拡張ログエントリを第２のログに書き込む回路を含み得ることを示す。例えば、仮想ディスクパーサ４０４は、仮想ディスクファイル４０６を開き、ログ４２０をスキャンし得る。仮想ディスクパーサ４０４は、ログ４２０が生成された記憶装置のセクタサイズを決定し、それを仮想ディスクファイル４０６を現在格納している記憶装置のセクタサイズと比較し得る。本例では、ログ４２０は異なるコンピュータシステム上に生成され、記憶装置１０６のセクタサイズは該異なるコンピュータシステムにより使用されるセクタサイズより大きいと仮定する。例えば、記憶装置１０６のセクタサイズは８ｋｂであり、前に仮想ディスクファイル４０６を格納していた記憶装置のセクタサイズは４ｋｂであると仮定する。この決定に応答して、仮想ディスクパーサ４０４は、新しい拡張ログを生成することにより、ログエントリのサイズを拡張し得る。’
例示的な構成では、仮想ディスクパーサ４０４は、再生すべきログ４２０内のログエントリのシーケンスを決定し、シーケンス内の各ログエントリのために拡張エントリを生成し得る。仮想ディスクパーサ４０４は、シーケンス内の各ログエントリについて、記憶装置１０６により使用されるセクタサイズの複数倍に等しい（特定の例では、８ｋｂの複数倍に等しい）ペイロードを有する拡張エントリを生成し得る。次に、シーケンス内の各ログエントリについて、仮想ディスクパーサ４０４は、記憶装置１０６により使用されるセクタサイズ及び古いログエントリからの記述子を用いて、新しいログエントリが記憶装置１０６のセクタサイズと揃うようにペイロードを新しいログエントリのどこに挿入すべきかを決定し得る。最初の新しいログエントリについて、仮想ディスクパーサ４０４は、仮想ディスクファイル４０６からのデータを用いてペイロードの残りを満たし得る。そして、各後続のエントリについて、仮想ディスクパーサ４０４は、ディスク上のデータとシーケンス内の古いログエントリからのデータとの組合せを使用し得る。
【００９５】
図１６の説明を続けると、動作１６１２は、コンピュータシステム４００が、仮想ディスクファイルを格納している記憶装置のセクタサイズが減少したという決定に応答して、第２のログを生成する回路、及びログ内のログエントリから得たビットパターンの一部を含む第１の縮小ログエントリ及びログ内のログエントリからのビットパターンの残りの部分を含む第２の縮小ログエントリを第２のログに書き込む回路を有し得ることを示す。例えば、仮想ディスクパーサ４０４は、基礎的記憶装置により使用されるセクタサイズがログ４２０内に示されるセクタサイズよりも小さいと決定するよう構成され得る。任意的構成では、仮想ディスクパーサ４０４は、仮想ディスクファイル４０６内に新しい縮小ログを生成し、記憶装置１０６のセクタサイズを用いて各ログエントリを複数のログエントリに分けることにより、再生すべき選択されたログエントリのシーケンスを縮小ログエントリに変換し得る。縮小ログエントリが生成されると、仮想ディスクパーサ４０４は、仮想ディスクファイル４０６にペイロードを適用することによりそれらを再生し得る。縮小ログエントリに関連付けてペイロードを書き込む動作により、１又は複数のＩＯジョブが記憶装置１０６に発行される。記憶装置１０６は、キャッシュ４５４内にＩＯジョブを格納し、そして最終的にそれらを仮想ディスクファイル４０６のディスク上コピーにコミットし得る。ログ４２０は縮小できるが、縮小される必要はない。より大きなセクタサイズのために生成されたログを、より小さいセクタサイズを有する装置で再生することは無難である。
【００９６】
図１６の説明を続けると、動作１６１４は、コンピュータシステムが、各ログエントリをログに書き込む前に、最古の未フラッシュログエントリの識別子を各ログエントリに追加する回路を更に含み得ることを示す。例えば、仮想ディスクパーサ４０４は、割り当てテーブル４１６に対する更新のような、仮想ディスクファイル４０６のメタデータを更新すると決定する。仮想ディスクパーサ４０４は、ログ４２０内の最古の未フラッシュログエントリを識別するメモリポインタを調べ得る。本例では、仮想ディスクパーサ４０４は、最古の未フラッシュログエントリの識別子、例えば識別したログエントリを格納するために使用される最初のセクタを示す仮想ディスクファイルオフセット、識別したログエントリのシーケンス番号、等を、生成した各ログエントリに追加するよう構成され得る。
【００９７】
図１６の説明を続けると、動作１６１６は、コンピュータシステム４００が、後に書き込まれたログエントリが、フラッシュ済みログエントリは記憶装置にコミットされ仮想ディスクファイルに適用されたことを示す情報を含むという決定に応答して、フラッシュ済みログエントリを上書きする回路を更に有し得ることを示す。例えば、仮想ディスクパーサ４０４は、別のログエントリがフラッシュ済みログエントリは実際にフラッシュされたと示す情報を含む場合に、フラッシュされたログエントリを上書きするよう構成され得る。例示的な実施形態では、この情報は、より最近のログエントリの識別子の存在であり得る。別のログエントリ内にあるより最近のログエントリの識別子の存在は、より最近のログエントリの前のログエントリがディスクにフラッシュされたという事実を示す。例えば、図８のログ４２０−Ｆを参照する。ログエントリ４内のログエントリ４の識別子の存在は、ログエントリ１−３がフラッシュされたこと及び仮想ディスクファイル４０６に適用されたことを示す。
【００９８】
図１７を参照すると、動作１７００、１７０２、１７０４及び１７０６を含む、コンピュータシステム４００が実行するよう構成され得る動作手順を示す。動作１７００は動作手順を開始する。動作１７０２は、コンピュータシステムが、仮想マシンの仮想ディスクをインスタンス化する回路を含むことを示す。ここで、該仮想ディスクは、仮想ディスクファイルによりバックアップされる。例えば、図４を参照すると、コンピュータシステム４００は仮想ディスクパーサ４０４を有し、仮想ディスクパーサ４０４は仮想マシン４１０内の仮想ディスク４０２をインスタンス化し得る。図５を参照すると、仮想ディスク４０２は、仮想ディスクファイル４０６によりバックアップされ得る。言い換えると、仮想ディスクファイル４０６は、仮想ディスク４０２の基礎的データを格納し得る。
【００９９】
図１７の説明を続けると、動作１７０４は、限定ではなく、コンピュータシステムが、仮想ディスクファイルに書き込むべきビットパターンを決定する回路を更に含み得ることを示す。仮想ディスクパーサ４０４は、仮想マシン４１０からのＩＯジョブ又は特定の他の信号の受信に応答して、仮想ディスクファイルのメタデータを変更すると決定し得る。特定の例では、仮想ディスク４０２のブロックは仮想マシン４１０により書き込まれ、このブロックは仮想ディスクファイル４０６の任意の部分により記述されないと仮定する。仮想ディスクパーサ４０４は、仮想ディスクブロックを記述するために使用すべき仮想ディスクファイルのセクションを選択し、割り当てテーブル４１６のメモリ内コピーを更新し、仮想ディスクファイル４０６内に格納された、割り当てテーブル４１６のディスク上コピーに書き込むべき、仮想ディスクブロックを仮想ディスクファイルのセクションにリンク付けする情報を示すビットパターンを生成しても良い。
【０１００】
図１７の説明を続けると、動作１７０６は、コンピュータシステムが、ランダムアクセスメモリ内に格納されたログであって、順序付きログエントリを含むログに書き込むべきビットパターンを有するログエントリを生成する回路を有し得ることを示す。例えば、仮想ディスクパーサ４０４は、ログエントリを生成し、該ログエントリのペイロードセクションにビットパターンを書き込むよう構成され得る。図７を参照すると、特定の例示的な実施形態では、仮想ディスクパーサ４０４は、ログエントリ７０２、７０４又は７０６と同様のフォーマットを有するログエントリを生成し得る。本例では、ログエントリは、データがログエントリであることを識別するヘッダ、シーケンス番号、タイムスタンプ、セッション番号（エントリのセッションを識別する）等、ビットパターンを書き込むべき仮想ディスクファイル４０６内の位置を識別する記述子、及びビットパターン又はその一部を含むペイロードセクションを有し得る。
【０１０１】
図１７に戻ると、動作１７０８は、限定ではなく、コンピュータシステムが、最古の未フラッシュログエントリの識別子をログに追加する回路を更に含み得ることを示す。例えば、仮想ディスクパーサ４０４は、ログ４２０内の最古の未フラッシュログエントリを識別するメモリポインタを調べ、ログエントリ内のこの未フラッシュエントリを識別するために使用できる情報を格納し得る。本例では、仮想ディスクパーサ４０４は、最古の未フラッシュログエントリの識別子、例えば識別したログエントリを格納するために使用される最初のセクタを示す仮想ディスクファイルオフセット、識別したログエントリのシーケンス番号、等を、生成した各ログエントリに追加するよう構成され得る。特定の例では、図８を参照し、ログ４２０はログ４２０−Ａにより示した状態にあると仮定する。本例では、仮想ディスクパーサ４０４は、ログエントリ２を生成し、テイルのアドレスをログエントリ２のヘッダ、つまりログエントリ１が最古の未フラッシュエントリであることを識別する識別子に追加し得る。
【０１０２】
動作１７１０を参照すると、コンピュータシステムが、ログエントリをログに書き込む回路を更に含み得ることを示す。仮想ディスクパーサ４０４は、ログエントリをログ４２０に書き込み得る。ログエントリを示す１又は複数のＩＯジョブは、記憶装置１０６に発行され得る。これらの１又は複数のＩＯジョブは、それらが最終的に永続的記憶ユニット４６０、例えばディスクプラッタ、フラッシュＲＡＭ、等にコミットされるまで、キャッシュ４５４に格納され得る。
【０１０３】
図１８を参照すると、図１７に示した動作と共に実行され得る追加動作を示す。動作１８１２は、限定ではなく、コンピュータシステムが、フラッシュコマンドを記憶装置に発行する回路、記憶装置がフラッシュ動作を完了したと示す信号の受信に応答して、ログエントリからのビットパターンを仮想ディスクファイルに適用する回路を含むよう構成され得ることを示す。例えば、ログエントリがログ４２０に書き込まれた後のあるときに、仮想ディスクパーサ４０４は、記憶装置１０６にフラッシュコマンドを発行し、それにより、記憶装置１０６に保留中のＩＯジョブを永続的記憶ユニット４６０に書き込ませ、動作の完了を報告させる。仮想ディスクパーサ４０４が、フラッシュ動作が終了したと示す肯定応答を受信すると、仮想ディスクパーサ４０４は、仮想ディスクファイル４０６に今しがたフラッシュされたログエントリのペイロードセクションに変更を適用し得る。この結果、仮想ディスクファイル４０６に対する変更を示すＩＯジョブは、記憶装置１０６に発行される。仮想ディスクパーサ４０４は、任意的に別のフラッシュを発行し、これらのＩＯジョブに、これらのＩＯジョブが永続的記憶ユニット４６０にコミットされることを保証させる。しかしながら、これらのＩＯジョブは永続的ログにより記述されるので、フラッシュ動作は必要ない。
【０１０４】
図１８の説明を続けると、動作１８１４は、例示的な実施形態では、コンピュータシステムが、動作１８１２を実行する回路を有し、電源障害が発生したという決定に応答して、記憶装置に格納されたログのコピーをスキャンする回路、シーケンス内の各ログエントリが有効であるという決定に応答して、ログのコピーからログエントリのシーケンスを選択する回路であって、該シーケンスは最新の有効なログエントリを含み、各ログエントリはログファイル内の不連続の後にログに書き込まれている、回路、並びにログエントリのシーケンスにより識別される仮想ディスクファイルのセクタに対する変更を適用する回路、を更に有し得ることを示す。例えば、電源障害は、コンピュータシステム４００の動作中のあるときに、しかしログエントリがフラッシュされた後に生じ得る。コンピュータシステム４００は再起動されても良く、仮想化システム４２０が実行されても良い。仮想ディスクパーサ４０４が動作し始め、仮想マシン４１０を起動する要求が受信されても良い。仮想ディスクパーサ４０４は、記憶装置１０６に格納された仮想ディスクファイル４０６の永続的コピーを開き、ログ４２０を読み出し得る。仮想ディスクパーサ４０４は、ログエントリを読み出し、再生すべき有効なログエントリのシーケンスを選択し得る。仮想ディスクパーサ４０４は、１又は複数の有効なログエントリを含むシーケンスを選択し得る。ここで、該シーケンスは最新のログエントリを有し、該シーケンスは不連続点を有しない。シーケンスが識別されると、仮想ディスクパーサ４０４は、シーケンスから１又は複数のペイロードを抽出し、それらを仮想ディスクファイル４０６に適用し得る。
【０１０５】
以上の詳細な説明では、例及び／又は動作図を介してシステム及び／又は処理の種々の実施形態を説明した。このようなブロック図、及び／又は例が１又は複数の機能及び／又は動作を含む限り、当業者は、このようなブロック図又は例に含まれる各機能及び／又は動作が、広範なハードウェア、ソフトウェア、ファームウェア又は実質的にこれらの如何なる組合せにより個々に及び／又は集合的に実施され得ることを理解する。
【０１０６】
本願明細書に記載された本発明の主題の特定の態様が示され説明されたが、当業者は、本願明細書の教示に基づき、本願明細書に記載された主題およびその広範な態様から逸脱することなく変更及び修正が為されても良く、したがって添付の請求の範囲が、その範囲内に、そのような全ての変更及び修正を本願明細書に記載された主題の真の精神及び範囲内にあるものとして包含することを理解する。
【図１】
0005932973.tif 000002
【図２】
0005932973.tif 000003
【図３】
0005932973.tif 000004
【図４】
0005932973.tif 000005
【図５Ａ】
0005932973.tif 000006
【図５Ｂ】
0005932973.tif 000007
【図６】
0005932973.tif 000008
【図７】
0005932973.tif 000009
【図８】
0005932973.tif 000010
【図９】
0005932973.tif 000011
【図１０】
0005932973.tif 000012
【図１１】
0005932973.tif 000013
【図１２】
0005932973.tif 000014
【図１３】
0005932973.tif 000015
【図１４】
0005932973.tif 000016
【図１５】
0005932973.tif 000017
【図１６】
0005932973.tif 000018
【図１７】
0005932973.tif 000019
【図１８】
0005932973.tif 000020