(57)【要約】【課題】負荷分散を行う仮想マシンを動的に配備すること。【解決手段】演算部１１ｂは、仮想マシン１３，１３ａとの通信を制御する仮想マシン１３ｂの配備指示を受けると、仮想マシン１３が有しており仮想マシン１３ａとの通信に利用されるドライバＤ１１に対応するドライバＤ３１と、仮想マシン１３，１３ｂの通信に利用されるドライバＤ３２とを仮想マシン１３ｂに作成して仮想ブリッジＢ２により接続する。演算部１１ｂは、ドライバＤ１１が使用するバッファ領域Ａ１をドライバＤ３１のバッファ領域に変更した後、ドライバＤ１１を無効にし、ドライバＤ３１を有効にする。【選択図】図１
2016170669.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータが、
１以上の仮想マシンとの通信機能を有する第１の仮想マシンと第２の仮想マシンとの通信を制御する新規仮想マシンの配備指示を受けると、前記第１の仮想マシンが有しており前記第２の仮想マシンとの通信に利用される第１のドライバに対応する第２のドライバと、前記新規仮想マシンと前記第１の仮想マシンとの通信に利用される第３のドライバとを前記新規仮想マシンに作成して仮想ブリッジにより接続し、
前記第１のドライバが使用するバッファ領域を前記第２のドライバのバッファ領域に変更した後、前記第１のドライバを無効にし、前記第２のドライバを有効にする、
負荷分散機能配備方法。
【請求項２】
前記第１のドライバによるデータの書き込みを検出し、前記データの書き込み先を前記第２のドライバのバッファ領域に変更する、請求項１記載の負荷分散機能配備方法。
【請求項３】
前記検出では、前記第１のドライバによるデータの書き込み先を、前記第１のドライバからデータの書き込みが禁止されているアドレスに設定することで、前記第１のドライバによるデータの書き込み時に割り込みを発生させる、請求項２記載の負荷分散機能配備方法。
【請求項４】
前記新規仮想マシンは、前記第２の仮想マシンを含む複数の仮想マシンに対する負荷分散を実行する仮想マシンである、請求項１乃至３の何れか１項に記載の負荷分散機能配備方法。
【請求項５】
前記第２の仮想マシンのＩＰ（Internet Protocol）アドレスを、前記新規仮想マシンの配備前と配備後とで同じにする、請求項４記載の負荷分散機能配備方法。
【請求項６】
仮想マシンが通信するデータを格納するバッファ領域を含む記憶部と、
１以上の仮想マシンとの通信機能を有する第１の仮想マシンと第２の仮想マシンとの通信を制御する新規仮想マシンの配備指示を受けると、前記第１の仮想マシンが有しており前記第２の仮想マシンとの通信に利用される第１のドライバに対応する第２のドライバと、前記新規仮想マシンと前記第１の仮想マシンとの通信に利用される第３のドライバとを前記新規仮想マシンに作成して仮想ブリッジにより接続し、前記第１のドライバが使用するバッファ領域を前記第２のドライバのバッファ領域に変更した後、前記第１のドライバを無効にし、前記第２のドライバを有効にする演算部と、
を有する負荷分散機能配備装置。
【請求項７】
コンピュータに、
１以上の仮想マシンとの通信機能を有する第１の仮想マシンと第２の仮想マシンとの通信を制御する新規仮想マシンの配備指示を受けると、前記第１の仮想マシンが有しており前記第２の仮想マシンとの通信に利用される第１のドライバに対応する第２のドライバと、前記新規仮想マシンと前記第１の仮想マシンとの通信に利用される第３のドライバとを前記新規仮想マシンに作成して仮想ブリッジにより接続し、
前記第１のドライバが使用するバッファ領域を前記第２のドライバのバッファ領域に変更した後、前記第１のドライバを無効にし、前記第２のドライバを有効にする、
処理を実行させる負荷分散機能配備プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は負荷分散機能配備方法、負荷分散機能配備装置および負荷分散機能配備プログラムに関する。
【背景技術】
【０００２】
情報処理の分野では、物理的なコンピュータ（物理マシンと呼ぶことがある）上で、１以上の仮想的なコンピュータ（仮想マシンと呼ぶことがある）を実行する仮想化技術が利用されている。それぞれの仮想マシンにおいて、オペレーティングシステム（ＯＳ：Operating System）が実行される。仮想マシンを実行するコンピュータでは、例えば、ＣＰＵ（Central Processing Unit）やＲＡＭ（Random Access Memory）などのコンピュータのリソースを仮想マシンに割り当てるソフトウェア（ハイパーバイザと呼ぶことがある）が実行される。各仮想マシンのＯＳは、割り当てられたリソースの範囲内で、アプリケーションプログラムのスケジューリングなどの制御を行う。
【０００３】
近年では、ネットワーク経由で、コンピュータのリソースおよび仮想マシンの利用環境をユーザに提供するサービスも利用されている。このようなサービス利用形態として、例えばＩａａＳ（Infrastructure as a Service）がある。
【０００４】
仮想マシンに対し、ＯＳやアプリケーションなどのソフトウェアへのセキュリティ対策や機能改善用の更新パッチの適用を行うことがある。この場合、仮想マシンやソフトウェアの再起動などに伴って、サービス提供が一時的に停止され得る。このとき、同じ業務サービスを提供する複数の仮想マシンを負荷分散機能により予め冗長化することで、何れかの仮想マシンを一時的に停止しても、他の仮想マシンによるユーザへのサービス提供を継続できる。このような更新方法は、ローリングアップデートと呼ばれることがある。
【０００５】
また、１つの物理マシン上で複数の仮想マシンを実現する際に、管理用の仮想マシン（管理ＯＳやホストＯＳと呼ぶことがある）が他の仮想マシン（ゲストＯＳと呼ぶことがある）によるデバイスアクセスを管理することがある。例えば、管理ＯＳが複数のゲストＯＳに対する負荷分散を行う提案がある。この提案では、管理ＯＳがデータを受信すると、各ゲストＯＳの識別情報を基にデータの分配先のゲストＯＳを決定し、分配先のゲストＯＳのフロントエンドドライバ部に対する管理ＯＳのバックエンドドライバ部からデータを送る。
【０００６】
なお、１つの情報処理装置上の複数のＬＰＡＲ（Logical Partition）により複数のＯＳを実行する場合に、代表ＬＰＡＲが外部ネットワークと他のＬＰＡＲとの通信を中継する提案もある。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２０１０−６６９３１号公報
【特許文献２】特開２００７−１１０２４０号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
負荷分散を行う仮想マシンを予め配備していない場合でも、既存の仮想マシンに対するソフトウェア更新作業などに応じて、負荷分散を行う仮想マシンを新たに配備したいことがある。この場合、仮想マシンとクライアントとの間の通信を維持しながら、負荷分散を行う仮想マシンを動的に配備する方法が問題となる。
【０００９】
例えば、業務サービスを提供する仮想マシンのＩＰ（Internet Protocol）アドレスを、負荷分散を行う仮想マシンに引き継いで当該仮想マシンを配備することが考えられる。この場合、配備前と同じＩＰアドレスを指定したクライアントからのアクセスを、負荷分散を行う仮想マシンにより受け付けて負荷分散を行える。しかし、負荷分散を行う仮想マシンがＩＰアドレスを単に引き継いだだけでは、業務サービスを提供する仮想マシンとクライアントとの通信途中のセッション情報が失われてしまい、負荷分散を開始する前の通信内容を維持することが難しい。
【００１０】
１つの側面では、本発明は、負荷分散を行う仮想マシンを動的に配備できる負荷分散機能配備方法、負荷分散機能配備装置および負荷分散機能配備プログラムを提供することを目的とする。
【課題を解決するための手段】
【００１１】
１つの態様では、負荷分散機能配備方法が提供される。この負荷分散機能配備方法では、コンピュータが、１以上の仮想マシンとの通信機能を有する第１の仮想マシンと第２の仮想マシンとの通信を制御する新規仮想マシンの配備指示を受けると、第１の仮想マシンが有しており第２の仮想マシンとの通信に利用される第１のドライバに対応する第２のドライバと、新規仮想マシンと第１の仮想マシンとの通信に利用される第３のドライバとを新規仮想マシンに作成して仮想ブリッジにより接続し、第１のドライバが使用するバッファ領域を第２のドライバのバッファ領域に変更した後、第１のドライバを無効にし、第２のドライバを有効にする。
【００１２】
また、１つの態様では、負荷分散機能配備装置が提供される。この負荷分散機能配備装置は、記憶部と演算部とを有する。記憶部は、仮想マシンが通信するデータを格納するバッファ領域を含む。演算部は、１以上の仮想マシンとの通信機能を有する第１の仮想マシンと第２の仮想マシンとの通信を制御する新規仮想マシンの配備指示を受けると、第１の仮想マシンが有しており第２の仮想マシンとの通信に利用される第１のドライバに対応する第２のドライバと、新規仮想マシンと第１の仮想マシンとの通信に利用される第３のドライバとを新規仮想マシンに作成して仮想ブリッジにより接続し、第１のドライバが使用するバッファ領域を第２のドライバのバッファ領域に変更した後、第１のドライバを無効にし、第２のドライバを有効にする。
【００１３】
また、１つの態様では、負荷分散機能配備プログラムが提供される。この負荷分散機能配備プログラムでは、コンピュータに、１以上の仮想マシンとの通信機能を有する第１の仮想マシンと第２の仮想マシンとの通信を制御する新規仮想マシンの配備指示を受けると、第１の仮想マシンが有しており第２の仮想マシンとの通信に利用される第１のドライバに対応する第２のドライバと、新規仮想マシンと第１の仮想マシンとの通信に利用される第３のドライバとを新規仮想マシンに作成して仮想ブリッジにより接続し、第１のドライバが使用するバッファ領域を第２のドライバのバッファ領域に変更した後、第１のドライバを無効にし、第２のドライバを有効にする、処理を実行させる。
【発明の効果】
【００１４】
１つの側面では、負荷分散を行う仮想マシンを動的に配備できる。
【図面の簡単な説明】
【００１５】
【図１】第１の実施の形態の負荷分散機能配備装置を示す図である。
【図２】第２の実施の形態の情報処理システムの例を示す図である。
【図３】業務サーバのハードウェア例を示す図である。
【図４】仮想マシンの例を示す図である。
【図５】仮想マシンの通信例を示す図である。
【図６】仮想マシンの接続例を示す図である。
【図７】ローリングアップデートの例を示す図である。
【図８】ＳＬＢ配備の比較例を示す図である。
【図９】ＳＬＢ配備後の仮想マシンの接続の比較例を示す図である。
【図１０】ＳＬＢ配備後の仮想マシンの接続例を示す図である。
【図１１】業務サーバの機能例を示す図である。
【図１２】ＶＭ管理テーブルの例を示す図である。
【図１３】ネットワーク管理テーブルの例を示す図である。
【図１４】デバイスマイグレーションの例を示すフローチャートである。
【図１５】ＳＬＢ配備の例を示すフローチャートである。
【図１６】ＳＬＢ配備部のテーブル更新例を示す図である。
【図１７】ＳＬＢ配備部のテーブル更新例（続き）を示す図である。
【図１８】バッファ切換の例を示すフローチャートである。
【図１９】バッファ切換部のテーブル更新例を示す図である。
【図２０】マイグレーション後の負荷分散の例を示す図である。
【図２１】ＳＬＢ配備例（その１）を示す図である。
【図２２】ＳＬＢ配備例（その２）を示す図である。
【図２３】ＳＬＢ撤収の例を示すフローチャートである。
【図２４】ＳＬＢ撤収の例を示す図である。
【図２５】仮想マシンの更新方法の例（その１）を示す図である。
【図２６】仮想マシンの更新方法の例（その２）を示す図である。
【発明を実施するための形態】
【００１６】
以下、本実施の形態を図面を参照して説明する。
［第１の実施の形態］
図１は、第１の実施の形態の負荷分散機能配備装置を示す図である。負荷分散機能配備装置１０は、複数の仮想マシンを実行可能である。負荷分散機能配備装置１０は、ネットワーク２０に接続されている。ネットワーク２０には、クライアントコンピュータ（単にクライアントと呼ぶことがある）が接続される（図示を省略している）。クライアントは、負荷分散機能配備装置１０上の仮想マシンが提供するサービスを利用する。
【００１７】
負荷分散機能配備装置１０は、ハードウェア１１、ハイパーバイザ１２および仮想マシン１３，１３ａを含む。ハードウェア１１は、負荷分散機能配備装置１０の物理的なリソースの集合である。ハードウェア１１は、記憶部１１ａおよび演算部１１ｂを含む。
【００１８】
記憶部１１ａは、ＲＡＭなどの揮発性記憶装置でもよい。演算部１１ｂは、ＣＰＵ、ＤＳＰ（Digital Signal Processor）、ＡＳＩＣ（Application Specific Integrated Circuit）、ＦＰＧＡ（Field Programmable Gate Array）などを含み得る。演算部１１ｂはプログラムを実行するプロセッサであってもよい。ここでいう「プロセッサ」には、複数のプロセッサの集合（マルチプロセッサ）も含まれ得る。ハードウェア１１は、記憶部１１ａおよび演算部１１ｂ以外にも、ＨＤＤ（Hard Disk Drive）などの不揮発性記憶装置やネットワーク２０に接続されるＮＩＣ（Network Interface Card）（物理ＮＩＣ）などを含み得る。
【００１９】
ハイパーバイザ１２は、ハードウェア１１のリソースを用いて仮想マシン１３，１３ａを動作させるソフトウェアである。仮想マシン１３，１３ａは、それぞれ独立にＯＳを実行する仮想的なコンピュータである。仮想マシン１３は、ホストＯＳを実行する。ホストＯＳは、ハードウェア１１のリソースの管理や仮想マシン１３ａなどの他の仮想マシンで動作するＯＳ（ゲストＯＳと呼ばれることがある）の起動／停止などの管理を担う。仮想マシン１３は、ハードウェア１１を制御するデバイスドライバを有する。仮想マシン１３ａ上のゲストＯＳによるハードウェア１１へのアクセスはホストＯＳを介して行われる。すなわち、ホストＯＳは、ゲストＯＳによるハードウェア１１へのアクセスを管理する。ホストＯＳを管理ＯＳと呼ぶこともある。仮想マシン１３自体をホストＯＳと呼ぶこともある。
【００２０】
仮想マシン１３は、１以上の仮想マシンとの通信機能を有する。仮想マシン１３は、ドライバＤ１１，Ｄ１２および仮想ブリッジＢ１を有する。ドライバＤ１１は、仮想マシン１３ａ上のドライバと連携して仮想マシン１３ａの仮想的なＮＩＣ（仮想ＮＩＣ）を実現するドライバである。ドライバＤ１１はバックエンドドライバと呼ばれることがある。ドライバＤ１２は、物理ＮＩＣを制御するデバイスドライバである。仮想ブリッジＢ１はドライバＤ１１，Ｄ１２を接続する。
【００２１】
仮想マシン１３ａは、ドライバＤ２１を有する。ドライバＤ２１は、ドライバＤ１１と連携して仮想マシン１３，１３ａのデータ転送を実現する。ドライバＤ２１はフロントエンドドライバと呼ばれることがある。ドライバＤ１１，Ｄ２１は、バッファ領域Ａ１を共有する。バッファ領域Ａ１は、ハイパーバイザ１２によって管理される記憶領域である。バッファ領域Ａ１は、記憶部１１ａ上に確保された記憶領域でもよい。上記のように、物理ＮＩＣと仮想ＮＩＣとを仮想ブリッジＢ１を介して接続する接続形態では、ネットワーク２０上の他の物理マシンまたは他の仮想マシンと同じＬ２（Layer 2）ネットワーク上に仮想マシン１３ａが存在するよう動作させることができる。
【００２２】
負荷分散機能配備装置１０は、仮想マシン１３ａにより実行されるサービスをネットワーク２０に接続されたクライアントに提供する。負荷分散機能配備装置１０では、ゲストＯＳを実行する複数の仮想マシン（仮想マシン１３ａを含む）に対して負荷分散を実行する仮想マシン１３ｂ（新規仮想マシン）を追加で配備することがある。例えば、仮想マシン１３ａにおけるゲストＯＳやサービスを提供するアプリケーションを更新する場合である。仮想マシン１３ａと同じサービスを提供する仮想マシンを、仮想マシン１３，１３ａ，１３ｂ以外に更にもう１つ配備して、サービス提供を冗長化することで、更新作業に伴うサービス提供の停止時間を減らせるからである。負荷分散機能配備装置１０は、仮想マシン１３ｂを次のように配備する。以下に示す演算部１１ｂの処理は、ハイパーバイザ１２の１つの機能として実装されてもよい。
【００２３】
演算部１１ｂは、仮想マシン１３と仮想マシン１３ａとの通信を制御する新規仮想マシンの配備指示を受け付ける。新規仮想マシンは、仮想マシン１３ａを含む複数の仮想マシンに対する負荷分散機能を担う。
【００２４】
すると、演算部１１ｂは、仮想マシン１３が有しており仮想マシン１３ａとの通信に利用されるドライバＤ１１（第１のドライバ）に対応するドライバＤ３１（第２のドライバ）を、仮想マシン１３ｂに作成する。ドライバＤ３１は、ドライバＤ２１と接続するためのバックエンドドライバである。また、演算部１１ｂは、仮想マシン１３ｂと仮想マシン１３との通信に利用されるドライバＤ３２（第３のドライバ）を、仮想マシン１３ｂに作成する。ドライバＤ３２は、フロントエンドドライバである。演算部１１ｂは、ドライバＤ３１，Ｄ３２を仮想ブリッジＢ２により接続する。なお、ドライバを「作成する」とは、例えば該当の仮想マシンの所定のコンフィグ情報にドライバの情報を追加して、当該コンフィグ情報に基づき仮想マシンで所定の制御サービスを実行させ、仮想マシン上で当該ドライバを動作させることを示す。
【００２５】
演算部１１ｂは、ドライバＤ１１が使用するバッファ領域Ａ１を、ドライバＤ３１のバッファ領域に変更する。具体的には、演算部１１ｂは、ドライバＤ３１のバッファ領域へのアクセス先アドレスを、バッファ領域Ａ１のアドレスに設定する。すなわち、ドライバＤ３１は、引き続きバッファ領域Ａ１を利用する。このとき、例えば演算部１１ｂは、ドライバＤ１１によるアクセス先を、アクセス禁止領域を示すアドレスに変更し、ドライバＤ１１によるデータ書き込みをトラップすることで、ドライバＤ１１による書き込みデータもバッファ領域Ａ１に書き込む。これにより、ドライバＤ１１による通信途中のデータをバッファ領域Ａ１に継続して書き込める。
【００２６】
その後、演算部１１ｂは、ドライバＤ１１を無効にし、ドライバＤ３１を有効にする。ドライバＤ１１を「無効にする」とは、例えば仮想マシン１３の所定のコンフィグ情報からドライバＤ１１の情報を削除して、仮想マシン１３の制御サービスを動作させることを示す。ドライバＤ３１を「有効にする」とは、ドライバＤ３１を用いた通信を可能にすることを示す。具体的には、演算部１１ｂは、ドライバＤ１１を無効にし、ドライバＤ３２に対するバックエンドドライバであるドライバＤ１３を仮想マシン１３に新たに動作させることで、ドライバＤ１３，Ｄ３２，Ｄ３１を用いた通信を開始させる。その結果、ドライバＤ３１を用いたネットワーク２０と仮想マシン１３ａとの通信が可能になる。
【００２７】
この処理は、仮想マシン１３（ホストＯＳ）で動作していたドライバＤ１１（バックエンドドライバ）を、負荷分散を実行する仮想マシン１３ｂに移行させたことに相当する。すなわち、仮想マシン１３ａのフロントエンドドライバ（ドライバＤ２１）に対応するバックエンドドライバ（ドライバＤ３１）を仮想マシン１３ｂで動作させる。
【００２８】
ドライバＤ３１，Ｄ３２は仮想ブリッジＢ２で接続されるので、ドライバＤ２１に対応するＩＰアドレスとして、仮想マシン１３ｂの配備前と同じＩＰアドレスを利用できる。仮想マシン１３ｂの配下の仮想マシン（仮想マシン１３ａを含むゲストＯＳを実行する仮想マシン）に対する負荷分散機能を、仮想マシン１３ｂにより実行させることができる。例えば、仮想マシン１３ａとサービス提供を冗長化するもう１つの仮想マシンを、ハイパーバイザ１２上で動作させる。この場合、仮想マシン１３ｂは、仮想ブリッジＢ２での中継を行う際に、所定の識別情報に基づいて、仮想マシン１３ａを含む複数の仮想マシンそれぞれを識別し、負荷分散を行える。
【００２９】
複数の仮想マシンそれぞれを識別する情報として、各仮想マシンが保持するＭＡＣ（Media Access Control）アドレスを利用してもよい。すなわち、仮想マシン１３ｂは、パケットの振り分け先とする複数の仮想マシンを各仮想マシンのＭＡＣアドレスによって管理する。例えば、仮想マシン１３ｂは、仮想マシン１３ｂの配備前に通信していたクライアントのＩＰアドレスを送信元とするパケットについては、仮想マシン１３ｂの配備後も、仮想マシン１３ａに振り分ける。仮想マシン１３ｂは、仮想マシン１３ｂの配備後に当該クライアントのＩＰアドレスを、仮想マシン１３ａから取得してもよい。バッファ領域Ａ１には仮想マシン１３ａと当該クライアントとの間の通信のデータが格納されており、また、仮想マシン１３ａのＩＰアドレスも変更せずに済むので、仮想マシン１３ａでは仮想マシン１３ｂの配備前のセッション情報を継続して利用できる。よって、仮想マシン１３ｂの配備後も、仮想マシン１３ａとクライアントとの既存の通信内容を維持できる。
【００３０】
ここで、負荷分散を実行する仮想マシンを新たに配備する方法として、仮想マシン１３ａのＩＰアドレス（ＩＰアドレスａとする）を、負荷分散を実行する仮想マシンにより引き継ぐことが考えられる。そして、仮想マシン１３ａに新たなＩＰアドレス（ＩＰアドレスｂとする）を付与する。また、仮想マシン１３ａと同じサービスを提供する仮想マシン（新たに配備する）にもＩＰアドレス（ＩＰアドレスｃとする）を付与する。
【００３１】
この場合、負荷分散を実行する仮想マシンは、仮想マシン１３（ホストＯＳ）におけるバックエンドドライバおよび仮想ブリッジを介して、配下の仮想マシン（仮想マシン１３ａを含む）と接続される。これにより、ＩＰアドレスａを指定したクライアントからのパケットを、負荷分散用の仮想マシンにより受信し、当該パケットの送信先をＩＰアドレスｂ，ｃに振り分けることができる。
【００３２】
ところが、負荷分散を行う仮想マシンにより仮想マシン１３ａのＩＰアドレスを引き継ぐ方法では、クライアント側でＩＰアドレスａの利用を継続してサービスへアクセスできるものの、負荷分散機能の配備前に存在しているセッション情報を維持できない。クライアント側でのＩＰアドレスａを指定したアクセス先が、負荷分散を行う仮想マシンに変更され、仮想マシン１３ａのＩＰアドレスがＩＰアドレスｂに変更されるからである。また、仮想マシン１３ａでは、ＩＰアドレスの変更に伴い、変更後の設定をロードするためにネットワークサービスの再起動が生じ得る（それ以前にネットワークサービスで保持している情報はリセットされる）。この場合、仮想マシン１３ａとクライアントとは、通信セッションを再度構築しなおすことになる。このため、ユーザが行っていた業務内容が破棄されてしまい、ユーザに作業のやり直しを強いるおそれがある。また、ネットワーク２０に含まれるスイッチにおいて、ＭＡＣアドレス学習テーブルなどの再学習が発生し、クライアントと仮想マシン１３ａとの間で通信できない期間が発生するおそれもある。したがって、負荷分散を行う仮想マシンにより仮想マシン１３ａのＩＰアドレスを引き継ぐ方法では、動的配備の方法としては不十分である。
【００３３】
一方、負荷分散機能配備装置１０によれば、仮想マシン１３ｂを配備した後でも、仮想マシン１３ａはＩＰアドレスａを継続して利用する。仮想マシン１３ｂは、仮想マシン１３ｂの配備前から仮想マシン１３ａと通信していたクライアントのＩＰアドレスを送信元とするパケットを仮想マシン１３ａに振り分ける。
【００３４】
特に、ドライバＤ３１が継続してバッファ領域Ａ１にアクセスする。また、ドライバＤ１１を無効にするまでは、ドライバＤ１１のデータ書き込みをドライバＤ３１が利用するバッファ領域Ａ１に対して行うようにする。このため、通信途中のパケットの喪失を抑えられる。よって、仮想マシン１３ｂの配備後も、仮想マシン１３ａとクライアントとの既存の通信内容を適切に維持でき、ユーザに提供するサービスへの影響を抑えられる。更に、仮想マシン１３ａではアドレス変更をしないので、ネットワーク２０に含まれるスイッチに、仮想マシン１３ａについてＭＡＣアドレス学習テーブルなどの再学習を行わせずに済む。
【００３５】
また、例えば、ローリングアップデートを実行するために、負荷分散機能を担う仮想マシンを事前に配備しておくことも考えられる。ローリングアップデートは、仮想マシンを冗長化させ、一方の仮想マシンのサービス提供を他方の仮想マシンにより代替させることで、ソフトウェア更新時にサービス提供を中断しないようにする方法である。しかし、負荷分散機能配備装置１０のように、例えばあるユーザへのあるサービスの提供が１つの仮想マシン１３ａを用いて行われる場合、負荷分散機能は不要であり、負荷分散機能を事前に配備しておくのは無駄である。
【００３６】
これに対し、負荷分散機能配備装置１０によれば、負荷分散を行う仮想マシン１３ｂを動的に配備できる。このため、負荷分散機能を利用しないときにまで負荷分散用の仮想マシン１３ｂを配備しておかずに済み、リソースが無駄に利用されることを防げる。
【００３７】
ところで、近年では、ネットワーク経由で、コンピュータのリソースをユーザに貸し出すＩａａＳなどのサービスが利用されている。例えば、ＩａａＳでは、ＯＳやアプリケーションなどのソフトウェアを含む仮想マシンおよび仮想マシンを実行するためのリソースをユーザに提供する。ＩａａＳ事業者には、ユーザによるサービス利用に影響しないようシステムを運用することが求められる。ユーザによるサービス利用に影響する可能性のある作業として、ＯＳのセキュリティパッチやアプリケーションの更新パッチなどの適用が挙げられる。プログラムの再ロードに伴い、ＯＳやアプリケーションの再起動が発生し得るからである。
【００３８】
負荷分散機能配備装置１０によれば、クライアントと仮想マシン１３ａとの通信を維持しながら、仮想マシン１３ｂを動的に配備し、ローリングアップデートを実行可能となる。このため、負荷分散機能配備装置１０は、ＩａａＳ事業者などによる仮想マシンのソフトウェア更新の際にも有用である。
【００３９】
［第２の実施の形態］
図２は、第２の実施の形態の情報処理システムの例を示す図である。第２の実施の形態の情報処理システムは、業務サーバ１００、管理サーバ２００およびクライアント３００を有する。業務サーバ１００および管理サーバ２００は、ネットワーク３０に接続されている。ネットワーク３０は、データセンタ内に敷設されたＬＡＮ（Local Area Network）である。データセンタは、ＩａａＳ事業者によって運用される。クライアント３００は、ネットワーク４０に接続されている。ネットワーク４０は、例えばインターネットやＷＡＮ（Wide Area Network）などである。
【００４０】
業務サーバ１００は、ＩａａＳにおいてユーザに提供するハードウェア資源やソフトウェア資源を備えたサーバコンピュータである。業務サーバ１００は、複数の仮想マシンを実行可能である。仮想マシンは、ユーザの業務を支援する各種のサービスを提供する。ユーザは、クライアント３００を操作して、業務サーバ１００が提供するサービスを利用できる。業務サーバ１００は、第１の実施の形態の負荷分散機能配備装置１０の一例である。
【００４１】
管理サーバ２００は、業務サーバ１００の運用管理を行うサーバコンピュータである。例えば、システムの管理者は、管理サーバ２００を操作して、業務サーバ１００の起動／停止、新たな仮想マシンの起動（配備）／停止などを業務サーバ１００に指示する。
【００４２】
クライアント３００は、ユーザが利用するクライアントコンピュータである。例えば、クライアント３００は、Ｗｅｂブラウザとして機能する。業務サーバ１００は、例えばＷｅｂサーバとして機能し、ユーザの業務を支援するＷｅｂアプリケーションのＧＵＩ（Graphical User Interface）をクライアント３００のＷｅｂブラウザに提供し得る。ユーザは、クライアント３００のＷｅｂブラウザ上のＧＵＩを操作することで、業務サーバ１００が提供するＷｅｂアプリケーションの機能を利用できる。
【００４３】
図３は、業務サーバのハードウェア例を示す図である。業務サーバ１００は、プロセッサ１０１、ＲＡＭ１０２、ＨＤＤ１０３、画像信号処理部１０４、入力信号処理部１０５、媒体リーダ１０６および通信インタフェース１０７を有する。各ユニットは業務サーバ１００のバスに接続されている。管理サーバ２００やクライアント３００も業務サーバ１００と同様のユニットを用いて実現できる。
【００４４】
プロセッサ１０１は、業務サーバ１００の情報処理を制御する。プロセッサ１０１は、マルチプロセッサであってもよい。プロセッサ１０１は、例えばＣＰＵ、ＤＳＰ、ＡＳＩＣまたはＦＰＧＡなどである。プロセッサ１０１は、ＣＰＵ、ＤＳＰ、ＡＳＩＣ、ＦＰＧＡなどのうちの２以上の要素の組み合わせであってもよい。
【００４５】
ＲＡＭ１０２は、業務サーバ１００の主記憶装置である。ＲＡＭ１０２は、プロセッサ１０１に実行させるＯＳのプログラムやアプリケーションプログラムの少なくとも一部を一時的に記憶する。また、ＲＡＭ１０２は、プロセッサ１０１による処理に用いる各種データを記憶する。
【００４６】
ＨＤＤ１０３は、業務サーバ１００の補助記憶装置である。ＨＤＤ１０３は、内蔵した磁気ディスクに対して、磁気的にデータの書き込みおよび読み出しを行う。ＨＤＤ１０３は、ＯＳのプログラム、アプリケーションプログラム、および各種データを記憶する。業務サーバ１００は、フラッシュメモリやＳＳＤ（Solid State Drive）などの他の種類の補助記憶装置を備えてもよく、複数の補助記憶装置を備えてもよい。
【００４７】
画像信号処理部１０４は、プロセッサ１０１からの命令に従って、業務サーバ１００に接続されたディスプレイ２１に画像を出力する。ディスプレイ２１としては、ＣＲＴ（Cathode Ray Tube）ディスプレイや液晶ディスプレイなどを用いることができる。
【００４８】
入力信号処理部１０５は、業務サーバ１００に接続された入力デバイス２２から入力信号を取得し、プロセッサ１０１に出力する。入力デバイス２２としては、例えば、マウスやタッチパネルなどのポインティングデバイス、キーボードなどを用いることができる。
【００４９】
媒体リーダ１０６は、記録媒体２３に記録されたプログラムやデータを読み取る装置である。記録媒体２３として、例えば、フレキシブルディスク（ＦＤ：Flexible Disk）やＨＤＤなどの磁気ディスク、ＣＤ（Compact Disc）やＤＶＤ（Digital Versatile Disc）などの光ディスク、光磁気ディスク（ＭＯ：Magneto-Optical disk）を使用できる。また、記録媒体２３として、例えば、フラッシュメモリカードなどの不揮発性の半導体メモリを使用することもできる。媒体リーダ１０６は、例えば、プロセッサ１０１からの命令に従って、記録媒体２３から読み取ったプログラムやデータをＲＡＭ１０２またはＨＤＤ１０３に格納する。
【００５０】
通信インタフェース１０７は、ネットワーク３０を介して他の装置と通信を行う。通信インタフェース１０７は、有線通信インタフェースでもよいし、無線通信インタフェースでもよい。
【００５１】
図４は、仮想マシンの例を示す図である。業務サーバ１００は、ハードウェア１１０、ハイパーバイザ１２０および仮想マシン１３０，１４０を含む。ハードウェア１１０は、プロセッサ１０１、ＲＡＭ１０２、ＨＤＤ１０３、画像信号処理部１０４、入力信号処理部１０５、媒体リーダ１０６および通信インタフェース１０７を含む物理的なリソースの集合である。
【００５２】
ハイパーバイザ１２０は、ハードウェア１１０のリソースを用いて、仮想マシンを動作させる制御ソフトウェアである。ハイパーバイザ１２０は、仮想マシンモニタ（ＶＭＭ：Virtual Machine Monitor）と呼ばれることもある。ハイパーバイザ１２０は、プロセッサ１０１の処理能力やＲＡＭ１０２の記憶領域を、演算のリソースとして、仮想マシン１３０，１４０に割り当てる。ハイパーバイザ１２０は、仮想マシン１３０，１４０によるハードウェア１１０へのアクセスを調停する。
【００５３】
ハイパーバイザ１２０は、仮想マシン１３０，１４０に割り当てられるリソースとは別個に確保されたプロセッサ１０１およびＲＡＭ１０２のリソースを用いて実行される。あるいは、業務サーバ１００は、ハイパーバイザ１２０を動作させるために、プロセッサ１０１およびＲＡＭ１０２以外のプロセッサおよびＲＡＭを有してもよい。
【００５４】
ハイパーバイザ１２０が仮想マシン１３０，１４０に割り当てるプロセッサ１０１の処理能力の単位を仮想プロセッサ（あるいは、仮想ＣＰＵ）と呼ぶことがある。例えば、プロセッサ１０１がマルチコアである場合、１コアを１つの仮想プロセッサとして割り当ててもよい。また、例えばプロセッサ１０１の利用可能時間の１周期を時分割した場合の１つのタイムスライスを１つの仮想プロセッサとして割り当ててもよい。また、ハイパーバイザ１２０が仮想マシン１３０，１４０に割り当てるＲＡＭ１０２の記憶領域を単にメモリと称する。メモリの割当量は、ＧＢ（Giga Bytes）など記憶領域のサイズで表せる。
【００５５】
仮想マシン１３０，１４０は、業務サーバ１００上で動作する仮想マシンである。仮想マシン１３０は、ホストＯＳを実行する仮想マシンである。ホストＯＳは、ゲストＯＳを実行する他の仮想マシン（例えば、仮想マシン１４０）に対するハードウェア１１０のリソースの割り当てや他の仮想マシンによるデバイスアクセスを管理する。仮想マシン１３０は、第１の実施の形態の仮想マシン１３の一例である。
【００５６】
仮想マシン１４０は、ゲストＯＳを実行する仮想マシンである。仮想マシン１４０は、ゲストＯＳ上でユーザの業務を支援するアプリケーションを更に実行し、ユーザに対して業務サービスを提供する。なお、仮想マシンをＶＭ（Virtual Machine）と略記することがある。仮想マシン１４０は、第１の実施の形態の仮想マシン１３ａの一例である。
【００５７】
業務サーバ１００では、複数のゲストＯＳがそれぞれ物理的なＩ／Ｏデバイスを有しているのではなく、各ゲストＯＳの入出力をホストＯＳに依頼し、ホストＯＳが代行することで各ゲストＯＳの入出力制御を仮想化する。例えば、ホストＯＳからゲストＯＳへデータを転送する際、ホストＯＳのバックエンドドライバが、ハイパーバイザ１２０にデータを渡す。そして、ハイパーバイザ１２０がゲストＯＳのフロントエンドドライバが用いる所定のメモリ領域にデータを書き込むことで、仮想的にデータ転送を実現する。このような仮想マシンの実行環境として、例えばＸｅｎ（登録商標）が挙げられる。仮想マシン１３０は、ドメイン０と呼ばれることもある。仮想マシン１４０は、ドメインＵと呼ばれることもある。
【００５８】
図５は、仮想マシンの通信例を示す図である。仮想マシン１３０は、通信インタフェース１０７（物理ＮＩＣ）を直接制御する。仮想マシン１３０は、ゲストＯＳを実行する他の仮想マシンによる、通信インタフェース１０７を用いた通信を制御する。例えば、仮想マシン１４０が仮想マシン１３０を介して通信を行う場合を考える。仮想マシン１４０は、準仮想化（ＰＶ：Para-Virtualization）ドライバを用いる。ＰＶドライバとは、仮想マシン１４０の処理を高速化するために、仮想マシン１４０のカーネル内で動作するドライバであり、ハイパーバイザ１２０の機能を直接呼び出す機能をもつ。例えば、仮想マシン１４０は、ＰＶドライバを利用して、ＨＤＤ１０３や通信インタフェース１０７へのアクセスを行う。
【００５９】
ＰＶドライバでは、デバイスチャネル（イベントチャネルと呼ぶこともある）およびバッファを介してＨＤＤ１０３へのディスクＩ／Ｏ（Input / Output）やネットワークＩ／Ｏを仮想マシン１３０に転送する。
【００６０】
より具体的には、ホストＯＳを実行する仮想マシン１３０のバックエンドドライバＤ１と、ゲストＯＳを実行する仮想マシン１４０のフロントエンドドライバＤ２とが協調して動作する。バックエンドドライバＤ１とフロントエンドドライバＤ２とは１対１に対応する。
【００６１】
バッファ１２１は、ハイパーバイザ１２０により管理されるバッファ領域である（バッファ領域を単にバッファと称する）。バッファ１２１は、バックエンドドライバＤ１およびフロントエンドドライバＤ２により共有されるリングバッファである。バッファ１２１は、例えばＲＡＭ１０２上の記憶領域として確保される。バックエンドドライバＤ１およびフロントエンドドライバＤ２は、バッファ１２１を介してデータを転送する。より具体的には、バックエンドドライバＤ１およびフロントエンドドライバＤ２の何れか一方のドライバが共有メモリのアドレスの値などを書き込んで、ハイパーバイザコールを発行すると、他方のドライバは、書き込まれた値を読み出せる。
【００６２】
図６は、仮想マシンの接続例を示す図である。図６では、ハイパーバイザ１２０上で仮想マシン１３０，１４０が動作する場合を例示している。図５で例示したように、仮想マシン１３０，１４０は、バッファ１２１を介してデータの転送を行う。
【００６３】
仮想マシン１３０は、デバイスドライバ１３１、バックエンドドライバ１３２およびブリッジ１３５を有する。デバイスドライバ１３１は、通信インタフェース１０７を制御するソフトウェアである。通信インタフェース１０７は、仮想マシン１３０において“ｅｔｈ０”という識別情報に対応付けられている。
【００６４】
バックエンドドライバ１３２は、仮想マシン１４０との通信に用いられるソフトウェアである。バックエンドドライバ１３２は、“ｖｉｆ１．０”という識別情報に対応付けられている。
【００６５】
ブリッジ１３５は、デバイスドライバ１３１およびバックエンドドライバ１３２を接続する仮想的なブリッジ（仮想ブリッジ）である。ブリッジ１３５は、“ｂｒ０”という識別情報に対応付けられている。
【００６６】
仮想マシン１４０は、フロントエンドドライバ１４１を有する。フロントエンドドライバ１４１は、仮想マシン１４０の仮想的な通信インタフェースとして機能するソフトウェアである。フロントエンドドライバ１４１は、仮想マシン１４０において“ｅｔｈ０”という識別情報に対応付けられている。フロントエンドドライバ１４１のＩＰアドレスは、“ＩＰ−Ａ”である。
【００６７】
バックエンドドライバ１３２およびフロントエンドドライバ１４１は、図５で例示したようにバッファ１２１を共有している。バックエンドドライバ１３２およびフロントエンドドライバ１４１は、バッファ１２１を介してデータの転送を行う。バックエンドドライバ１３２およびフロントエンドドライバ１４１は、互いに通信するためのチャネルを有しているので、両者は「接続されている」といえる。ここで、バックエンドドライバとフロントエンドドライバとの接続関係を「ネット」と称することがある。ハイパーバイザ１２０は、“ｖｉｆ１．０”に対応するバックエンドドライバ１３２とフロントエンドドライバ１４１との接続を“Ｎｅｔ１”という識別情報（Ｎｅｔ  ＩＤと称することがある）に対応付けて管理する。この場合、バックエンドドライバ１３２およびフロントエンドドライバ１４１は、“Ｎｅｔ１”で識別されるネットに属するともいえる。
【００６８】
ところで、ＩａａＳ事業者は、ＯＳやアプリケーションなどのソフトウェアを常に最新版にしてユーザに提供することが求められる。特に、セキュリティホールやバグなどの対策がなされた更新プログラムがソフトウェアのベンダにより配布されたのであれば、当該更新プログラムにより迅速にソフトウェアを更新することが好ましい。このため、業務サーバ１００では、仮想マシン１４０で実行されるソフトウェアの更新作業が発生する。その際、仮想マシン１４０によりユーザに提供されるサービスをできる限り停止しないよう運用することが求められる。そのための手法として、例えばローリングアップデートが考えられる。
【００６９】
図７は、ローリングアップデートの例を示す図である。例えば、負荷分散を行う仮想マシンＭ１を業務サーバ１００上に予め配備しておき、ソフトウェアの更新作業時にローリングアップデートを行うことが考えられる。仮想マシンＭ１は、ハイパーバイザ１２０上で動作する仮想マシンである。仮想マシンＭ１は、ＳＬＢ（Server Load Balancer）５０を有する。ＳＬＢ５０は、負荷分散機能を実現するソフトウェアである。
【００７０】
仮想マシン１４０は、サービス１４０ａを有する。サービス１４０ａは、クライアント３００に所定のサービスを提供するソフトウェアである。仮想マシン１５０は、ハイパーバイザ１２０上で動作する仮想マシンである。仮想マシン１５０は、サービス１５０ａを有する。サービス１５０ａは、サービス１４０ａと同等の機能を提供するソフトウェアである。図７の例において、仮想マシンＭ１のＩＰアドレスは、“ＩＰ−Ａ”である。仮想マシン１４０のＩＰアドレスは、“ＩＰ−Ａｘ”である。仮想マシン１５０のＩＰアドレスは、“ＩＰ−Ａｙ”である。
【００７１】
クライアント３００は、仮想マシン１４０のサービスを利用する場合、宛先ＩＰアドレス“ＩＰ−Ａ”を指定したリクエストを送信する。ＳＬＢ５０は、当該リクエストを受信すると、仮想マシン１４０，１５０の負荷に応じて、あるいは、ラウンドロビンなどの所定の方法により、仮想マシン１４０，１５０のうちリクエストの振り分け先を決定する。例えば、ＳＬＢ５０は、仮想マシン１４０を振り分け先とする場合、宛先ＩＰアドレスを“ＩＰ−Ａｘ”に変えて仮想マシン１４０に転送する。ＳＬＢ５０は、送信元ＩＰアドレスが“ＩＰ−Ａｘ”であるレスポンスを仮想マシン１４０から受信すると、送信元ＩＰアドレスを“ＩＰ−Ａ”に変えて仮想マシン１４０に転送する。
【００７２】
サービスを提供する仮想マシンが、仮想マシン１４０，１５０のように冗長化されている場合、何れかの仮想マシンのソフトウェアの更新作業を行う際にローリングアップデートを用いることができる。具体的には、何れか一方ずつ順番に更新作業を行うことで、ユーザへのサービス提供を停止させずに、ソフトウェアを更新できる。
【００７３】
一方、図４で例示したように、仮想マシンＭ１，１５０が存在していない場合、仮想マシンＭ１，１５０を新たに配備して、ローリングアップデートを行うことが考えられる。
図８は、ＳＬＢ配備の比較例を示す図である。仮想マシンＭ１の配備前の段階において、仮想マシン１４０のＩＰアドレスは“ＩＰ−Ａ”である。仮想マシンＭ１，１５０を新たに配備するとき、ハイパーバイザ１２０は、仮想マシンＭ１，１５０に新たにＩＰアドレスを設定する。
【００７４】
このとき、クライアント３００がサービス１４０ａへのアクセスに用いているＩＰアドレスを仮想マシンＭ１に設定することで、仮想マシンＭ１を介した負荷分散構成へ移行させる。当該ＩＰアドレスを利用できなくなると、クライアント３００からのリクエストがサービス１４０ａ，１５０ａへ到達できなくなるからである。また、ハイパーバイザ１２０は、仮想マシン１４０のＩＰアドレスを“ＩＰ−Ａｘ”に設定する。ハイパーバイザ１２０は、仮想マシン１５０のＩＰアドレスを“ＩＰ−Ａｙ”に設定する。
【００７５】
すると、図７と同等の負荷分散構成となり、ローリングアップデートを実行できる。なお、この場合、サービスを提供する仮想マシンは１つでよいので、仮想マシン１５０に更新済みのソフトウェアがインストールされた状態で仮想マシン１５０を起動し、その後、仮想マシン１４０を撤収する方法でもよい。
【００７６】
図９は、ＳＬＢ配備後の仮想マシンの接続の比較例を示す図である。図９では、図８のように仮想マシンＭ１を配備したときの仮想マシン１３０，１４０，Ｍ１の接続例を示している。なお、仮想マシン１５０については図示を省略している。
【００７７】
仮想マシン１３０は、デバイスドライバ１３１、バックエンドドライバ１３２，１３２ａ，１３２ｂおよびブリッジ１３５，１３６を有する。バックエンドドライバ１３２ａ，１３２ｂは、仮想マシンＭ１との通信に用いられるソフトウェアである。バックエンドドライバ１３２ａは、“ｖｉｆ２．０”という識別情報に対応付けられている。バックエンドドライバ１３２ｂは、“ｖｉｆ３．０”という識別情報に対応付けられている。
【００７８】
この場合、ブリッジ１３５は、デバイスドライバ１３１およびバックエンドドライバ１３２ａを接続する。ブリッジ１３６は、バックエンドドライバ１３２，１３２ｂを接続する。ブリッジ１３６は、“ｂｒ１”という識別情報に対応付けられている。
【００７９】
仮想マシンＭ１は、フロントエンドドライバＭ１ａ，Ｍ１ｂを有する。フロントエンドドライバＭ１ａ，Ｍ１ｂは、仮想マシンＭ１の仮想的なインタフェースとして機能するソフトウェアである。フロントエンドドライバＭ１ａのＩＰアドレスは“ＩＰ−Ａ”である（図８のＩＰアドレス“ＩＰ−Ａ”に相当）。フロントエンドドライバＭ１ａは、バックエンドドライバ１３２ａと接続される。フロントエンドドライバＭ１ｂは、バックエンドドライバ１３２ｂと接続される。ＩＰアドレス“ＩＰ−Ａ”は仮想マシンＭ１で使用するので、仮想マシン１４０のフロントエンドドライバ１４１のＩＰアドレスは“ＩＰ−Ａｘ”に変更される（図８のＩＰアドレス“ＩＰ−Ａｘ”に相当）。
【００８０】
なお、図９の例において、仮想マシン１５０も仮想マシン１４０と同様に、仮想マシンＭ１を介して仮想マシン１３０と接続されることになる。すなわち、仮想マシン１３０において、仮想マシンＭ１，１５０それぞれと接続するバックエンドドライバを計２つ追加し、これらを接続するブリッジを１つ追加する。仮想マシン１３０のバックエンドドライバと接続するフロントエンドドライバを仮想マシンＭ１にもう１つ追加する。
【００８１】
図８のように、仮想マシンＭ１により仮想マシン１４０のＩＰアドレスを単に引き継いで配備するとき、各仮想マシンはこのような接続となる。しかし、図８，９のようにして新たに仮想マシンＭ１，１５０を配備し、仮想マシン１４０のＩＰアドレスの設定変更を行うと、負荷分散構成へ切り替える前におけるクライアント３００と仮想マシン１４０との通信途中のセッション情報を利用できなくなる。このため、負荷分散構成への切り替えに伴って、クライアント３００と仮想マシン１４０とは新たにセッションを確立しなおすことになる。この場合、ユーザに対して、それまで行っていた作業のやり直しを強いるおそれがあり、ＩａａＳにおけるサービス品質の観点からは好ましくない。
【００８２】
更に、仮想マシン１４０でアドレス変更を行うと、ネットワーク３０，４０に含まれるスイッチにおいて、ＭＡＣアドレス学習テーブルなどの再学習が発生し得る。すると、クライアント３００と仮想マシン１４０との間で比較的長く（クライアント３００と仮想マシン１４０との間に確立されたセッションがタイムアウトになるほど長く）通信できない期間が発生するおそれもある。
【００８３】
なお、仮想マシンＭ１を配備する代わりに、ネットワーク３０またはネットワーク４０に接続されたＤＮＳ（Domain Name System）サーバ（図２では図示を省略している）によりＤＮＳラウンドロビンを実行することで、負荷分散を行うことも考えられる。しかし、ＤＮＳラウンドロビンでは、クライアント３００がＩＰアドレスを直接指定してアクセスする場合に負荷分散を行えない。また、仮想マシン１４０，１５０に均一に負荷が分散されてしまうため、一方の仮想マシンにのみトラフィックを振り分けるなど、更新作業時の流量制御を行うことが難しい。
【００８４】
そこで、業務サーバ１００は、ＳＬＢ５０を実行する仮想マシンを以下のように配備し、仮想マシン１４０でのアドレス変更を伴わないようにする。まず、各仮想マシンの接続例を説明する。
【００８５】
図１０は、ＳＬＢ配備後の仮想マシンの接続例を示す図である。第２の実施の形態では、ハイパーバイザ１２０は、仮想マシンＭ１の代わりに仮想マシン１６０を配備する。仮想マシン１６０は、仮想マシン１３０，１４０との接続関係が、仮想マシンＭ１と異なる。仮想マシン１６０は、仮想マシン１４０，１５０に対する負荷分散を行う。図１０では、仮想マシン１５０の図示を省略している。仮想マシン１５０も含めた接続例は後述される。
【００８６】
仮想マシン１３０は、デバイスドライバ１３１、バックエンドドライバ１３３およびブリッジ１３５を有する。バックエンドドライバ１３３は、仮想マシン１６０との通信に用いられるソフトウェアである。バックエンドドライバ１３３は、“ｖｉｆ２．０”という識別情報に対応付けられている。図１０では、点線で囲ったブロックでバックエンドドライバ１３２を示している。バックエンドドライバ１３２の機能（例えば、仮想マシン１４０との通信機能）は、仮想マシン１６０に移転（マイグレーション）されるためである。バックエンドドライバ１３２は仮想マシン１３０上では無効になる。この場合、ブリッジ１３５は、デバイスドライバ１３１とバックエンドドライバ１３３とを接続する。
【００８７】
仮想マシン１６０は、フロントエンドドライバ１６１、バックエンドドライバ１６２およびブリッジ１６５を有する。フロントエンドドライバ１６１は、仮想マシン１６０の仮想的な通信インタフェースとして機能するソフトウェアである。フロントエンドドライバ１６１は、仮想マシン１６０において“ｅｔｈ０”という識別情報に対応付けられている。なお、バックエンドドライバ１３３およびフロントエンドドライバ１６１に対して、バッファ１２２が設けられる。ハイパーバイザ１２０は、“ｖｉｆ２．０”に対応するバックエンドドライバ１３３とフロントエンドドライバ１６１との接続を“Ｎｅｔ２”というＮｅｔ  ＩＤに対応付けて管理する。
【００８８】
バックエンドドライバ１６２は、仮想マシン１４０との通信に用いられるソフトウェアである。バックエンドドライバ１６２は、バックエンドドライバ１３２に対応するドライバである。バックエンドドライバ１６２は、“ｖｉｆ１．０”という識別情報に対応付けられている。
【００８９】
この場合、仮想マシン１４０のフロントエンドドライバ１４１は、バックエンドドライバ１６２と接続される。フロントエンドドライバ１４１およびバックエンドドライバ１６２との通信では、バッファ１２１が引き続き利用される。ハイパーバイザ１２０は、“ｖｉｆ１．０”に対応するバックエンドドライバ１６２とフロントエンドドライバ１６１との接続を“Ｎｅｔ１”というＮｅｔ  ＩＤに対応付けて管理する。
【００９０】
例えば、ハイパーバイザ１２０は、各仮想マシンにおけるフロントエンドドライバ、バックエンドドライおよびブリッジの情報を、所定のコンフィグ情報など（例えば、Ｘｅｎであればｘｅｎｄ−ｃｏｎｆｉｇファイルやドメイン定義ファイルなど）に対して追加／削除する。そして、ハイパーバイザ１２０は、当該コンフィグ情報に基づいて所定の制御サービス（例えば、ｘｅｎｄなど）を仮想マシンにより動作させることで、各仮想マシンに対して各種ドライバおよびブリッジを追加／削除し得る。
【００９１】
図１１は、業務サーバの機能例を示す図である。ハイパーバイザ１２０は、デバイス移転制御部１２３、ＳＬＢ配備部１２４、バッファ作成部１２５、バッファ切換部１２６およびアクセス制御部１２７を有する。デバイス移転制御部１２３、ＳＬＢ配備部１２４、バッファ作成部１２５、バッファ切換部１２６およびアクセス制御部１２７は、ＲＡＭ１０２に記憶されたプログラムをプロセッサ１０１が実行することで実現される。
【００９２】
デバイス移転制御部１２３は、新規にＳＬＢ用の仮想マシンを配備する際に、ある仮想マシンから別の仮想マシンへのバックエンドドライバのマイグレーションを制御する。例えば、図１０で説明したように、デバイス移転制御部１２３は、仮想マシン１３０でバックエンドドライバ１３２を動作させる代わりに、仮想マシン１６０でバックエンドドライバ１６２を動作させる。
【００９３】
ＳＬＢ配備部１２４は、負荷分散機能を有する仮想マシン１６０の配備を行う。ＳＬＢ配備部１２４は、仮想マシン１６０におけるフロントエンドドライバ１６１、バックエンドドライバ１６２およびブリッジ１６５の接続の設定を行う。
【００９４】
バッファ作成部１２５は、バックエンドドライバとフロントエンドドライバとで共有されるバッファをＲＡＭ１０２上に確保する（バッファを作成する）。バッファ作成部１２５は、バックエンドドライバおよびフロントエンドドライバの組ごとに、バッファを設ける。
【００９５】
バッファ切換部１２６は、バックエンドドライバによるデータの書き込み先アドレスの切換を行う。例えば、バッファ切換部１２６は、バックエンドドライバ１３２のデータの書き込み先を、ＲＡＭ１０２上の禁止領域のアドレスに切り換える。これにより、バックエンドドライバ１３２による書き込みをトラップして、当該書き込み先の別のアドレス（何れかのバッファのアドレス）への変更を行えるようにする。
【００９６】
アクセス制御部１２７は、各ドライバからのバッファに対するアクセスを制御する。アクセス制御部１２７は、各バッファに対する各ドライバからの書き込み／読み出しのアクセスの禁止／許可を制御する。
【００９７】
仮想マシン１３０は、マネージャ１３７を有する。マネージャ１３７は、仮想マシン１３０に割り当てられたメモリ上のプログラムを仮想マシン１３０に割り当てられた仮想プロセッサが実行することで実現される。
【００９８】
マネージャ１３７は、業務サーバ１００への動作指示を発行する管理用のソフトウェアである。マネージャ１３７は、仮想マシン（ＳＬＢを含む）の新規配備の指示や、仮想マシンの撤収の指示などをハイパーバイザ１２０に通知する。マネージャ１３７は、仮想マシン１６０上のＳＬＢに対する負荷分散の設定変更を行うこともできる。なお、管理サーバ２００がマネージャ１３７の機能を発揮してもよい。
【００９９】
記憶部１７０は、ハイパーバイザ１２０の処理に利用される情報を記憶する。具体的には、記憶部１７０は、各仮想マシンのバックエンドドライバおよびフロントエンドドライバを管理するためのＶＭ管理テーブルを記憶する。また、記憶部１７０は、バックエンドドライバとフロントエンドドライバとが共有するバッファを管理するためのネットワーク管理テーブルを記憶する。
【０１００】
図１２は、ＶＭ管理テーブルの例を示す図である。ＶＭ管理テーブル１７１は、記憶部１７０に記憶される。ＶＭ管理テーブル１７１は、ＶＭ  ＩＤ、ＣＰＵ、メモリ、Ｎｅｔ  ＩＤおよびドライバ種別の項目を含む。
【０１０１】
ＶＭ  ＩＤの項目には、仮想マシンのＩＤが登録される。ＣＰＵの項目には、仮想マシンに割り当てられた仮想プロセッサの個数が登録される。メモリの項目には、仮想マシンに割り当てられたメモリのサイズが登録される。Ｎｅｔ  ＩＤの項目には、Ｎｅｔ  ＩＤが登録される。Ｎｅｔ  ＩＤの項目は、設定なし（ハイフン“−”）であることもある。ドライバ種別の項目には、ドライバ種別が登録される。ドライバ種別は、バックエンドドライバまたはフロントエンドドライバを示す情報である。ただし、ドライバ種別が設定なし（“Ｎｏｎｅ”）であることもある。
【０１０２】
ここで、ＶＭ管理テーブル１７１では、図６で例示した、仮想マシン１３０および仮想マシン１４０の各ドライバの情報が登録された例を示している。例えば、ＶＭ管理テーブル１７１には、ＶＭ  ＩＤが“０”、ＣＰＵが“２”、メモリが“４ＧＢ”、Ｎｅｔ  ＩＤが“Ｎｅｔ１”、ドライバ種別が“Ｂａｃｋｅｎｄ”という情報が登録される。ＶＭ  ＩＤ“０”は仮想マシン１３０を示す。すなわち、当該エントリは、仮想マシン１３０のエントリである。仮想マシン１３０には仮想プロセッサが２個、メモリが４ＧＢ割り当てられていることを示す。また、仮想マシン１３０は１つのバックエンドドライバ１３２を有することを示す。更に、バックエンドドライバ１３２がＮｅｔ  ＩＤ“Ｎｅｔ１”で識別されるネットに属することを示す。
【０１０３】
また、ＶＭ管理テーブル１７１には、ＶＭ  ＩＤが“１”、ＣＰＵが“１”、メモリが“１ＧＢ”、Ｎｅｔ  ＩＤが“Ｎｅｔ１”、ドライバ種別が“Ｆｒｏｎｔｅｎｄ”という情報が登録される。ＶＭ  ＩＤ“１”は仮想マシン１４０を示す。すなわち、当該エントリは、仮想マシン１４０のエントリである。仮想マシン１４０には、仮想プロセッサが１個、メモリが１ＧＢ割り当てられていることを示す。また、仮想マシン１４０は１つのフロントエンドドライバ１４１を有することを示す。更に、フロントエンドドライバ１４１がＮｅｔ  ＩＤ“Ｎｅｔ１”で識別されるネットに属することを示す。
【０１０４】
図１３は、ネットワーク管理テーブルの例を示す図である。ネットワーク管理テーブル１７２は、記憶部１７０に記憶される。ネットワーク管理テーブル１７２は、Ｎｅｔ  ＩＤ、バッファアドレス、サイズおよびアクセス制御の項目を含む。
【０１０５】
Ｎｅｔ  ＩＤの項目には、Ｎｅｔ  ＩＤが登録される。バッファアドレスの項目には、ハイパーバイザ１２０が各仮想マシンからの要求に基づいて該当のバッファにアクセスする際に用いるアドレスが登録される（各仮想マシンによるバッファへのアクセスは、ハイパーバイザ１２０を介して行われるため）。サイズの項目には、バッファのサイズが登録される。アクセス制御の項目には、該当のバッファに対するアクセス制御の情報が登録される。具体的には、アクセス制御の項目には、該当のバッファへのアクセスを許容する仮想マシンのＶＭ  ＩＤが登録される。アクセス制御の項目に登録されていないＶＭ  ＩＤに対応する仮想マシンは、該当のバッファへのアクセスが許可されていないことになる。
【０１０６】
例えば、ネットワーク管理テーブル１７２には、Ｎｅｔ  ＩＤが“Ｎｅｔ１”、バッファアドレスが“Ａｄｄｒ１”、サイズが“Ｓｉｚｅ１”、アクセス制御が“０，１”という情報が登録される。これは、Ｎｅｔ  ＩＤ“Ｎｅｔ１”で識別されるネットに対応するバッファ１２１のアドレスが“Ａｄｄｒ１”であり、サイズが“Ｓｉｚｅ１”であることを示す。また、ＶＭ  ＩＤ“０”の仮想マシン１３０およびＶＭ  ＩＤ“１”の仮想マシン１４０からのバッファ１２１に対するアクセスが許可されており、それ以外の仮想マシンからバッファ１２１に対するアクセスが許可されていないことを示す。
【０１０７】
次に、業務サーバ１００による処理手順を説明する。
図１４は、デバイスマイグレーションの例を示すフローチャートである。以下、図１４に示す処理をステップ番号に沿って説明する。
【０１０８】
（Ｓ１）デバイス移転制御部１２３は、マネージャ１３７からＳＬＢ配備指示を受け付ける。例えば、システムの管理者は、管理サーバ２００または業務サーバ１００に接続された入力デバイスを操作して、ＳＬＢ配備指示を業務サーバ１００に入力できる。マネージャ１３７は、ＳＬＢ配備指示を受け付けると、デバイス移転制御部１２３にＳＬＢ配備指示を通知する。ＳＬＢ配備指示には、負荷分散の対象としたい仮想マシン（例えば、仮想マシン１４０）を指定する情報が含まれる。
【０１０９】
（Ｓ２）デバイス移転制御部１２３は、業務サーバ１００上にＳＬＢが配備済であり、かつ、ＳＬＢがマネージャ１３７からの制御を許容しているか否かを判定する。ＳＬＢが配備済であり、かつＳＬＢがマネージャ１３７からの制御を許容している場合、処理を終了する。ＳＬＢが配備済でないか、または、ＳＬＢが配備済であっても、マネージャ１３７からの制御が許容されていない場合、処理をステップＳ３に進める。ここで、ステップＳ２でＹｅｓの場合に処理を終了する理由は、例えば、マネージャ１３７から既存のＳＬＢの負荷分散の設定を操作することで、ローリングアップデートを行えるからである。一方、ステップＳ２でＮｏの場合は、新規にＳＬＢ用の仮想マシン１６０を配備することになる。
【０１１０】
（Ｓ３）ＳＬＢ配備部１２４は、ＳＬＢ（仮想マシン１６０）の配備を実行する。ステップＳ３に伴って、ＶＭ管理テーブル１７１およびネットワーク管理テーブル１７２は更新される。詳細は後述される。
【０１１１】
（Ｓ４）デバイス移転制御部１２３は、切換対象のＮｅｔ  ＩＤに対応するバックエンドドライバを、更新後のＶＭ管理テーブルから検索する。
（Ｓ５）デバイス移転制御部１２３は、何れかのバックエンドドライバを検索できたか否かを判定する。何れかのバックエンドドライバを検索できた場合、処理をステップＳ６に進める。何れのバックエンドドライバも検索できなかった場合、処理を終了する（この場合、エラーとなるので、デバイス移転制御部１２３は、所定のエラー処理を実行してもよい）。例えば、切換対象のＮｅｔ  ＩＤが“Ｎｅｔ１”の場合、更新後のＶＭ管理テーブルには、仮想マシン１４０，１６０の接続関係がＮｅｔ  ＩＤ“Ｎｅｔ１”に対応付けて登録されることになる（図１６で例示する）。したがって、この場合、Ｎｅｔ  ＩＤ“Ｎｅｔ１”に対して検索されるバックエンドドライバは、バックエンドドライバ１６２である。
【０１１２】
（Ｓ６）デバイス移転制御部１２３は、更新後のＶＭ管理テーブルに基づいて、バックエンドドライバの切換元の仮想マシン（切換元ＶＭ）を選択する。例えば、バックエンドドライバ１６２の切換元の仮想マシンは、仮想マシン１３０である。
【０１１３】
（Ｓ７）バッファ切換部１２６は、各仮想マシンによるアクセス先のバッファを切り換える。詳細は後述される。
（Ｓ８）デバイス移転制御部１２３は、更新後のＶＭ管理テーブルを更新して、最新の状態とする。例えば、デバイス移転制御部１２３は、不要なエントリの削除などを行う。
【０１１４】
（Ｓ９）デバイス移転制御部１２３は、切換先のバックエンドドライバでの通信を開始する。具体的には、バックエンドドライバ１３２をバックエンドドライバ１６２へマイグレーションする場合、デバイス移転制御部１２３は、バックエンドドライバ１３２をダウンさせ、バックエンドドライバ１３３をアップさせる。あるいは、デバイス移転制御部１２３は、バックエンドドライバ１３２の動作を停止させて、バックエンドドライバ１３３の動作を開始させる。これにより、バックエンドドライバ１３２は無効になる。また、バックエンドドライバ１３３，１６２およびフロントエンドドライバ１６１，１４１を用いた通信が有効となる。
【０１１５】
図１５は、ＳＬＢ配備の例を示すフローチャートである。以下、図１５に示す処理をステップ番号に沿って説明する。以下の手順は、図１４のステップＳ３に相当する。なお、負荷分散の対象としたい仮想マシンのＶＭ  ＩＤとしてＶＭ  ＩＤ“１”（仮想マシン１４０）が指定されているものとする。仮想マシン１４０のフロントエンドドライバ１４１は、仮想マシン１３０のバックエンドドライバ１３２に接続されているので、ＳＬＢ配備部１２４は、ＳＬＢ配備に伴い、仮想マシン１３０，１４０の接続関係を変更することになる。
【０１１６】
（Ｓ１１）ＳＬＢ配備部１２４は、ホストＯＳを実行する仮想マシン１３０のＶＭ  ＩＤ“０”と、ＳＬＢ配備要求で指定された仮想マシン１４０のＶＭ  ＩＤ“１”とで共通のＮｅｔ  ＩＤを、ＶＭ管理テーブル１７１から取得する。ＶＭ管理テーブル１７１の例によれば、Ｎｅｔ  ＩＤ“Ｎｅｔ１”である。
【０１１７】
（Ｓ１２）ＳＬＢ配備部１２４は、取得したＮｅｔ  ＩＤについて、バックエンド側（バックエンドドライバ側）に対応するＶＭ  ＩＤを、ＶＭ管理テーブル１７１から取得する。例えば、Ｎｅｔ  ＩＤ“Ｎｅｔ１”の場合、バックエンド側に対応するＶＭ  ＩＤは“１”（仮想マシン１３０）である。
【０１１８】
（Ｓ１３）ＳＬＢ配備部１２４は、フロントエンドおよびバックエンドの２つのＮＩＣをもつ新規仮想マシン（仮想マシン１６０）を配備する。２つのＮＩＣのうちフロントエンドは、フロントエンドドライバ１６１に対応する。バックエンドは、バックエンドドライバ１６２に対応する。ＳＬＢ配備部１２４は、配備結果に応じて、ＶＭ管理テーブル１７１を更新する。
【０１１９】
（Ｓ１４）ＳＬＢ配備部１２４は、更新後のＶＭ管理テーブルにおいて、配備した仮想マシン１６０のフロントエンドＮＩＣ（フロントエンドドライバ１６１）に対するバックエンド側（バックエンドドライバ１３３）を、ステップＳ１２で取得したＶＭ  ＩＤ“１”に対し設定する。すなわち、ＳＬＢ配備部１２４は、仮想マシン１３０について、バックエンドドライバ１３３に関する新たなエントリを、ＶＭ管理テーブルに登録する。また、ＳＬＢ配備部１２４は、各ドライバが属するＮｅｔ  ＩＤをＶＭ管理テーブルに登録する。
【０１２０】
（Ｓ１５）ＳＬＢ配備部１２４は、バックエンドドライバ１３３およびフロントエンドドライバ１６１が属するネットのＮｅｔ  ＩＤを仮想基盤（ハイパーバイザ１２０上でドライバ間の接続関係を管理する別プロセス）から取得する。なお、Ｎｅｔ  ＩＤは、ＳＬＢ配備部１２４により新たに付与されてもよい。例えば、ＳＬＢ配備部１２４は、Ｎｅｔ  ＩＤ“Ｎｅｔ２”を取得する。
【０１２１】
（Ｓ１６）ＳＬＢ配備部１２４は、取得したＮｅｔ  ＩＤでネットワーク管理テーブル１７２を検索する。例えば、ＳＬＢ配備部１２４は、Ｎｅｔ  ＩＤ“Ｎｅｔ２”のエントリをネットワーク管理テーブル１７２から検索する。
【０１２２】
（Ｓ１７）ＳＬＢ配備部１２４は、ネットワーク管理テーブル１７２に該当のＮｅｔ  ＩＤのエントリが存在するか否かを判定する。存在する場合、処理をステップＳ１９に進める。存在しない場合、処理をステップＳ１８に進める。
【０１２３】
（Ｓ１８）ＳＬＢ配備部１２４は、ステップＳ１７で存在していないと判定されたＮｅｔ  ＩＤのエントリを、ネットワーク管理テーブル１７２に作成する。例えば、ＳＬＢ配備部１２４は、Ｎｅｔ  ＩＤ“Ｎｅｔ２”のエントリを作成する。バッファ作成部１２５は、作成されたエントリに対応するバッファを新たに作成する。バッファ作成部１２５は、バッファのアドレスおよびサイズをＳＬＢ配備部１２４に提供する。
【０１２４】
（Ｓ１９）ＳＬＢ配備部１２４は、ステップＳ１５で取得したＮｅｔ  ＩＤに対し、ネットワーク管理テーブル１７２のアクセス制御の項目に、フロントエンド側のＶＭ  ＩＤ（例えば“１”）とバックエンド側のＶＭ  ＩＤ（例えば“２”）とを追加する。
【０１２５】
図１６は、ＳＬＢ配備部のテーブル更新例を示す図である。図１６では、図１５のステップＳ１１，Ｓ１３，Ｓ１４におけるテーブル参照または更新の例を示す。図１６（Ａ）は、ステップＳ１１におけるＶＭ管理テーブル１７１を例示している。図１６（Ｂ）は、ステップＳ１３におけるＶＭ管理テーブル１７１ａを例示している。図１６（Ｃ）は、ステップＳ１４におけるＶＭ管理テーブル１７１ｂを例示している。
【０１２６】
ステップＳ１１では、ＳＬＢ配備部１２４は、ＶＭ管理テーブル１７１を参照する。例えば、ＶＭ  ＩＤ“０”、“１”に共通のＮｅｔ  ＩＤは、“Ｎｅｔ１”である。また、“Ｎｅｔ１”に対応するＶＭ  ＩＤ“０”、“１”のうち、バックエンド側はＶＭ  ＩＤ“０”である（ステップＳ１２）。
【０１２７】
ステップＳ１３では、ＳＬＢ配備部１２４は、ＶＭ管理テーブル１７１を、ＶＭ管理テーブル１７１ａに更新する。具体的には、新規に配備した仮想マシン１６０のＶＭ  ＩＤ“２”、ＣＰＵ“１”、メモリ“１ＧＢ”、Ｎｅｔ  ＩＤ“−”（設定なし）、ドライバ種別“Ｂａｃｋｅｎｄ”というエントリを登録する。同様に、ドライバ種別“Ｆｒｏｎｔｅｎｄ”のエントリを登録する（その他の項目の設定は“Ｂａｃｋｅｎｄ”のエントリと同様である）。
【０１２８】
ステップＳ１４では、ＳＬＢ配備部１２４は、ＶＭ管理テーブル１７１ａを、ＶＭ管理テーブル１７１ｂに更新する。具体的には、バックエンドドライバ１３２のエントリ（ＶＭ  ＩＤ“０”、Ｎｅｔ  ＩＤ“Ｎｅｔ１”、ドライバ種別“Ｂａｃｋｅｎｄ”を含む）について、Ｎｅｔ  ＩＤを設定なし“−”とし、ドライバ種別を“Ｎｏｎｅ”とする。また、仮想マシン１６０のフロントエンドドライバ１６１と接続するバックエンドドライバ１３３のエントリを仮想マシン１３０のＶＭ  ＩＤ“２”に対応付けて登録する。具体的には、ＶＭ  ＩＤ“０”、Ｎｅｔ  ＩＤ“２”、ドライバ種別“Ｂａｃｋｅｎｄ”のエントリである。
【０１２９】
更に、ＳＬＢ配備部１２４は、仮想マシン１６０のバックエンドドライバ１６２のエントリ（ＶＭ  ＩＤ“２”、Ｎｅｔ  ＩＤ“−”、ドライバ種別“Ｂａｃｋｅｎｄ”）にＮｅｔ  ＩＤ“Ｎｅｔ１”を設定する。ＳＬＢ配備部１２４は、仮想マシン１６０のフロントエンドドライバ１６１のエントリ（ＶＭ  ＩＤ“２”、Ｎｅｔ  ＩＤ“−”、ドライバ種別“Ｆｒｏｎｔｅｎｄ”）にＮｅｔ  ＩＤ“Ｎｅｔ２”を設定する。
【０１３０】
なお、図１４のステップＳ４の検索は、ＶＭ管理テーブル１７１ｂを参照して実行されることになる（切換対象のＮｅｔ  ＩＤ“１”に対してバックエンドドライバ１６２が検索される）。
【０１３１】
図１７は、ＳＬＢ配備部のテーブル更新例（続き）を示す図である。図１７では、図１５のステップＳ１７，Ｓ１８，Ｓ１９におけるテーブル参照または更新の例を示す。図１７（Ａ）は、ステップＳ１７におけるネットワーク管理テーブル１７２を例示している。図１７（Ｂ）は、ステップＳ１８におけるネットワーク管理テーブル１７２ａを例示している。図１７（Ｃ）は、ステップＳ１９におけるネットワーク管理テーブル１７２ｂを例示している。
【０１３２】
ステップＳ１７では、ＳＬＢ配備部１２４は、ネットワーク管理テーブル１７２に基づいて判定を行う。例えば、ＳＬＢ配備部１２４がネットワーク管理テーブル１７２を参照してＮｅｔ  ＩＤ“Ｎｅｔ２”を検索しても、ネットワーク管理テーブル１７２には、Ｎｅｔ  ＩＤ“Ｎｅｔ２”のエントリは存在しない。
【０１３３】
ステップＳ１８では、ＳＬＢ配備部１２４は、ネットワーク管理テーブル１７２をネットワーク管理テーブル１７２ａに更新する。具体的には、ＳＬＢ配備部１２４は、ステップＳ１７で存在しないと判定されたＮｅｔ  ＩＤ“Ｎｅｔ２”、バッファアドレス“Ａｄｄｒ２”、サイズ“Ｓｉｚｅ２”のエントリをネットワーク管理テーブル１７２に追加する。アクセス制御の項目については、この段階では設定なし“−”とする。このとき、ＳＬＢ配備部１２４は、バッファのアドレスおよびサイズに関する情報を、バッファ作成部１２５から取得する。
【０１３４】
ステップＳ１９では、ＳＬＢ配備部１２４は、ネットワーク管理テーブル１７２ｂのＮｅｔ  ＩＤ“Ｎｅｔ２”のエントリのアクセス制御の項目に、フロントエンド側のＶＭ  ＩＤ“０”と、バックエンド側のＶＭ  ＩＤ“２”との組“０，２”を設定する。
【０１３５】
図１８は、バッファ切換の例を示すフローチャートである。以下、図１８に示す処理をステップ番号に沿って説明する。以下の手順は、図１４のステップＳ７に相当する。
（Ｓ２１）バッファ切換部１２６は、切換対象であるＮｅｔ  ＩＤ（例えば、“Ｎｅｔ１”）でネットワーク管理テーブル１７２ｂを検索し、バッファアドレスとアクセス制御の情報とを取得する。
【０１３６】
（Ｓ２２）バッファ切換部１２６は、取得したアクセス制御の情報に基づいて、新規配備した仮想マシン１６０は、ステップＳ２１で取得したバッファアドレスにアクセス可能であるか否かを判定する。アクセス可能である場合、処理を終了する。アクセス可能でない場合、処理をステップＳ２３に進める。
【０１３７】
（Ｓ２３）バッファ切換部１２６は、新規配備した仮想マシン１６０のバックエンドドライバ１６２のアクセス先のバッファアドレスを書き換える。具体的には、バックエンドドライバ１６２がもつ情報を操作して、バックエンドドライバ１６２内にデフォルトで設定されているポインタを、バッファ１２１のアドレス（“Ａｄｄｒ１”）に書き換える。
【０１３８】
（Ｓ２４）バッファ切換部１２６は、切換元のバックエンドドライバ１３２のアクセス先のバッファアドレスを、書込み禁止領域のアドレスに変更することで、転送中の書き込みをトラップ（捕捉）する。具体的には、バッファ切換部１２６は、バックエンドドライバ１３２がもつ情報を操作して、バックエンドドライバ１３２内のポインタ（“Ａｄｄｒ１”を示す）を、バックエンドドライバ１３２の書込みが禁止されているアドレスに変更する。すると、例えば、バックエンドドライバ１３２による禁止領域への書き込み時に、ハードウェア割り込みを発生させることができる。よって、バッファ切換部１２６は、当該割り込みによりバックエンドドライバ１３２によるデータ書き込みをトラップ可能になる。バックエンドドライバ１３２による当該書込みが発生するということは、転送途中のデータが存在することを意味する。したがって、バッファ切換部１２６は、トラップしたデータをバッファ１２１に書き込むことで、現在転送中のデータをバッファ１２１に格納できる。
【０１３９】
（Ｓ２５）バッファ切換部１２６は、ネットワーク管理テーブル１７２ｂにおけるアクセス制御の情報を更新する。具体的には、バッファ切換部１２６は、切換対象であるＮｅｔ  ＩＤ“Ｎｅｔ１”に関して、仮想マシン１４０，１６０によるアクセスを許可し、仮想マシン１３０によるアクセスを不許可とするよう設定する。ただし、ステップＳ２４で説明したように、バックエンドドライバ１３２による禁止領域へのデータ書込みがトラップされた場合、当該書込み対象のデータのバッファ１２１への書き込みは許容される（この書き込みはハイパーバイザ１２０の一機能であるバッファ切換部１２６により実行されるため）。
【０１４０】
図１９は、バッファ切換部のテーブル更新例を示す図である。図１９では、図１８のステップＳ２２，Ｓ２５におけるテーブル参照または更新の例を示す。図１９（Ａ）は、ステップＳ２２におけるネットワーク管理テーブル１７２ｂを例示している。図１９（Ｂ）は、ステップＳ２５におけるネットワーク管理テーブル１７２ｃを例示している。
【０１４１】
ステップＳ２２では、バッファ切換部１２６は、ネットワーク管理テーブル１７２ｂに基づいて判定を行う。例えば、バッファ切換部１２６は、Ｎｅｔ  ＩＤ“Ｎｅｔ１”に対して、バッファアドレス“Ａｄｄｒ１”およびアクセス制御“０，１”を取得する。
【０１４２】
ステップＳ２５では、バッファ切換部１２６は、ネットワーク管理テーブル１７２ｂを、ネットワーク管理テーブル１７２ｃに更新する。具体的には、バッファ切換部１２６は、Ｎｅｔ  ＩＤ“Ｎｅｔ１”のエントリにおけるアクセス制御の項目を“１，２”に設定する。アクセス制御部１２７は、ネットワーク管理テーブル１７２ｃのアクセス制御の項目に基づいて、各バッファに対するアクセス制御を行う。
【０１４３】
このようにして、業務サーバ１００は、バックエンドドライバ１３２のバックエンドドライバ１６２へのマイグレーションを実行する。
図２０は、マイグレーション後の負荷分散の例を示す図である。例えば、ローリングアップデートを行う場合、ハイパーバイザ１２０は、仮想マシン１４０と同等のサービスを提供する仮想マシン１５０も新たに配備する。仮想マシン１５０は、フロントエンドドライバ１５１を有する。フロントエンドドライバ１５１は、仮想マシン１５０において“ｅｔｈ０”という識別情報に対応付けられている。この場合、仮想マシン１６０に、バックエンドドライバ１６３を更に追加する。バックエンドドライバ１６３は、フロントエンドドライバ１５１と接続される。バックエンドドライバ１６３は、“ｖｉｆ３．０”という識別情報に対応付けられている。仮想マシン１６０は、ＳＬＢ１６０ａを有する。
【０１４４】
ＳＬＢ１６０ａは、ブリッジ１６５を経由するパケットを取得して、負荷分散を行う。例えば、ＳＬＢ１６０ａは、ＭＡＣアドレスを用いて負荷分散を行う。より具体的には、ＳＬＢ１６０ａは、仮想マシン１４０から、仮想マシン１６０を配備する前から仮想マシン１４０にアクセスしていたクライアントのＩＰアドレスを取得する（当該ＩＰアドレスをハイパーバイザ１２０から取得してもよい）。ＳＬＢ１６０ａは、当該クライアントのＩＰアドレスを送信元とするパケットを、仮想マシン１４０に振り分けるようにする。振り分け先の仮想マシン１４０，１５０の管理は、フロントエンドドライバ１４１，１５１のＭＡＣアドレスにより行う。この場合、フロントエンドドライバ１５１のＩＰアドレスは、任意でよい。例えば、フロントエンドドライバ１５１にフロントエンドドライバ１４１と同じＩＰアドレス“ＩＰ−Ａ”を設定してもよい。
【０１４５】
フロントエンドドライバ１５１にフロントエンドドライバ１４１と異なるＩＰアドレスを設定してもよい。その場合、ＳＬＢは、宛先ＩＰアドレス“ＩＰ−Ａ”を指定したパケットを仮想マシン１５０に振り分ける際に、当該パケットの宛先ＩＰアドレスを、仮想マシン１５０のＩＰアドレスに変換する。ＳＬＢは、仮想マシン１５０から当該パケットに対する応答パケットを受信したときは、送信元ＩＰアドレスをＩＰアドレス“ＩＰ−Ａ”に戻して、転送する。こうして、仮想マシン１４０，１５０，１６０を用いて、ユーザに対するサービス提供機能を冗長化させることで、ローリングアップデートを行える。
【０１４６】
図２１は、ＳＬＢ配備例（その１）を示す図である。第２の実施の形態によれば、負荷分散を行う仮想マシン１６０が配備されていなくても、クライアント３００と仮想マシン１４０との間のセッション情報を維持しながら、仮想マシン１６０を動的に配備可能となる。例えば、仮想マシン１４０に設定されているＩＰアドレス“ＩＰ−Ａ”は、仮想マシン１６０の配備後も、仮想マシン１４０により利用される。
【０１４７】
ここで、バッファ１２１には仮想マシン１４０と当該クライアント３００との間の通信データが格納され、また、仮想マシン１４０のＩＰアドレスも変更せずに済むので、仮想マシン１４０は仮想マシン１６０の配備前のセッション情報を継続して利用できる。よって、仮想マシン１６０の配備後も、仮想マシン１４０とクライアント３００との通信内容を維持できる。また、ネットワーク３０，４０に含まれる各スイッチにおいて、ＭＡＣアドレス学習テーブルなどの再学習を行わなくてもよいので、各スイッチによる再学習に伴うクライアント３００と仮想マシン１４０との通信の中断も抑制できる。
【０１４８】
図２２は、ＳＬＢ配備例（その２）を示す図である。ここで、図１４のステップＳ２では、ＳＬＢが配備済であり、かつ、ＳＬＢがマネージャ１３７からの制御を許容しているという条件を満たさない場合に、新規にＳＬＢを有する仮想マシン１６０を配備する例を示した。その具体的なケースの１つとして、仮想マシン１４０，１５０に対してＳＬＢ１８０ａを有する仮想マシン１８０が配備済であるが、ＳＬＢ１８０ａに対するマネージャ１３７からの制御が許容されていない場合が考えられる。
【０１４９】
この場合、管理者の操作により、ＳＬＢ１８０ａの設定を変更できないので、ＳＬＢ１８０ａによるパケットの流量制御を行えず、ローリングアップデートを適切に行えないことになる。このような場合にも、ハイパーバイザ１２０は、第２の実施の形態の方法により、仮想マシン１６０を動的に配備する。すると、仮想マシン１８０のフロントエンドドライバのＩＰアドレスを変更しなくてよい（例えば、仮想マシン１６０の配備前のＩＰアドレス“ＩＰ−Ａ”を、仮想マシン１６０の配備後にも仮想マシン１８０で使用できる）。ハイパーバイザ１２０は、仮想マシン１９０を更に動作させる。仮想マシン１９０は、サービス１４０ａ，１５０ａと同等のサービスを提供する。そして、ＳＬＢ１６０ａは、仮想マシン１８０，１９０に対する負荷分散を行う。こうして、ＳＬＢ１８０ａによるパケットの流量制御を行えなくても、ＳＬＢ１６０ａによりパケットの流量制御を行えるようになる。したがって、サービス１９０ａによってサービス提供を代替させている間に、仮想マシン１４０，１５０におけるソフトウェアの更新作業などを行えるようになる。特に、仮想マシン１６０の配備後も、仮想マシン１４０，１５０とクライアント３００との通信途中のセッション情報を維持できる。
【０１５０】
なお、ローリングアップデートなどの作業後は、ＳＬＢを行う仮想マシン１６０を撤収してよい。次に、撤収の手順を例示する。
図２３は、ＳＬＢ撤収の例を示すフローチャートである。以下、図２３に示す処理をステップ番号に沿って説明する。
【０１５１】
（Ｓ３１）デバイス移転制御部１２３は、ＳＬＢ１６０ａ（仮想マシン１６０）の撤収指示（あるいは、仮想マシン１６０の停止指示）を受け付ける。すると、デバイス移転制御部１２３は、バックエンドドライバ１３２を仮想マシン１３０上で動作させる。
【０１５２】
（Ｓ３２）バッファ切換部１２６は、バッファ切換を行う。バッファ切換部１２６は、図１８で例示したバッファ切換の手順を、バックエンドドライバ１６２からバックエンドドライバ１３２へ移転させるケースとして実行する。バッファ切換部１２６は、バックエンドドライバ１３２のアクセス先をバッファ１２１に設定する。このとき、バッファ１２２に格納されたデータをバッファ１２１にマージしてもよい。また、バックエンドドライバ１３３，１６２のデータ書込み先のアドレスを書込み禁止領域のアドレスに設定することで、バックエンドドライバ１３３，１６２によるデータ書込みをトラップして、バッファ１２１に書き込んでもよい。バッファ切換部１２６は、ネットワーク管理テーブル１７２ｃを更新する。更新後のネットワーク管理テーブルは、ネットワーク管理テーブル１７２と同じ設定内容となる。
【０１５３】
（Ｓ３３）デバイス移転制御部１２３は、ＶＭ管理テーブル１７１ｂを更新する。更新後のネットワーク管理テーブルは、ＶＭ管理テーブル１７１と同じ設定内容となる。すなわち、ＶＭ管理テーブル１７１およびネットワーク管理テーブル１７２は、仮想マシン１６０の配備前の状態に戻される。
【０１５４】
（Ｓ３４）デバイス移転制御部１２３は、ＳＬＢ１６０ａの仮想マシン１６０を撤収する。具体的には、デバイス移転制御部１２３は、仮想マシン１６０を停止させ、仮想マシン１６０に割り当てていたリソースを解放する（当該リソースは再利用可能となる）。
【０１５５】
図２４は、ＳＬＢ撤収の例を示す図である。ハイパーバイザ１２０は、仮想マシン１６０のバックエンドドライバ１６２に代えて、バックエンドドライバ１３２を仮想マシン１３０上で動作させる。バックエンドドライバ１３２は、フロントエンドドライバ１４１と共にバッファ１２１を共有し、再び仮想マシン１３０，１４０の通信を実現する。バックエンドドライバ１３２のアクセス先をバッファ１２１とすることで、クライアント３００と仮想マシン１４０との間で転送途中のデータは維持される。また、バックエンドドライバ１３３，１６２によるアクセス先を禁止領域のアドレスに変更することで、バックエンドドライバ１３３，１６２による転送途中のデータの書き込みをトラップし、当該データをバッファ１２１に書き込んでもよい。このようにすれば、転送途中であるがバッファ１２１に未書き込みであるデータもバッファ１２１に格納できる。
【０１５６】
その後、ハイパーバイザ１２０は、仮想マシン１６０を停止させる。また、ハイパーバイザ１２０は、仮想マシン１３０からバックエンドドライバ１３３を削除する。こうして、ハイパーバイザ１２０は、業務サーバ１００を図６の状態（元の状態）に戻せる。
【０１５７】
ところで、第２の実施の形態の方法を用いて、仮想マシン１４０に対するソフトウェア更新を次のように行うことが考えられる。
図２５は、仮想マシンの更新方法の例（その１）を示す図である。まず、クライアント３００と仮想マシン１４０とが通信しており、仮想マシン１５０，１６０が配備されていないとする。クライアント３００と仮想マシン１４０とが通信途中であるときに、ハイパーバイザ１２０は、仮想マシン１４０のソフトウェアの更新指示（仮想マシン１６０の配備指示に相当すると考えてもよい）をマネージャ１３７から受け付ける。
【０１５８】
ハイパーバイザ１２０は、仮想マシン１５０，１６０を配備する。仮想マシン１６０のＳＬＢ１６０ａは、仮想マシン１４０，１５０に対する負荷分散を行う。ＳＬＢ１６０ａは、仮想マシン１４０とクライアント３００との通信を維持するため、クライアント３００からのパケットを仮想マシン１４０に振り分ける。仮想マシン１４０とクライアント３００との通信が完了すると、ＳＬＢ１６０ａは、全てのパケットを仮想マシン１５０へ振り分け、仮想マシン１４０へはパケットを振り分けないようにする。
【０１５９】
そして、ハイパーバイザ１２０は、仮想マシン１４０に対するソフトウェアの更新作業を行う（例えば、更新後のソフトウェアをインストールした状態で仮想マシン１４０を再起動させる）。仮想マシン１４０が一時的に停止しても、仮想マシン１５０側でサービス提供を代替することで、ユーザへのサービス提供を停止させずに済む。仮想マシン１４０のソフトウェア更新後、ハイパーバイザ１２０は、仮想マシン１５０，１６０を撤収する。
【０１６０】
図２６は、仮想マシンの更新方法の例（その２）を示す図である。まず、クライアント３００と仮想マシン１４０とが通信しており、仮想マシン１５０，１６０が配備されていないとする。クライアント３００と仮想マシン１４０とが通信途中であるときに、ハイパーバイザ１２０は、仮想マシン１４０のソフトウェアの更新指示をマネージャ１３７から受け付ける。ハイパーバイザ１２０は、仮想マシン１５０，１６０を配備する。
【０１６１】
ハイパーバイザ１２０は、仮想マシン１４０と同一スペック、同一ＩＰアドレス、かつ、更新後のソフトウェアをインストールした状態で、仮想マシン１５０を動作させる。
仮想マシン１６０のＳＬＢ１６０ａは、例えば、ＭＡＣアドレスにより仮想マシン１４０，１５０を区別して、仮想マシン１４０，１５０に対する負荷分散を行う。ＳＬＢ１６０ａは、仮想マシン１４０とクライアント３００との通信を維持するため、クライアント３００からのパケットを仮想マシン１４０に振り分ける。仮想マシン１４０とクライアント３００との通信が完了すると、ＳＬＢ１６０ａは、全てのパケットを仮想マシン１５０へ振り分け、仮想マシン１４０へはパケットを振り分けないようにする。その後、ハイパーバイザ１２０は、仮想マシン１４０，１６０を撤収する。この場合、ハイパーバイザ１２０は、バックエンドドライバ１３３および図２０で示したバックエンドドライバ１６３によるデータの書き込み先をメモリの禁止領域に設定して書き込みをトラップしてもよい。当該データの書き込み先を、仮想マシン１３０上に新たに作成されるバックエンドドライバ（仮想マシン１５０との通信に用いられる）がアクセスするバッファ領域へ変更することで、転送途中であるが当該バッファ領域に未書き込みであるデータも同バッファ領域に格納できるからである。
【０１６２】
図２５の方法では仮想マシン１４０を残し、仮想マシン１５０を撤収する。一方、図２６の方法では、仮想マシン１５０を残し、仮想マシン１４０を撤収する点が異なる。業務サーバ１００は、何れの方法も実行可能である。例えば、図２５の方法では、仮想マシン１４０，１５０のスペックは同じでなくてもよいので、仮想マシン１５０のスペックを仮想マシン１４０よりも高くしたり低くしたりできる。すなわち、リソースの利用状況に応じて、仮想マシン１５０のスペックを調整できるという利点がある。一方、図２６の方法では、（図２５の方法に対して）更新後のソフトウェアを適用した状態で仮想マシン１４０を再起動する手順を省ける。このため、作業を短縮化できるという利点がある。
【０１６３】
以上の説明では、ホストＯＳにバックエンドドライバを設ける場合を例示したが、ドライバＯＳ（あるいは、ドライバドメイン）として機能する仮想マシンに、バックエンドドライバを設ける場合にも、第２の実施の形態の方法を適用できる。その場合、ドライバドメインのバックエンドドライバを、ドライバドメインに代えて、ゲストＯＳに移行させることになる。
【０１６４】
なお、第１の実施の形態の情報処理は、演算部１１ｂにプログラムを実行させることで実現できる。また、第２の実施の形態の情報処理は、プロセッサ１０１にプログラムを実行させることで実現できる。プログラムは、コンピュータ読み取り可能な記録媒体２３に記録できる。
【０１６５】
例えば、プログラムを記録した記録媒体２３を配布することで、プログラムを流通させることができる。また、プログラムを他のコンピュータに格納しておき、ネットワーク経由でプログラムを配布してもよい。コンピュータは、例えば、記録媒体２３に記録されたプログラムまたは他のコンピュータから受信したプログラムを、ＲＡＭ１０２やＨＤＤ１０３などの記憶装置に格納し（インストールし）、当該記憶装置からプログラムを読み込んで実行してもよい。
【０１６６】
以上の第１，第２の実施の形態を含む実施形態に関し、更に以下の付記を開示する。
（付記１）  コンピュータが、
１以上の仮想マシンとの通信機能を有する第１の仮想マシンと第２の仮想マシンとの通信を制御する新規仮想マシンの配備指示を受けると、前記第１の仮想マシンが有しており前記第２の仮想マシンとの通信に利用される第１のドライバに対応する第２のドライバと、前記新規仮想マシンと前記第１の仮想マシンとの通信に利用される第３のドライバとを前記新規仮想マシンに作成して仮想ブリッジにより接続し、
前記第１のドライバが使用するバッファ領域を前記第２のドライバのバッファ領域に変更した後、前記第１のドライバを無効にし、前記第２のドライバを有効にする、
負荷分散機能配備方法。
【０１６７】
（付記２）  前記第１のドライバによるデータの書き込みを検出し、前記データの書き込み先を前記第２のドライバのバッファ領域に変更する、付記１記載の負荷分散機能配備方法。
【０１６８】
（付記３）  前記検出では、前記第１のドライバによるデータの書き込み先を、前記第１のドライバからデータの書き込みが禁止されているアドレスに設定することで、前記第１のドライバによるデータの書き込み時に割り込みを発生させる、付記２記載の負荷分散機能配備方法。
【０１６９】
（付記４）  前記新規仮想マシンは、前記第２の仮想マシンを含む複数の仮想マシンに対する負荷分散を実行する仮想マシンである、付記１乃至３の何れか１つに記載の負荷分散機能配備方法。
【０１７０】
（付記５）  前記第２の仮想マシンのＩＰアドレスを、前記新規仮想マシンの配備前と配備後とで同じにする、付記４記載の負荷分散機能配備方法。
（付記６）  前記第２の仮想マシンと同じＩＰアドレスを前記複数の仮想マシンに設定する、付記５記載の負荷分散機能配備方法。
【０１７１】
（付記７）  前記新規仮想マシンの撤収指示を受けると、前記第１の仮想マシンに前記第１のドライバを作成し、前記第２のドライバが使用するバッファ領域を、作成した前記第１のドライバのバッファ領域に変更し、前記第１の仮想マシンと前記第２の仮想マシンとの通信を開始させた後、前記新規仮想マシンを停止させる、付記１乃至６の何れか１つに記載の負荷分散機能配備方法。
【０１７２】
（付記８）  前記第１の仮想マシンは、前記コンピュータが有するハードウェアへの他の仮想マシンによるアクセスを制御する仮想マシンであり、
前記第１および前記第２のドライバは、前記第２の仮想マシンとの通信を行うバックエンドドライバである、付記１乃至７の何れか１つに記載の負荷分散機能配備方法。
【０１７３】
（付記９）  仮想マシンが通信するデータを格納するバッファ領域を含む記憶部と、
１以上の仮想マシンとの通信機能を有する第１の仮想マシンと第２の仮想マシンとの通信を制御する新規仮想マシンの配備指示を受けると、前記第１の仮想マシンが有しており前記第２の仮想マシンとの通信に利用される第１のドライバに対応する第２のドライバと、前記新規仮想マシンと前記第１の仮想マシンとの通信に利用される第３のドライバとを前記新規仮想マシンに作成して仮想ブリッジにより接続し、前記第１のドライバが使用するバッファ領域を前記第２のドライバのバッファ領域に変更した後、前記第１のドライバを無効にし、前記第２のドライバを有効にする演算部と、
を有する負荷分散機能配備装置。
【０１７４】
（付記１０）  コンピュータに、
１以上の仮想マシンとの通信機能を有する第１の仮想マシンと第２の仮想マシンとの通信を制御する新規仮想マシンの配備指示を受けると、前記第１の仮想マシンが有しており前記第２の仮想マシンとの通信に利用される第１のドライバに対応する第２のドライバと、前記新規仮想マシンと前記第１の仮想マシンとの通信に利用される第３のドライバとを前記新規仮想マシンに作成して仮想ブリッジにより接続し、
前記第１のドライバが使用するバッファ領域を前記第２のドライバのバッファ領域に変更した後、前記第１のドライバを無効にし、前記第２のドライバを有効にする、
処理を実行させる負荷分散機能配備プログラム。
【符号の説明】
【０１７５】
１０  負荷分散機能配備装置
１１  ハードウェア
１１ａ  記憶部
１１ｂ  演算部
１２  ハイパーバイザ
１３，１３ａ，１３ｂ  仮想マシン
２０  ネットワーク
Ａ１  バッファ領域
Ｂ１，Ｂ２  仮想ブリッジ
Ｄ１１，Ｄ１２，Ｄ２１，Ｄ３１，Ｄ３２  ドライバ
【図１】
2016170669.tif 000003
【図２】
2016170669.tif 000004
【図３】
2016170669.tif 000005
【図４】
2016170669.tif 000006
【図５】
2016170669.tif 000007
【図６】
2016170669.tif 000008
【図７】
2016170669.tif 000009
【図８】
2016170669.tif 000010
【図９】
2016170669.tif 000011
【図１０】
2016170669.tif 000012
【図１１】
2016170669.tif 000013
【図１２】
2016170669.tif 000014
【図１３】
2016170669.tif 000015
【図１４】
2016170669.tif 000016
【図１５】
2016170669.tif 000017
【図１６】
2016170669.tif 000018
【図１７】
2016170669.tif 000019
【図１８】
2016170669.tif 000020
【図１９】
2016170669.tif 000021
【図２０】
2016170669.tif 000022
【図２１】
2016170669.tif 000023
【図２２】
2016170669.tif 000024
【図２３】
2016170669.tif 000025
【図２４】
2016170669.tif 000026
【図２５】
2016170669.tif 000027
【図２６】
2016170669.tif 000028