(57)【要約】【課題】本発明は、ホストに負担をかけずに、アクセス要求を処理しながら、記憶制御装置内のプログラムを更新させる。【解決手段】更新制御部８は、管理端末６からプログラムの更新実行を指示されると、更新対象のコントローラ内で起動する。更新制御部８は、接続制御部７によって、上位I/F部２Ａ１を他方のコントローラ２Ｂ内のアクセス要求処理部２Ｂ３に接続させた後、プログラムメモリ２Ａ４またはブートディスク４Ａに記憶されたプログラムを更新させる。更新が完了すると、更新制御部８は、接続制御部７により、上位I/F部２Ａ１をアクセス要求処理部２Ａ３に再接続させる。各データメモリ２Ａ５，２Ｂ５の記憶内容は同期しているため、アクセス要求処理部２Ｂ３は、アクセス要求処理部２Ａ３に代わって、ホスト５からのアクセス要求を引き続き処理できる。【選択図】        図１
2007219571.tif 000002
【特許請求の範囲】
【請求項１】
複数のコントローラを備えた記憶制御装置であって、
前記各コントローラは、
上位装置との間で通信を行うための上位通信制御部と、
記憶デバイスとの間で通信を行うための下位通信制御部と、
所定のプログラムを記憶するプログラム記憶部と、
前記上位通信制御部を介して前記上位装置からのアクセス要求が受信された場合、前記下位通信制御部を介して前記記憶デバイスにアクセスし、前記所定のプログラムに基づいて所定のデータ処理を実行することにより、前記アクセス要求を処理するアクセス要求処理部と、
前記所定のデータ処理に使用されるデータを記憶するデータ記憶部と、
をそれぞれ備えており、かつ、
前記各コントローラ間を接続するための相互通信経路と、
前記プログラム記憶部に記憶されている前記所定のプログラムを更新させるための更新制御部と、
前記更新制御部からの指示に基づいて、前記各コントローラのうち一方のコントローラの前記上位通信制御部を、前記相互通信経路によって、前記各コントローラのうち他方のコントローラの前記アクセス要求処理部に接続させることにより、前記一方のコントローラの前記上位通信制御部により受信される前記アクセス要求を、前記他方のコントローラの前記アクセス要求処理部によって処理させる処理経路切替部と、
を備えた記憶制御装置。
【請求項２】
前記処理経路切替部は、
（１）通常の場合に、前記各コントローラ内において、前記上位通信制御部と前記アクセス要求処理部とをそれぞれ接続させる通常モードと、
（２）前記所定のプログラムを更新する場合に、前記一方のコントローラの前記上位通信制御部を、前記相互通信経路を介して、前記他方のコントローラの前記アクセス要求処理部に接続させる更新モードと、
とを切替可能となっている請求項１に記載の記憶制御装置。
【請求項３】
前記一方のコントローラの有する前記データ記憶部の記憶内容と前記他方のコントローラの有する前記データ記憶部の記憶内容とを同期させるデータ同期部を備える請求項１に記載の記憶制御装置。
【請求項４】
前記更新制御部は、前記一方のコントローラの有する前記データ記憶部の記憶内容と前記他方のコントローラの有する前記データ記憶部の記憶内容とが同期された場合に、前記処理経路切替部によって、前記一方のコントローラの有する前記上位通信制御部と前記他方のコントローラの有する前記アクセス要求処理部とを前記相互通信経路を介して接続させる請求項１に記載の記憶制御装置。
【請求項５】
前記更新制御部は、前記処理経路切替部によって、前記一方のコントローラの有する前記上位通信制御部が前記相互通信経路を介して前記他方のコントローラの有する前記アクセス要求処理部に接続されると、前記一方のコントローラの有する前記プログラム記憶部に記憶されている前記所定のプログラムを更新させる請求項１に記載の記憶制御装置。
【請求項６】
前記更新制御部は、前記所定のプログラムの更新が完了した場合、前記一方のコントローラの有する前記データ記憶部の記憶内容と前記他方のコントローラの有する前記データ記憶部の記憶内容とを再同期させてから、前記処理経路切替部によって、前記一方のコントローラの有する前記上位通信制御部を前記一方のコントローラの有する前記アクセス要求処理部に再接続させる請求項５に記載の記憶制御装置。
【請求項７】
前記処理経路切替部及び前記更新制御部は、前記所定のプログラムの更新が行われる前記一方のコントローラ内で作動する請求項１に記載の記憶制御装置。
【請求項８】
前記所定のプログラムを更新させるために使用される更新用プログラムを記憶するための更新用プログラム記憶部を備えた請求項１に記載の記憶制御装置。
【請求項９】
前記更新制御部は、更新実行を指示された場合に、前記所定のプログラムを更新させる請求項１に記載の記憶制御装置。
【請求項１０】
前記更新制御部は、更新実行を指示された場合に、前記処理経路切替部によって、前記一方のコントローラの有する前記上位通信制御部を前記相互通信経路を介して前記他方のコントローラの有する前記アクセス要求処理部に接続させてから、前記所定のプログラムを更新させるために使用される更新用プログラムを受信して記憶する請求項１に記載の記憶制御装置。
【請求項１１】
前記更新制御部は、更新実行を指示された場合に、前記処理経路切替部によって、前記一方のコントローラの有する前記上位通信制御部を前記相互通信経路を介して前記他方のコントローラの有する前記アクセス要求処理部に接続させるよりも前に、前記所定のプログラムを更新させるために使用される更新用プログラムを受信して記憶する請求項１に記載の記憶制御装置。
【請求項１２】
前記更新制御部は、前記所定のプログラムを更新させるための更新用プログラムに設定されている優先度が所定の閾値よりも高い場合、直ちに前記所定のプログラムを更新させ、前記更新用プログラムに設定されている優先度が前記所定の閾値以下の場合には、前記各コントローラの状況に基づいて、前記所定のプログラムを更新させる請求項１に記載の記憶制御装置。
【請求項１３】
前記更新制御部は、前記上位装置または前記上位装置とは別の管理装置から、更新実行を指示される請求項１に記載の記憶制御装置。
【請求項１４】
前記相互通信経路は、前記各コントローラが設けられている筐体内に設けられている請求項１に記載の記憶制御装置。
【請求項１５】
アクセス要求を発行する上位装置と、この上位装置にデータ入出力用ネットワークを介して接続される記憶制御装置と、この記憶制御装置と管理用ネットワークを介して接続される管理装置とを備えたストレージシステムであって、
前記記憶制御装置は、相互通信経路によって接続される複数のコントローラと、これら複数のコントローラにそれぞれ接続される記憶デバイスとを備えており、
（１）前記各コントローラは、
前記上位装置との間で通信を行うための上位通信回路と、
前記記憶デバイスとの間で通信を行うための下位通信回路と、
前記上位通信回路を介して前記上位装置からのアクセス要求が受信された場合、前記下位通信回路を介して前記記憶デバイスにアクセスし、所定のデータ処理を実行するプロセッサと、
前記所定のデータ処理に使用されるデータを記憶するデータメモリと、
前記上位通信回路と前記下位通信回路と前記データメモリと前記プロセッサとを接続するためのバスと、
前記上位通信回路と前記プロセッサとの間に位置して前記バス上に設けられ、通常モードが指示された場合に、同一コントローラ内の前記上位通信回路と前記プロセッサとを接続し、更新モードが指示された場合に、切替元のコントローラ内の前記上位通信回路を前記相互通信経路を介して切替先のコントローラ内の前記プロセッサに接続させるためのバス切替スイッチと、
をそれぞれ備えており、かつ、
（２）前記切替元のコントローラの有する前記プロセッサは、前記管理装置または前記上位装置から更新実行を指示を受信した場合に、当該プロセッサにより使用される所定のプログラムを更新させるための更新制御部を作動させ、
（３）前記更新制御部は、
（3-1）前記切替元のコントローラの有する前記データメモリの記憶内容と前記切替先のコントローラの有する前記データメモリの記憶内容とを同期させるステップと、
（3-2）前記バス切替スイッチを前記通常モードから前記更新モードに切り替えさせるステップと、
（3-3）前記管理装置または前記上位装置から受信した更新用プログラムによって、前記所定のプログラムを更新させるステップと、
（3-4）前記所定のプログラムの更新が完了した場合には、前記切替先のコントローラの有する前記データメモリの記憶内容を前記切替元のコントローラの有する前記データメモリにコピーし、両方の記憶内容を再同期させるステップと、
（3-5）前記再同期が完了した場合には、前記バス切替スイッチを前記更新モードから前記通常モードに切り替えさせるステップと、
を実行するようになっているストレージシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、記憶制御装置及びストレージシステムに関する。
【背景技術】
【０００２】
記憶制御装置は、マイクロコンピュータを利用するコンピュータ装置であるため、プログラムの更新を必要とする場合がある。ホストコンピュータ（以下、「ホスト」）からのアクセス要求をいったん停止させることができれば、簡単にプログラムを更新することができる。しかし、記憶制御装置には、２４時間３６５日の連続稼働が求められるため、プログラム更新のために、記憶制御装置を停止させることはできない。
【０００３】
そこで、ホストからのアクセス要求を停止させることなく、即ち、記憶制御装置を停止させることなく、記憶制御装置内のプログラムを更新させるための技術も提案されている（特許文献１）。
【特許文献１】特開２００５−２４２５７４号公報
【発明の開示】
【発明が解決しようとする課題】
【０００４】
前記文献に記載の従来技術では、クラスタ構成を採用し、ホストと記憶制御装置との間に冗長パスを設定する。これにより、一方のクラスタから他方のクラスタにファイルオーバを行った後、一方のクラスタのプログラムを更新する。従って、この従来方法によれば、記憶制御装置を停止させることなく、プログラムを更新することができる。
【０００５】
しかし、この従来方法では、ホストと記憶制御装置との間に冗長パスを設定し、記憶制御装置にクラスタ構成を設け、かつ、通常のパスから冗長パスへ切り替えるためのパス制御ソフトウェア等をホストに実装する必要がある。このため、構成が複雑化し、コストも増大する。
【０００６】
本発明は、上記の問題点に鑑みてなされたもので、その目的は、上位装置に意識させることなく、より簡易な構成で、プログラムを更新することができるようにした記憶制御装置及びストレージシステムを提供することにある。本発明の更なる目的は、後述する実施の形態の記載から明らかになるであろう。
【課題を解決するための手段】
【０００７】
上記課題を解決すべく、本発明に従う記憶制御装置は、複数のコントローラを備えた記憶制御装置であって、各コントローラは、上位装置との間で通信を行うための上位通信制御部と、記憶デバイスとの間で通信を行うための下位通信制御部と、所定のプログラムを記憶するプログラム記憶部と、上位通信制御部を介して上位装置からのアクセス要求が受信された場合、下位通信制御部を介して記憶デバイスにアクセスし、所定のプログラムに基づいて所定のデータ処理を実行することにより、アクセス要求を処理するアクセス要求処理部と、所定のデータ処理に使用されるデータを記憶するデータ記憶部と、をそれぞれ備えており、かつ、各コントローラ間を接続するための相互通信経路と、プログラム記憶部に記憶されている所定のプログラムを更新させるための更新制御部と、更新制御部からの指示に基づいて、各コントローラのうち一方のコントローラの上位通信制御部を、相互通信経路によって、各コントローラのうち他方のコントローラのアクセス要求処理部に接続させることにより、一方のコントローラの上位通信制御部により受信されるアクセス要求を、他方のコントローラのアクセス要求処理部によって処理させる処理経路切替部と、を備える。
【０００８】
本発明の実施形態では、処理経路切替部は、（１）通常の場合に、各コントローラ内において、上位通信制御部とアクセス要求処理部とをそれぞれ接続させる通常モードと、（２）所定のプログラムを更新する場合に、一方のコントローラの上位通信制御部を、相互通信経路を介して、他方のコントローラのアクセス要求処理部に接続させる更新モードと、とを切替可能となっている。
【０００９】
本発明の実施形態では、一方のコントローラの有するデータ記憶部の記憶内容と他方のコントローラの有するデータ記憶部の記憶内容とを同期させるデータ同期部を備える。
【００１０】
本発明の実施形態では、更新制御部は、一方のコントローラの有するデータ記憶部の記憶内容と他方のコントローラの有するデータ記憶部の記憶内容とが同期された場合に、処理経路切替部によって、一方のコントローラの有する上位通信制御部と他方のコントローラの有するアクセス要求処理部とを相互通信経路を介して接続させる。
【００１１】
本発明の実施形態では、更新制御部は、処理経路切替部によって、一方のコントローラの有する上位通信制御部が相互通信経路を介して他方のコントローラの有するアクセス要求処理部に接続されると、一方のコントローラの有するプログラム記憶部に記憶されている所定のプログラムを更新させる。
【００１２】
本発明の実施形態では、更新制御部は、所定のプログラムの更新が完了した場合、一方のコントローラの有するデータ記憶部の記憶内容と他方のコントローラの有するデータ記憶部の記憶内容とを再同期させてから、処理経路切替部によって、一方のコントローラの有する上位通信制御部を一方のコントローラの有するアクセス要求処理部に再接続させるようになっている。
【００１３】
本発明の実施形態では、処理経路切替部及び更新制御部は、所定のプログラムの更新が行われる一方のコントローラ内で作動する。
【００１４】
本発明の実施形態では、所定のプログラムを更新させるために使用される更新用プログラムを記憶するための更新用プログラム記憶部を備える。
【００１５】
本発明の実施形態では、更新制御部は、更新実行を指示された場合に、所定のプログラムを更新させる。
【００１６】
本発明の実施形態では、更新制御部は、更新実行を指示された場合に、処理経路切替部によって、一方のコントローラの有する上位通信制御部を相互通信経路を介して他方のコントローラの有するアクセス要求処理部に接続させてから、所定のプログラムを更新させるために使用される更新用プログラムを受信して記憶する。
【００１７】
本発明の実施形態では、更新制御部は、更新実行を指示された場合に、処理経路切替部によって、一方のコントローラの有する上位通信制御部を相互通信経路を介して他方のコントローラの有するアクセス要求処理部に接続させるよりも前に、所定のプログラムを更新させるために使用される更新用プログラムを受信して記憶する。
【００１８】
本発明の実施形態では、更新制御部は、所定のプログラムを更新させるための更新用プログラムに設定されている優先度が所定の閾値よりも高い場合、直ちに所定のプログラムを更新させ、更新用プログラムに設定されている優先度が所定の閾値以下の場合には、各コントローラの状況に基づいて、所定のプログラムを更新させる。
【００１９】
本発明の実施形態では、更新制御部は、上位装置または上位装置とは別の管理装置から、更新実行を指示される。
【００２０】
本発明の実施形態では、相互通信経路は、各コントローラが設けられている筐体内に設けられている。
【００２１】
本発明の他の観点に従うストレージシステムは、アクセス要求を発行する上位装置と、この上位装置にデータ入出力用ネットワークを介して接続される記憶制御装置と、この記憶制御装置と管理用ネットワークを介して接続される管理装置とを備えたストレージシステムであって、記憶制御装置は、相互通信経路によって接続される複数のコントローラと、これら複数のコントローラにそれぞれ接続される記憶デバイスとを備えている。
【００２２】
（１）各コントローラは、上位装置との間で通信を行うための上位通信回路と、記憶デバイスとの間で通信を行うための下位通信回路と、上位通信回路を介して上位装置からのアクセス要求が受信された場合、下位通信回路を介して記憶デバイスにアクセスし、所定のデータ処理を実行するプロセッサと、所定のデータ処理に使用されるデータを記憶するデータメモリと、上位通信回路と下位通信回路とデータメモリとプロセッサとを接続するためのバスと、上位通信回路とプロセッサとの間に位置してバス上に設けられ、通常モードが指示された場合に、同一コントローラ内の上位通信回路とプロセッサとを接続し、更新モードが指示された場合に、切替元のコントローラ内の上位通信回路を相互通信経路を介して切替先のコントローラ内のプロセッサに接続させるためのバス切替スイッチと、をそれぞれ備えている。かつ、
【００２３】
（２）切替元のコントローラの有するプロセッサは、管理装置または上位装置から更新実行を指示を受信した場合に、当該プロセッサにより使用される所定のプログラムを更新させるための更新制御部を作動させる。そして、
【００２４】
（３）更新制御部は、（3-1）切替元のコントローラの有するデータメモリの記憶内容と切替先のコントローラの有するデータメモリの記憶内容とを同期させるステップと、（3-2）バス切替スイッチを通常モードから更新モードに切り替えさせるステップと、（3-3）管理装置または上位装置から受信した更新用プログラムによって、所定のプログラムを更新させるステップと、（3-4）所定のプログラムの更新が完了した場合には、切替先のコントローラの有するデータメモリの記憶内容を切替元のコントローラの有するデータメモリにコピーし、両方の記憶内容を再同期させるステップと、（3-5）再同期が完了した場合には、バス切替スイッチを更新モードから通常モードに切り替えさせるステップと、を実行するようになっている。
【００２５】
本発明の各手段、各部、各ステップの少なくとも一部は、コンピュータプログラムによって実行可能な場合がある。そして、このコンピュータプログラムは、各種記録媒体に固定された状態で配布したり、あるいは、通信媒体を介して送信することができる。
【発明を実施するための最良の形態】
【００２６】
以下、図面に基づき、本発明の実施形態を説明する。本実施形態では、以下に述べるように、一方のコントローラ側でプログラムを更新する場合に、ホストからのアクセス要求を処理するための所定の機能のみを一時的に停止させて、アクセス要求の処理を他方のコントローラに代行させる。そして、一方のコントローラ（更新対象のコントローラ）で、処理経路の切替等を制御する。
【００２７】
まず、図１は、本実施形態によるストレージシステムの全体構成を模式的に示す説明図である。このストレージシステムは、例えば、記憶制御装置１と、記憶部３と、ホスト５と、管理端末６とを備えて構成することができる。
【００２８】
記憶制御装置１は、ホスト５によって利用されるデータを記憶する。記憶制御装置１は、通信ネットワークCN１を介して、ホスト５に接続されている。通信ネットワークCN１としては、例えば、LAN（Local Area Network）やSAN（Storage Area Network）等を用いることができる。また、SANの場合は、TCP/IP（Transmission Control Protocol/Internet Protocol）等を利用可能なIP_SANと、FCP（Fibre Channel Protocol）を利用するFC_SANのいずれを用いることもできる。なお、ホスト５に記憶制御装置１を直接的に接続し、記憶制御装置１をいわゆるDAS（Direct Attached Storage）として構成してもよい。
【００２９】
記憶制御装置１は、通信ネットワークCN２を介して、記憶部３に接続されている。この通信ネットワークCN２としては、例えば、SAN等を利用できる。記憶部３は、例えば、アレイ状に配設された複数のディスクドライブ４Ａ，４Ｂを備えている。これらのディスクドライブ４Ａ，４Ｂは、例えば、ハードディスクドライブや半導体メモリドライブ等のように構成可能である。ここで、ブートディスク４Ａには、例えば、OS（Operating System）等のプログラムが記憶されている。更新用ディスク４Ｂには、更新用のプログラムを記憶させることができる。
【００３０】
ここで、１つまたは複数のディスクドライブによって物理的記憶デバイスが構成され、この物理的記憶デバイスの記憶領域上に、論理ボリュームが設定される。この論理ボリュームは、ホスト５のアクセス対象となる。論理ボリュームは、論理的記憶デバイスと呼ぶことができる。論理ボリュームには、ホスト５によって使用されるユーザデータが記憶される。
【００３１】
ホスト５は、例えば、パーソナルコンピュータ、サーバコンピュータ等のように構成されるコンピュータ装置である。ホスト５は、記憶制御装置１によって管理されているデータ群を利用するためのアプリケーションプログラムを備えている。
【００３２】
管理端末６は、例えば、パーソナルコンピュータや携帯情報端末等のように構成されるコンピュータ装置である。管理端末６は、管理用の通信ネットワークCN３を介して、ホスト５及び記憶制御装置１にそれぞれ接続されている。管理端末６は、プログラムの更新を記憶制御装置１に指示するための更新指示部６Ａを備えている。
【００３３】
記憶制御装置１の構成を説明する。記憶制御装置１は、複数のコントローラ２Ａ，２Ｂを備えている。各コントローラ２Ａ，２Ｂは、同一の構成を備えている。但し、説明の便宜上、図１では、プログラム更新の仕組みを説明するために、更新制御部８を一方のコントローラ２Ａのみに示している。
【００３４】
一方のコントローラ２Ａは、例えば、上位インターフェース（以下「I/F」）部２Ａ１と、下位I/F部２Ａ２と、アクセス要求処理部２Ａ３と、プログラムメモリ２Ａ４と、データメモリ２Ａ５と、更新制御部８とを備えている。
【００３５】
上位I/F部２Ａ１は、「上位通信制御部」または「上位通信回路」に該当する。上位I/F部２Ａ１は、通信ネットワークCN１を介して、ホスト５に接続されている。上位I/F部２Ａ１は、ホスト５との間の通信を行う。
【００３６】
下位I/F部２Ａ２は、「下位通信制御部」または「下位通信回路」に該当する。下位I/F部２Ａ２は、通信ネットワークCN２を介して、記憶部３に接続されている。下位I/F部２Ａ２は、記憶部３との間の通信を行う。
【００３７】
アクセス要求処理部２Ａ３は、例えば、CPU（Central Processing Unit）等から構成されており、ホスト５からのアクセス要求に応じて、所定のデータ処理を行う。アクセス要求には、例えば、リード要求とライト要求とが含まれる。ホスト５からリード要求が発行された場合、アクセス要求処理部２Ａ３は、ホスト５の要求するデータを記憶部３から読出して、このデータをホスト５に送信させる。ホスト５からライト要求が発行された場合、アクセス要求処理部２Ａ３は、ホスト５から受信したライトデータを、記憶部３に記憶させる。これらのアクセス要求を処理するときに、アクセス要求処理部２Ａ３は、論理ブロックアドレスとディスクドライブの物理アドレスとの変換等を行う。
【００３８】
プログラムメモリ２Ａ４は、例えば、フラッシュメモリ、RAM（Random Access Memory）、ROM（Read Only Memory）等から構成される。プログラムメモリ２Ａ４は、単独で、あるいは更新用ディスク４Ｂと共に、「プログラム記憶部」に該当する。プログラムメモリ２Ａ４には、例えば、BIOS（Basic Input / Output System）のようなプログラムを記憶させることができる。
【００３９】
データメモリ２Ａ５は、「データ記憶部」に該当する。データメモリ２Ａ５は、例えば、RAM等から構成される。データメモリ２Ａ５には、例えば、ホスト５から読み出されたデータや書き込まれたデータ（これらをユーザデータと呼ぶ）が記憶される。また、データメモリ２Ａ５には、例えば、ホスト５と論理ボリュームとの接続関係を管理するための情報、論理ボリュームを管理するための情報、ディスクドライブを管理するための情報等のよ各種制御情報も記憶されている。
【００４０】
他方のコントローラ２Ｂも、前記コントローラ２Ａと同様に、例えば、上位I/F部部２Ｂ１と、下位I/F部２Ｂ２と、アクセス要求処理部２Ｂ３と、プログラムメモリ２Ｂ４と、データメモリ２Ｂ５とを備えている。これら２Ｂ１〜２Ｂ５は、上述した２Ａ１〜２Ａ５と同様であるので、重複した説明を省略する。
【００４１】
接続制御部７は、各コントローラ２Ａ，２Ｂ間の接続状態を制御するものである。接続制御部７は、例えば、各コントローラ２Ａ，２Ｂ内にそれぞれ１つずつ設けられた切替スイッチ７Ａ，７Ｂと、各切替スイッチ７Ａ，７Ｂ間を接続する相互通信経路７Ｃ，７Ｄとを備えて構成されている。ここで、切替スイッチ７Ａ，７Ｂまたは接続制御部７は、「処理経路切替部」に該当する。
【００４２】
接続制御部７は、通常モードと更新モードとの複数種類のモードを備えている。通常モードの場合、接続制御部７は、同一のコントローラ内の上位I/F部とアクセス要求処理部とを接続させる。即ち、上位I/F部２Ａ１とアクセス要求処理部２Ａ３、上位I/F部２Ｂ１とアクセス要求処理部２Ｂ３とが、それぞれ接続される。図１に示す例では、ポートＣ１とポートＢ１とが接続されることにより、上位I/F２部Ａ１とアクセス要求処理部２Ａ３とが接続され、同様に、ポートＣ２とポートＢ２とが接続されることにより、上位I/F部２Ｂ１とアクセス要求処理部２Ｂ３とが接続される。なお、図１では、プログラム更新時に処理経路が切り替わる様子を容易に理解できるように、接続制御部７の構成例を模式的に示してある。
【００４３】
これに対し、更新モードの場合、接続制御部７は、一方のコントローラ内の上位I/F部を他方のコントローラ内のアクセス要求処理部に接続させる。例えば、コントローラ２Ａ側でプログラムの更新を行う場合、接続制御部７は、更新対象のコントローラ２Ａ内の上位I/F部２Ａ１を、コントローラ２Ｂ内のアクセス要求処理部２Ｂ３に接続させる。同様に、コントローラ２Ｂ側でプログラムの更新を行う場合、接続制御部７は、更新対象のコントローラ２Ｂ内の上位I/F部２Ｂ１を、コントローラ２Ａ内のアクセス要求処理部２Ａ３に接続させる。図１に示す例では、切替スイッチ７Ａが反転してポートＣ１とポートＡ１とが接続されると、上位I/F部２Ａ１は、相互通信経路７ＣとポートＣ２及びポートＢ２を介して、アクセス要求処理部２Ｂ３に接続される。同様に、切替スイッチ７Ｂが反転してポートＣ２とポートＡ２とが接続されると、上位I/F部２Ｂ１は、相互通信経路７ＤとポートＣ１及びポートＢ１を介して、アクセス要求処理部２Ａ３に接続される。
【００４４】
更新制御部８は、管理端末６からプログラムの更新実行を指示されると、更新対象のコントローラ内で起動する。更新制御部８は、接続制御部７に指示を与えることにより、上位I/F部２Ａ１を他方のコントローラ２Ｂ内のアクセス要求処理部２Ｂ３に接続させた後、プログラムメモリ２Ａ４またはブートディスク４Ａに記憶されているプログラムを更新させる。いずれのプログラムを更新させるかは、管理端末６からの指示に依存する。そして、更新が完了すると、更新制御部８は、接続制御部７を更新モードから通常モードに復帰させ、上位I/F部２Ａ１を更新後のアクセス要求処理部２Ａ３に再接続させる。
【００４５】
接続制御部７が通常モードから更新モードに移行する場合、及び更新モードから通常モードに復帰する場合の両方において、更新制御部８は、各データメモリ２Ａ５，２Ｂ５にそれぞれ記憶されている内容を一致させる。即ち、コントローラ２Ａの上位I/F部２Ａ１をコントローラ２Ｂのアクセス要求処理部２Ｂ３に接続させる前に、データメモリ２Ａ５の記憶内容をデータメモリ２Ｂ５にコピーさせる。これにより、アクセス要求処理部２Ｂ３は、アクセス要求処理部２Ａ３に代わって、ホスト５からのアクセス要求を引き続き処理することができる。
【００４６】
アクセス要求処理部２Ｂ３がアクセス要求の処理を代行している間に、コントローラ２Ａ側のプログラム更新が完了する。更新制御部８は、上位I/F部２Ａ１をコントローラ２Ａ内のアクセス要求処理部２Ａ３に再接続させる前に、データメモリ２Ｂ５の記憶内容をデータメモリ２Ａ５にコピーさせる。これにより、アクセス要求処理部２Ａ３は、ホスト５からのアクセス要求を再び処理することができる。
【００４７】
コントローラ２Ａ側のプログラムを更新させた後、引き続いて、コントローラ２Ｂ側のプログラムを更新させる。この方法は、上記同様であるため、説明を省略する。
【００４８】
本実施形態は上述のように構成されるため、比較的簡易かつ低コストに、ストレージサービスの提供を中断することなく、プログラムを更新することができる。即ち、本実施形態では、従来技術のように、ホスト５と記憶制御装置１との間に冗長パスを設定したり、ホスト５にパス切替ソフトウェアを実装等する必要ない。従って、本実施形態では、ホスト５側に負担をかけることなく、記憶制御装置１のプログラムを更新することができ、使い勝手も向上する。以下、本実施形態を詳細に説明する。
【実施例１】
【００４９】
図２は、本実施例によるストレージシステムの全体構成を示す説明図である。このストレージシステムは、例えば、記憶制御装置１００と、ホスト１０と、管理端末２０とを備えて構成される。記憶制御装置１００は、図１中の記憶制御装置１に対応する。また、ホスト１０は、図１中のホスト５に、管理端末２０は、図１中の管理端末６に、それぞれ対応する。
【００５０】
ホスト１０は、例えば、パーソナルコンピュータ、サーバコンピュータ、メインフレーム、エンジニアリングワークステーション等のようなコンピュータ装置である。ホスト１０は、例えば、HBA（Host Bus Adapter）やネットワークカードのように構成される通信I/F１１と、アプリケーションプログラム１２とを備えている。これら以外に、例えば、OSやユーザインターフェース等も備えているが、説明を割愛する。I/F１１は、例えば、SAN等の通信ネットワークCN１１を介して、記憶制御装置１００に接続される。アプリケーションプログラム１２は、I/F１１を介して、記憶制御装置１００にアクセスし、記憶制御装置１００に記憶されているデータ（ユーザデータ）を利用する。
【００５１】
管理端末２０は、ストレージシステム全体の構成等を管理する。管理端末２０は、例えば、LAN等の管理用ネットワークCN１３を介して、ホスト１０及び記憶制御装置１００にそれぞれ接続されている。より詳しくは、管理端末２０は、管理用ネットワークCN１３を介して、記憶制御装置１００内の各コントローラ２００Ａ，２００Ｂにそれぞれ接続されている。管理端末２０は、新プログラム記憶部２１及び更新指示部２２を備えている。
【００５２】
新プログラム記憶部２１は、更新用のプログラムを記憶するためのものである。更新用プログラムを、ここでは便宜上「新プログラム」と呼び、更新されるプログラムを「旧プログラム」と呼ぶ場合がある。新プログラム記憶部２１は、例えば、半導体メモリ装置やハードディスク装置のように構成することができる。
【００５３】
更新指示部２２は、記憶制御装置１００にプログラムの更新を指示するものである。後述のように、更新指示部２２は、更新の実行を指示すると共に、新プログラム記憶部２１から読出した更新用のプログラムを記憶制御装置１００に転送する。
【００５４】
記憶制御装置１００の構成を説明する。記憶制御装置１００は、互いに相手をバックアップ可能な関係に立つ複数のコントローラ２００Ａ，２００Ｂと、記憶部３００とを備えている。
【００５５】
コントローラ２００Ａ，２００Ｂは、基本的に同一の構成を備えているので、一方のコントローラ２００Ａを中心的に説明する。各コントローラ２００Ａ，２００Ｂは、図１中のコントローラ２Ａ，２Ｂに対応する。なお、コントローラ２００Ａ，２００Ｂの両方を、それぞれホスト１０に接続することができるが、本発明の理解のために、コントローラ２００Ａのみをホスト１０に接続するかのようにして示してある。
【００５６】
コントローラ２００Ａ（図中「CTL#0」）は、例えば、ホスト側I/F部２１０Ａと、デスク側I/F部２２０Ａと、プロセッサ（図中「CPU」）２３０Ａと、メモリ２４０Ａと、キャッシュメモリ（図中「CM」）２５０Ａと、データ転送制御回路（図中「D_CTL」）２６０Ａとを備えて構成されている。
【００５７】
ホスト側I/F部２１０Ａは、図１中の上位I/F部２Ａ１に対応する。このホスト側I/F部２１０Ａは、ホスト１０のI/F１１と通信ネットワークCN１１を介して接続されている。ホスト側I/F部２１０Ａは、ホスト１０から発行されたアクセス要求を受信し、また、ホスト１０にデータ処理の結果を送信する。
【００５８】
ディスク側I/F部２２０Ａは、図１中の下位I/F部２Ａ２に対応する。下位I/F部２２０Ａは、SAN等の通信ネットワークCN１２を介して、記憶部３００の各ディスクドライブ３１０にそれぞれ接続されている。ディスク側I/F部２２０Ａは、記憶部３００からデータを読出したり、記憶部３００にデータを書込む。
【００５９】
プロセッサ２３０Ａは、図１中のアクセス要求処理部２Ａ３に対応する。また、プロセッサ２３０Ａは、図１中の更新制御部８及び接続制御部７の少なくとも一部を、それぞれ実現する。プロセッサ２３０Ａは、メモリ２４０Ａ内に記憶されたプログラムを読み込んで実行することにより、アクセス要求に応じたデータ処理を行う。また、プロセッサ２３０Ａは、後述の更新制御処理等を行う。
【００６０】
メモリ２４０Ａは、図１中のプログラムメモリ２Ａ４に対応する。メモリ２４０Ａは、例えば、フラッシュメモリ、ROM、RAM等から構成される。メモリ２４０Ａには、例えば、BIOS等のような各種プログラム等が記憶される。
【００６１】
キャッシュメモリ２５０Ａは、図１中のデータメモリ２Ａ５に対応する。キャッシュメモリ２５０Ａは、例えば、不揮発性半導体メモリから構成される。キャッシュメモリ２５０Ａは、バッテリ電源からの電力によってバックアップされている。従って、記憶制御装置１００の主電源が停止した場合でも、バッテリ電源によってバックアップされている期間中は、キャッシュメモリ２５０Ａの記憶内容は失われない。後述のように、キャッシュメモリ２５０Ａには、ユーザデータ及び制御情報が記憶される。また、キャッシュメモリ２５０Ａは、相手方コントローラ２００Ｂ内のキャッシュメモリ２５０Ｂと、同一の記憶内容を保持する。即ち、各キャッシュメモリ２５０Ａ，２５０Ｂの記憶内容は、同期されている。
【００６２】
データ転送制御回路２６０Ａは、各I/F部２１０Ａ，２２０Ａと、プロセッサ２３０Ａと、キャッシュメモリ２５０Ａとの間のデータ転送を制御する。データ転送制御回路２６０Ａの詳細は、さらに後述する。
【００６３】
他方のコントローラ２００Ｂ（図中「CTL#1」）も、一方のコントローラ２００Ａと同様に、ホスト側I/F部２１０Ｂと、デスク側I/F部２２０Ｂと、プロセッサ２３０Ｂと、メモリ２４０Ｂと、キャッシュメモリ２５０Ｂと、データ転送制御回路２６０Ｂとを備えて構成される。
【００６４】
そして、一方のデータ転送制御回路２６０Ａと他方のデータ転送制御回路２６０Ｂとの間には、相互通信経路４００が設けられている。相互通信経路４００は、各コントローラ２００Ａ，２００Ｂ間を接続するバスとして構成される。各データ転送制御回路２６０Ａ，２６０Ｂは、相互通信経路４００を介して、データを交換可能である。
【００６５】
記憶部３００は、図１中の記憶部３に対応する。記憶部３００は、例えば、アレイ状に配設された複数のディスクドライブ３１０を備えて構成することができる。ディスクドライブ３１０としては、例えば、ハードディスクドライブ、半導体メモリドライブ、光ディスクドライブ、光磁気ディスクドライブ、磁気テープドライブ等の種々の記憶デバイスを用いることができる。
【００６６】
また、ハードディスクドライブを使用する場合、例えば、FC（Fibre Channel）ディスク、SATA（Serial AT Attachment）ディスク、SCSI（Small Computer System Interface）ディスクのように、種々の種類のハードディスクドライブを利用可能である。また、記憶部３００内に、異なる種類の記憶デバイスを混在させることもできる。
【００６７】
図３は、キャッシュメモリ２５０Ａ，２５０Ｂの記憶構成を模式的に示す。上述のように、この記憶制御装置１００は、デュアルコントローラ構造を採用し、かつ、複数のキャッシュメモリ２５０Ａ，２５０Ｂによって、ユーザデータ及び制御情報を冗長記憶するようになっている。
【００６８】
一方のキャッシュメモリ２５０Ａには、コントローラ２００Ａで管理されるユーザデータと、コントローラ２００Ｂで管理されるユーザデータと、制御情報とが、それぞれ記憶される。同様に、他方のキャッシュメモリ２５０Ｂには、コントローラ２００Ｂで管理されるユーザデータと、コントローラ２００Ａで管理されるユーザデータと、制御情報とが、それぞれ記憶される。なお、キャッシュメモリ２５０Ａ，２５０Ｂ間の同期処理は、必要に応じて行うことができ、同期処理を解除することも可能である。
【００６９】
このように、ユーザデータ及び制御情報を各キャッシュメモリ２５０Ａ，２５０Ｂによって冗長記憶するため、例えば、万が一、一方のキャッシュメモリの記憶内容が失われた場合でも、他方のキャッシュメモリの記憶内容を用いることにより、整合性のあるデータ処理を継続することができる。また、他方のキャッシュメモリの記憶内容を、一方のキャッシュメモリにコピーさせることにより、一方のキャッシュメモリの記憶内容を復元することができる。
【００７０】
図４は、メモリ２４０Ａ，２４０Ｂ及び記憶部３００の記憶構成例を示す。なお、以下の説明では、コントローラ２００Ａ，２００Ｂを特に区別しない場合、符号に添える「Ａ」，「Ｂ」を省略する。従って、図４中では、メモリ２４０として示す。
【００７１】
メモリ２４０は、例えば、プログラムメモリ２４１と、RAM２４２を備える。プログラムメモリ２４１は、例えば、フラッシュメモリ等のように、書換可能な不揮発性半導体メモリとして構成される。プログラムメモリ２４１には、例えば、BIOSやIPL（Initial Program Loader）等のような基礎的な制御プログラムＰ１０が記憶される。RAM２４２は、例えば、揮発性の半導体メモリとして構成される。RAM２４２には、ブートディスク３１１から読み込まれるOS（Ｐ２０）が記憶される。
【００７２】
記憶部３００は、上述のように複数のディスクドライブ３１０を備えている。ここでは、各ディスクドライブ３１０のうち、OSを記憶するディスクドライブをブートディスク３１１と呼ぶ。また、空いているディスクドライブを空きディスク３１２と呼ぶ。
【００７３】
空きディスク３１２には、プログラム更新に使用される新たなプログラムＰ１１，Ｐ２１を記憶させることができる。また、空きディスク３１２を、新たなブートディスクに設定することにより、空きディスク３１２に記憶されたOS（Ｐ２１）をRAM２４２に読み込んで起動させることもできる。
【００７４】
図４の下側に示すように、例えば、４台や８台等の所定数のディスクドライブ３１０によって、１つのグループが構成される。このグループをRAIDグループ（パリティグループ）３２０と呼ぶ。RAIDグループ３２０に参加する各ディスクドライブ３１０は、それぞれ物理的な記憶領域を提供し、これら物理的な記憶領域の集合体が形成される。従って、RAIDグループ３２０は、物理的記憶デバイスと呼ぶことができる。RAIDレベルによっても相違するが、グループ３２０に参加する各ディスクドライブ３１０のうち、一つまたは複数のディスクドライブ３１０は、パリティデータの格納に使用される。
【００７５】
RAIDグループ３２０の物理的記憶領域には、一つまたは複数の論理ボリューム３３０を設定することができる。論理ボリューム３３０は、上位I/F部２１０の有する通信ポートに割り当てられ、ホスト１０からのアクセス対象となる。論理ボリューム３３０は、論理的記憶デバイスと呼ぶことができる。上述したブートディスク３１１及び空きディスク３１２は、それぞれ物理的なディスクドライブ３１０として構成することもできるし、論理ボリューム３３０として構成することもできる。
【００７６】
図５は、データ転送制御回路２６０の詳細を示すブロック図である。各データ転送制御回路２６０Ａ，２６０Ｂは、同一構造を備える。そこで、一方のデータ転送制御回路２６０Ａについて説明すると、このデータ転送制御回路２６０Ａは、ホスト側内部バスバッファ２６１と、ディスク側内部バスバッファ２６２と、プロセッサ側内部バスバッファ２６３と、相互通信経路制御部２６４と、キャッシュ制御部２６５と、バススイッチ２６６と、各バス４０１，４０２，４０３，４０４を備えている。
【００７７】
そして、ホスト側内部バスバッファ２６１とバススイッチ２６６とは、ホスト側内部バス４０１によって接続されており、ディスク側内部バスバッファ２６２とバススイッチ２６６との間はディスク側内部バス４０２によって接続されている。即ち、ホスト側内部バスバッファ２６１とディスク側内部バスバッファ２６２とを結ぶ内部バスバッファ上に、バススイッチ２６６が設けられている。
【００７８】
相互通信経路制御部２６４は、相互通信経路４００を介してデータ転送を行うためのものである。相互通信経路制御部２６４は、バススイッチ２６６及びキャッシュ制御部２６５にそれぞれ接続されている。そして、キャッシュ制御部２６５は、キャッシュバス４０３を介して、キャッシュメモリ２５０Ａに接続されている。
【００７９】
キャッシュ制御部２６５は、キャッシュメモリ２５０Ａへのデータの入出力を制御するものである。キャッシュ制御部２６５は、相互通信経路制御部２６４及び相互通信経路４００を介して、他方のコントローラ２００Ｂのキャッシュ制御部２６５とデータを交換することができる。これにより、各キャッシュメモリ２５０Ａ，２５０Ｂ間の記憶内容が同期される。
【００８０】
バススイッチ２６６は、経路切替を指示されると、内部バス４０１をコントローラ２００Ａから切り離し、内部バス４０１を相互通信経路制御部２６４及び相互通信経路４００を介して、他方のコントローラ２００Ｂに接続させるものである。
【００８１】
図６は、通常状態（通常モード）におけるバススイッチ（図中「B_SW」）２６６の状態を示す。通常の場合とは、プログラムの更新制御処理を行わない場合である。通常モードでは、バススイッチ２６６は、ホスト側内部バス４０１とディスク側内部バス４０２とを接続させる。これにより、各コントローラ２００Ａ，２００Ｂ内において、ホスト側I/F部２１０は、プロセッサ２３０に接続される。換言すれば、バススイッチ２６６が通常モードの場合、ホスト側I/F部２１０とホスト側内部バスバッファ２６１及びホスト側内部バス４０１は、それぞれが設けられているコントローラの制御下に置かれている。
【００８２】
図７は、一方のコントローラ２００Ａのバススイッチ２６６を更新モードに切り替えた場合のブロック図である。更新モードとは、プログラムの更新を行う場合である。更新モードは、例えば、接続先切替モードと呼ぶこともできる。
【００８３】
コントローラ２００Ａ側のプログラムを更新する場合、プロセッサ２３０Ａは、プログラム更新に先立って、コントローラ２００Ａ内のバススイッチ２６６に指示を出す。この指示は、通常モードから更新モードへの移行を要求するものである。この指示に基づいて、バススイッチ２６６は、ホスト側内部バス４０１の接続先を、ディスク側内部バス４０２から相互通信経路４００に切り替える。
【００８４】
これにより、ホスト側内部バス４０１は、相互通信経路４００等を介して、他方のコントローラ２００Ｂ内の内部バス４０１，４０２に接続される。従って、コントローラ２００Ａ内のホスト側I/F部２１０Ａは、コントローラ２００Ａ内のバススイッチ２６６と相互通信経路４００とコントローラ２００Ｂ内のバススイッチ２６６等を介して、コントローラ２００Ｂ内のプロセッサ２５０Ｂに接続される。換言すれば、バススイッチ２６６が更新モードの場合、ホスト側I/F部２１０とホスト側内部バスバッファ２６１及びホスト側内部バス４０１は、それぞれが設けられているコントローラとは別のコントローラの制御下に置かれることになる。
【００８５】
次に、ストレージシステムの動作について説明する。以下に述べる各フローチャートは、動作の概要を模式的に示すもので、実際のプログラムとは相違する。なお、図中、ステップを「Ｓ」と略記する。
【００８６】
図８は、ホスト１０から発行されたアクセス要求（コマンド）を処理するためのコマンド処理を示すフローチャートである。この処理は、記憶制御装置１００内のコントローラ２００Ａによって実行される。本実施例では、コントローラ２００Ａが、ホスト１０からのコマンドを受信して処理する構成としているためである。
【００８７】
コントローラ２００Ａは、ホスト１０からアクセス要求が発行されたか否かを監視している（Ｓ１１）。ホスト１０からのアクセス要求が発行された場合（S11:YES）、コントローラ２００Ａは、このアクセス要求のコマンドタイプを判別する（Ｓ１２）。
【００８８】
ホスト１０からリードコマンドが発行された場合、コントローラ２００Ａは、ホスト１０から要求されたデータがキャッシュメモリ２５０Ａに記憶されているか否かを判定する（Ｓ１３）。要求されたデータがキャッシュメモリ２５０Ａに記憶されている場合（S13:YES）、コントローラ２００Ａは、そのデータをキャッシュメモリ２５０Ａから読み出して、ホスト１０に送信する（Ｓ１５）。これに対し、ホスト１０から要求されたデータがキャッシュメモリ２５０Ａに記憶されていない場合（S13:NO）、コントローラ２００Ａは、要求されたデータを記憶部３００から読出して、キャッシュメモリ２５０Ａに記憶させる（Ｓ１４）。そして、コントローラ２００Ａは、この記憶部３００から読み出されたデータをホスト１０に送信する（Ｓ１５）。
【００８９】
ホスト１０からライトコマンドが発行された場合、コントローラ２００Ａは、ホスト１０から送信されたライトデータを受信して、このライトデータをキャッシュメモリ２５０Ａに記憶させる（Ｓ１６）。コントローラ２００Ａは、キャッシュメモリ２５０Ａに記憶されている制御情報を更新させる（Ｓ１７）。ここでは、例えば、ライトデータの記憶先アドレスやライトデータのステータス（ディステージ前のダーティステータス）等が更新される。
【００９０】
コントローラ２００Ａは、ライトデータをキャッシュメモリ２５０Ａに記憶させた時点で、ホスト１０にライトコマンドの処理が完了した旨を通知する（Ｓ１８）。その後、コントローラ２００Ａは、適当なタイミングを見計らって、キャッシュメモリ２５０Ａに記憶されたライトデータを、記憶部３００内の所定のディスクドライブ３１０に書き込む（Ｓ１９）。所定のディスクドライブ３１０とは、ホスト１０により指定された書込み先の論理ボリューム３３０を構成するディスクドライブ３１０である。なお、例えば、RAID５やRAID６等のように、パリティデータを生成する場合、コントローラ２００Ａは、パリティデータを算出して記憶させる。
【００９１】
ライトデータをディスクドライブ３１０に書き込む処理をディステージ処理と呼ぶ。ディステージされたライトデータのステータスは、ダーティステータスからクリーンステータスに変化する。コントローラ２００Ａは、ディステージ処理を終えると、ライトデータのステータス等を更新させる（Ｓ２０）。なお、ライトデータをキャッシュメモリ２５０Ａに記憶させた時点で、ホスト１０に処理完了を通知する方式をライトアフター方式または非同期書込み方式と呼ぶが、これに限らず、ライトデータをディスクドライブ３１０に書き込んでからホスト１０に処理完了を通知する構成でもよい。
【００９２】
ホスト１０から発行されたコマンドがリードコマンドでもライトコマンドでもない場合、コントローラ２００Ａは、その他のコマンド処理を実行する（Ｓ２１）。その他のコマンドとしては、例えば、論理ボリューム３３０の空き容量やステータスを問い合わせる照会コマンド等を挙げることができる。
【００９３】
図９は、キャッシュメモリ２５０Ａ，２５０Ｂ間で情報を共有させるための同期処理を示すフローチャートである。例えば、ユーザが予め同期モードに設定している場合、この同期処理は自動的に行われる。
【００９４】
コントローラ２００Ａは、ユーザデータが更新されたか否かを判定する（Ｓ３１）。ユーザデータが更新されている場合（S31:YES）、コントローラ２００Ａは、この更新されたユーザデータを他系のキャッシュメモリ２５０Ｂにコピーさせる（Ｓ３２）。即ち、キャッシュメモリ２５０Ａに記憶された新たなユーザデータは、キャッシュ制御部２６５から相互通信経路制御部２６４及び相互通信経路４００を介して、他方のコントローラ２００Ｂに転送され、キャッシュメモリ２５０Ｂに記憶される。
【００９５】
コントローラ２００Ａは、制御情報が更新されたか否かを判定する（Ｓ３３）。制御情報が更新された場合（S33:YES）、ユーザデータが更新された場合と同様に、更新された制御情報は、他系のキャッシュメモリ２５０Ｂにコピーされる（Ｓ３４）。そして、コントローラ２００Ａは、同期モードが終了されたか否かを判定する（Ｓ３５）。同期モードが終了するまで、キャッシュメモリ２５０Ａ，２５０Ｂの記憶内容が同期される。
【００９６】
図１０は、更新制御処理を示すフローチャートである。改良されたOS等が記憶制御装置１００のベンダから提供されると、ユーザは、管理端末２０の更新指示部２２を用いて、コントローラ２００Ａ（CTL#0）にプログラムの更新を指示する（Ｓ４１）。
【００９７】
コントローラ２００Ａは、更新指示を受信すると、共有情報をコントローラ２００Ｂ（CTL#1）に送信する（Ｓ４２）。ここで、共有情報とは、キャッシュメモリ２５０Ａの記憶内容である。コントローラ２００Ｂは、コントローラ２００Ａから受信した共有情報をキャッシュメモリ２５０Ｂに記憶させる（Ｓ４３）。
【００９８】
このようにして各キャッシュメモリ２５０Ａ，２５０Ｂ間の同期が完了すると、内部バスを切り替えるための準備が完了する。なお、プログラムの更新実行が指示された時点で、既にキャッシュメモリ２５０Ａ，２５０Ｂが同期モードで運用されていた場合、Ｓ４２，Ｓ４３を省略することができる。
【００９９】
コントローラ２００Ａは、バススイッチ２６６を通常モードから更新モードに切り替えさせることにより、データ転送制御回路２６０Ａ内のホスト側内部バス４０１を、データ転送制御回路２６０Ｂの内部バスに接続させる（Ｓ４４）。これにより、コントローラ２００Ａのホスト側I/F部２１０Ａは、相互通信経路４００を介して、コントローラ２００Ｂのプロセッサ２３０Ｂに接続される。
【０１００】
ホスト側内部バス４０１の接続先を切り替えた後で、ホスト１０からアクセス要求が発行された場合、このアクセス要求は、コントローラ２００Ｂによって処理される。ホスト１０は、アクセス要求の処理先がコントローラ２００Ａからコントローラ２００Ｂに移ったことを意識しない。
【０１０１】
コントローラ２００Ａ側で受信されたアクセス要求をコントローラ２００Ｂで処理する準備が完了すると、コントローラ２００Ａは、新たなプログラムの転送を管理端末２０に要求する（Ｓ４６）。この要求を受けて、管理端末２０は、新プログラム記憶部２１に記憶されている更新用プログラムを、管理用ネットワークCN１３を介して、コントローラ２００Ａに送信する。コントローラ２００Ａのプロセッサ２３０Ａは、ホスト側I/F部２１０Ａから切り離されているが、管理用ネットワークCN１３には接続されており、管理端末２０との間で双方向の通信を行うことができる。
【０１０２】
コントローラ２００Ａは、管理端末２０から受信した新プログラムを、例えば、空きディスク３１２に記憶させる（Ｓ４８）。そして、コントローラ２００Ａは、旧プログラムを新プログラムに更新させる（Ｓ４９）。更新処理については、さらに後述する。
【０１０３】
コントローラ２００Ａは、プログラムの更新が完了すると、自己診断処理を行い（Ｓ５０）、再起動する（Ｓ５１）。再起動完了後、コントローラ２００Ａは、共有情報の転送をコントローラ２００Ｂに要求する（Ｓ５２）。コントローラ２００Ａ側でプログラムを更新している期間中、ホスト１０からのアクセス要求は、コントローラ２００Ｂによって処理されている。従って、最新のユーザデータ及び制御情報は、コントローラ２００Ｂのキャッシュメモリ２５０Ｂによって保持されている。
【０１０４】
コントローラ２００Ｂは、キャッシュメモリ２５０Ｂに記憶されている共有情報を、コントローラ２００Ａに送信する（Ｓ５３）。コントローラ２００Ａは、コントローラ２００Ｂから受信した共有情報をキャッシュメモリ２５０Ａに記憶させる（Ｓ５４）。
【０１０５】
このようにして、キャッシュメモリ２５０Ａ，２５０Ｂの再同期が行われると、ホスト側内部バス４０１をコントローラ２００Ａ側に再接続させるための準備が整う。そこで、コントローラ２００Ａは、バススイッチ２６６を更新モードから通常モードに切り替えさせる（Ｓ５５）。これにより、コントローラ２００Ｂの制御下に置かれていたホスト側内部バス４０１やホスト側内部バスバッファ２６１及びホスト側I/F部２１０Ａは、通常通りに、コントローラ２００Ａの制御下に置かれることになる。
【０１０６】
そして、コントローラ２００Ａは、コントローラ２００Ａ側のプログラム更新が正常に完了した旨を管理端末２０に通知する（Ｓ５６）。管理端末２０は、コントローラ２００Ａからの更新完了通知を確認すると（Ｓ５７）、コントローラ２００Ｂに向けてプログラム更新の実行を指示する（Ｓ５８）。以下、Ｓ４２〜Ｓ５７のステップが同様にして繰り返される。
【０１０７】
このようにして、記憶制御装置１００は、複数のコントローラ２００Ａ，２００Ｂのプログラムを交互に更新させる。プログラム更新期間中のアクセス要求は、プログラム更新前またはプログラム更新後の相手方のコントローラにより処理される。従って、ホスト１０は、アクセス要求の処理先が切り替えられたことも、プログラムの更新が行われたことも、いずれも意識せずに、通常通りアクセス要求を発行し、その処理結果を受領することができる。
【０１０８】
図１１は、図１０中にＳ４９で示された更新処理を示すフローチャートである。ここでは、本処理をコントローラ２００Ａが実行する場合を例に挙げて説明する。まず、コントローラ２００Ａは、プログラムメモリ２４１内のプログラムＰ１０を更新させるか否かを判定する（Ｓ４９１）。
【０１０９】
管理端末２０から受信された新プログラム中に、プログラムメモリ２４１内のプログラムＰ１０（旧プログラム）に置き換わるべき新プログラムＰ１１が含まれている場合（S491:YES）、コントローラ２００Ａは、新プログラムＰ１１を空きディスク３１２から読み出す（Ｓ４９２）。そして、コントローラ２００Ａは、プログラムメモリ２４１内のプログラムＰ１０を新プログラムＰ１１に置き換える（Ｓ４９３）。コントローラ２００Ａは、プログラムの更新が正常に完了したか否かを判断する（Ｓ４９３）。
【０１１０】
正常に更新が完了した場合（S493:YES）、コントローラ２００Ａは、ブートディスク３１１内のプログラムＰ２０を更新させるか否かを判断する（Ｓ４９５）。プログラムＰ２０に代わる新プログラムＰ２１を管理端末２０から受信している場合（S495:YES）、コントローラ２００Ａは、新プログラムＰ２１を空きディスク３１２から読み出して（Ｓ４９６）、プログラムＰ２０に置き換える（Ｓ４９７）。
【０１１１】
コントローラ２００Ａは、プログラムの更新が正常に完了したか否かを判断し（Ｓ４９８）、正常に完了した場合（S498:YES）、本処理を終了する。これに対し、プログラムの更新が何らかの原因で失敗した場合（S494:NOまたはS498:NO）、コントローラ２００Ａは、管理端末２０にエラーを通知する（Ｓ４９９）。エラー通知を受信した管理端末２０は、更新指示を再び発行することができる。なお、プログラムの更新は、プログラムの全部または一部の更新を意味する。
【０１１２】
本実施例は上述のように構成されるので、以下の効果を奏する。本実施例では、プログラム更新に先立って、更新対象のコントローラ２００Ａのホスト側I/F部２１０Ａを、相互通信経路４００を介して、処理代行先のコントローラ２００Ｂの内部バスに接続させる構成とした。従って、コントローラ２００Ａのプログラムを更新している間、ホスト１０からのアクセス要求を停止させることなく、引き続いて処理することができる。これにより、ホスト１０と記憶制御装置１００との間に冗長パスを設定したり、ホスト１０側で論理的なパス切替制御等を行ったりする必要がなく、いわゆる無停止運転を継続しながら、プログラムを更新することができる。従って、ホスト１０に負担を与えることなく、ホスト１０に意識させることなく、比較的簡易かつ低コストに、円滑なプログラム更新を行うことができ、使い勝手が向上する。
【０１１３】
本実施例では、ホスト側内部バス４０１を処理代行先のコントローラ２００Ｂに接続させる前に、キャッシュメモリ２５０Ａ，２５０Ｂを同期させる。従って、処理の代行を依頼されたコントローラ２００Ｂは、キャッシュメモリ２５０Ｂ内の共有情報に基づいて、整合性のあるデータ処理を行うことができる。
【０１１４】
本実施例では、コントローラ２００Ａ側のアクセス要求処理をコントローラ２００Ｂに代行させた後で、コントローラ２００Ａ側のプログラムを更新させる。従って、記憶制御装置１００を停止させることなく、プログラムを更新することができる。
【０１１５】
なお、キャッシュメモリ２５０Ａ，２５０Ｂを同期させるための時間は必要である。従って、共有情報の同期処理では、例えば、更新された差分のみを転送し、同期処理時間を短くしたり、プログラム更新前に、各コントローラ２００Ａ，２００Ｂを同期モードで運用するのが好ましい。
【０１１６】
本実施例では、ホスト側I/F部２１０Ａの接続先の切替処理や更新制御処理は、更新対象のコントローラ２００Ａ内で行う構成とした。従って、アクセス要求の処理を代行するコントローラ２００Ｂ側の負荷を増大させることなく、コントローラ２００Ａのプログラムを更新させることができる。
【０１１７】
本実施例では、データ転送制御回路２６０Ａ，２６０Ｂ内にバススイッチ２６６を設けて、ホスト側I/F部２１０Ａの接続先を切り替える構成とした。従って、コントローラ２００Ａ，２００Ｂの部品点数を増大させることなく、無停止運転中のプログラム更新を行うことができる。
【実施例２】
【０１１８】
次に、図１２，図１３に基づいて、第２実施例を説明する。本実施例を含む以下の各実施例は、第１実施例の変形例に該当する。以下の各実施例では、上述した構成と重複する構成の説明を割愛し、特徴部分を中心に説明する。
【０１１９】
本実施例では、いわゆるインバンド方式によって、ホスト１０Ａからプログラムの更新実行を指示する。上述した実施例では、更新指示等を管理端末２０から管理用ネットワークCN１３を介して、記憶制御装置１００に通知していた。この方式は、アウトオブバンド方式と呼ばれる。これに代えて、本実施例では、データ入出力用のネットワークCN１１を用いて、プログラムの更新を指示する。
【０１２０】
図１２は、本実施例によるストレージシステムの全体構成を示す説明図である。本実施例では、ホスト１０Ａ内に管理端末２０の機能の全部または一部が設けられている。このホスト１０Ａは、少なくとも新プログラム記憶部１３及び更新指示部１４を備える。
【０１２１】
新プログラム記憶部１３は上述した新プログラム記憶部２１に、更新指示部１４は上述した更新指示部２２に、それぞれ対応する。新プログラム記憶部１３は、更新用のプログラムを記憶するための手段である。更新指示部１４は、記憶制御装置１００にプログラムの更新を指示するための手段である。本実施例では、ホスト１０Ａに管理端末２０の機能を設け、ホスト１０Ａからプログラムの更新を指示するため、管理用ネットワークCN１３は廃止されている。
【０１２２】
図１３は、更新制御処理を示すフローチャートである。ホスト１０Ａは、プログラム更新の最初の対象であるコントローラ２００Ａに、更新の実行を指示すると共に、新プログラムを送信する（Ｓ６１）。コントローラ２００Ａは、新プログラムを受信して空きディスク３１１に記憶させる（Ｓ６２）。
【０１２３】
そして、コントローラ２００Ａは、キャッシュメモリ２５０Ａに記憶されている共有情報をキャッシュメモリ２５０Ｂに転送し（Ｓ６３）、両キャッシュメモリ２５０Ａ，２５０Ｂの記憶内容を一致させる（Ｓ６４）。なお、上述のように、既に同期モードで運用されている場合、Ｓ６３，Ｓ６４は廃止することができる。また、キャッシュメモリ２５０Ａに記憶されている共有情報の全てを送信するのではなく、キャッシュメモリ２５０Ｂとの差分だけを送信することもできる。
【０１２４】
次に、コントローラ２００Ａは、ホスト側内部バス４０１をコントローラ２００Ｂのデータ転送制御回路２６０Ｂの内部バスに接続させた後（Ｓ６５）、プログラムを更新させる（Ｓ６６）。コントローラ２００Ａは、プログラムの更新完了後に、自己診断処理（Ｓ６８）及び再起動（Ｓ６９）を行う。
【０１２５】
コントローラ２００Ａは、キャッシュメモリ２５０Ｂに記憶されている共有情報の転送をコントローラ２００Ｂに要求する（Ｓ７０）。コントローラ２００Ｂは、アクセス要求の処理を代行している期間中のデータ処理の結果が反映されている共有情報を、コントローラ２００Ａに送信する（Ｓ７１）。
【０１２６】
コントローラ２００Ａは、キャッシュメモリ２５０Ａ，２５０Ｂの記憶内容を一致させた後、ホスト側内部バス４０１をデータ転送制御回路２６０Ａの内部バスに再接続させる（Ｓ７３）。そして、コントローラ２００Ａは、ホスト１０Ａに、プログラムの更新が正常に完了した旨を通知する（Ｓ７４）。ホスト１０Ａは、コントローラ２００Ａ側のプログラムの更新完了を確認すると（Ｓ７５）、次に更新させるべきコントローラ２００Ｂに向けてプログラム更新を指示する（Ｓ７６）。以下、Ｓ６２〜Ｓ７５と同様のステップが実行される。
【０１２７】
このように構成される本実施例も前記第１実施例と同様の作用効果を奏する。これに加えて、本実施例では、ホスト１０Ａ内に管理機能を設けると共に、アウトオブバンド方式で更新実行を指示するため、管理端末２０及び管理用ネットワークCN１３を廃止することができ、全体構成を簡素化することができる。
【実施例３】
【０１２８】
図１４に基づいて第３実施例を説明する。本実施例では、プログラム更新を管理するための管理機能１５を、ホスト１０Ｂに設ける。但し、第２実施例と異なり、更新指示等は、管理用ネットワークCN１３を介して、記憶制御装置１００に送信される。
【０１２９】
図１４は、本実施例によるストレージシステムの全体構成を示す。ホスト１０Ｂには、管理機能１５が設けられている。管理機能１５には、新プログラムを記憶するための新プログラム記憶部１６と、プログラムの更新を指示するための更新指示部１７とが設けられている。そして、管理機能１５は、LAN用のI/F１８を介して、管理用ネットワークCN１３に接続されている。本実施例の動作は、第１実施例と同様である。但し、プログラム更新に関する情報の交換は、管理機能１５と各コントローラ２００Ａ，２００Ｂとの間で行われる。
【０１３０】
このように構成される本実施例も前記第１実施例と同様の作用効果を奏する。これに加えて、本実施例では、ホスト１０Ｂ内に管理機能１５を設けるため、管理端末２０を廃止することができ、全体構成を簡素化することができる。また、更新に関する指示は、管理用ネットワークCN１３を用いて行われるため、更新指示や更新用プログラムの転送は、通常のデータ入出力に影響を与えない。
【実施例４】
【０１３１】
図１５，図１６に基づいて、第４実施例を説明する。本実施例では、プログラム更新の優先度と記憶制御装置１００の状態に基づいて、プログラムの更新時期を制御する。
【０１３２】
図１５は、本実施例によるストレージシステムの全体構成を示す説明図である。このストレージシステムは、前記第１実施例で述べた構成に加えて、管理センタ３０をさらに備えている。
【０１３３】
管理センタ３０は、記憶制御装置１００のプログラム更新を一元的に管理するためのコンピュータ装置である。管理センタ３０は、例えば、WAN（Wide Area Netwrok）のような通信ネットワークCN１４を介して、管理端末２０と接続されている。なお、図中では、管理センタ３０は、１つの管理端末２０のみに接続されているが、複数の管理端末にそれぞれ接続することができる。また、通信ネットワークCN１３と通信ネットワークCN１４とを共通にすることもできる。
【０１３４】
管理センタ３０は、新プログラム記憶部３１とプログラム更新通知部３２とを備えることができる。新プログラム記憶部３１は、更新用の新プログラムを記憶する。プログラム更新通知部３２は、新プログラムに更新すべき旨を管理端末２０に通知する。
【０１３５】
図１６は、更新制御処理の実行タイミングを制御するための更新実行時期判定処理を示すフローチャートである。管理センタ３０は、プログラム更新の必要性が生じたと判定した場合（S81:YES）、プログラムの更新をすべき旨及び更新の優先度を、管理端末２０に通知する（Ｓ８２）。例えば、セキュリティ性の改善に関するプログラム更新の場合は、比較的高い優先度が設定される。データ処理性能の改善に関するプログラム更新の場合は、比較的低い優先度が設定される。
【０１３６】
管理端末２０は、プログラム更新の必要が生じた旨を確認し、そのプログラム更新の優先度を記憶する（Ｓ８３）。管理センタ３０は、新プログラム記憶部３１から新プログラムを読み出して、管理端末２０に送信する（Ｓ８４）。管理端末２０は、管理センタ３０から受信した新プログラムを新プログラム記憶部２１に記憶させる（Ｓ８５）。
【０１３７】
管理端末２０は、管理センタ３０から通知されたプログラム更新の優先度と、予め設定されている所定の閾値とを比較し、その優先度が所定の閾値を超えているか否かを判定する（Ｓ８６）。優先度が所定の閾値を超えている場合（S86:YES）、管理端末２０は、記憶制御装置１００（最初に更新されるコントローラ２００Ａ）に、プログラムの更新実行を指示する（Ｓ８７）。これにより、記憶制御装置１００は、図１０で述べた更新制御処理を実行する（Ｓ８８）。
【０１３８】
これに対し、プログラム更新の優先度が所定の閾値以下の場合（S86:NO）、緊急度の低いプログラム更新である。そこで、管理端末２０は、記憶制御装置１００に、記憶制御装置１００の状態の転送を要求する（Ｓ８７）。記憶制御装置１００の状態とは、例えば、記憶制御装置１００の負荷状態を意味する。負荷状態は、例えば、単位時間当たりのアクセス要求回数（IOPS）、キャッシュメモリ２５０Ａ，２５０Ｂの使用率、プロセッサ２３０Ａ，２３０Ｂの使用率等から判断可能である。
【０１３９】
記憶制御装置１００は、自己の状態を管理端末２０に送信する（Ｓ９０）。管理端末２０は、記憶制御装置１００の状態を記憶する（Ｓ９１）。管理端末２０は、記憶制御装置１００の状態に基づいて、プログラム更新を実行させるのが適切な時期であるか否かを判定する（Ｓ９２）。
【０１４０】
例えば、記憶制御装置１００が多数のアクセス要求を処理していたり、あるいは、テープデバイスへのバックアップ処理を実行しているような場合、記憶制御装置１００の負荷状態は、重くなっている。このような場合、緊急性の低いプログラム更新を実行させるのは適切ではない。これに対し、記憶制御装置１００の負荷状態が軽い場合、プログラム更新を実行させても何ら不都合はない。
【０１４１】
プログラム更新の実行に適したタイミングであると判定した場合（S92:YES）、管理端末２０は、記憶制御装置１００にプログラムの更新実行を指示する（Ｓ９３）。これにより、記憶制御装置１００は、プログラムの更新を行う（Ｓ９４）。
【０１４２】
プログラム更新の実行に適切なタイミングではないと判定した場合（S92:NO）、管理端末２０は、例えば、所定時間が経過するのを待ってから、再び記憶制御装置１００の状態を取得する（Ｓ８９）。このように、管理端末２０は、プログラム更新の適切なタイミングを見計らって、記憶制御装置１００に更新指示を発行する。
【０１４３】
このように構成される本実施例も前記第１実施例と同様の効果を奏する。これに加えて、本実施例では、プログラム更新の優先度と記憶制御装置１００の状態に基づいて、更新時期を選択するため、記憶制御装置１００の負荷状態が軽い場合にプログラムを更新させることができ、ストレージシステムの性能低下を抑制しながら、円滑にプログラムを更新させることができる。
【実施例５】
【０１４４】
図１７に基づいて第５実施例を説明する。図１７のブロック図に示すように、本実施例では、データ転送制御回路２６０Ａ，２６０Ｂからバススイッチ２６６を除去し、データ転送制御回路２６０Ａ，２６０Ｂの外側に、経路切替スイッチ２７０Ａ，２７０Ｂを設けている。
【０１４５】
経路切替スイッチ２７０Ａ，２７０Ｂは、バス４０５を介して、それぞれ相互通信経路制御部２６４に接続されている。経路切替スイッチ２７０Ａ，２７０Ｂは、バススイッチ２６６のように、通常モードと更新モードとを備えている。通常モードの場合、ホスト側I/F部２１０Ａはデータ転送制御回路２６０Ａに、ホスト側I/F部２１０Ｂはデータ転送制御回路２６０Ｂに、それぞれ接続される。経路切替スイッチ２７０Ａが更新モードの場合、ホスト側I/F部２１０Ａは、バス４０５，相互通信経路４００を介して、データ転送制御回路２６０Ｂに接続される。同様に、経路切替スイッチ２７０Ｂが更新モードの場合、ホスト側I/F部２１０Ｂは、バス４０５，相互通信経路４００を介して、データ転送制御回路２６０Ａに接続される。このように構成される本実施例も前記第１実施例と同様の効果を奏する。
【０１４６】
なお、本発明は、上述した各実施例に限定されない。当業者であれば、本発明の範囲内で、種々の追加や変更等を行うことができる。
【図面の簡単な説明】
【０１４７】
【図１】本発明の実施形態によるストレージシステムの全体概念を示す説明図である。
【図２】ストレージシステムの全体構成を示す説明図である。
【図３】キャッシュメモリの記憶構成を示す説明図である。
【図４】メモリ及び記憶部の記憶構成を示す説明図である。
【図５】コントローラの構成を示すブロック図である。
【図６】バススイッチが通常モードの場合の接続状況を示すブロック図である。
【図７】一方のバススイッチが更新モードの場合の接続状況を示すブロック図である。
【図８】ホストからのコマンドを処理するためのフローチャートである。
【図９】キャッシュメモリの記憶内容を同期させる処理を示すフローチャートである。
【図１０】プログラムを更新させる場合の処理を示すフローチャートである。
【図１１】図１０中の更新処理を示すフローチャートである。
【図１２】第２実施例に係るストレージシステムの全体構成を示す説明図である。
【図１３】プログラムを更新させる場合の処理を示すフローチャートである。
【図１４】第３実施例に係るストレージシステムの全体構成を示す説明図である。
【図１５】第４実施例に係るストレージシステムの全体構成を示す説明図である。
【図１６】更新実行時期を判定するための処理を示すフローチャートである。
【図１７】第５実施例に係るストレージシステムの全体構成を示す説明図である。
【符号の説明】
【０１４８】
１…記憶制御装置、２Ａ，２Ｂ…コントローラ、２Ａ１，２Ｂ１…上位インターフェース部、２Ａ２，２Ｂ２…下位インターフェース部、２Ａ３，２Ｂ３…アクセス要求処理部、２Ａ４，２Ｂ４…プログラムメモリ、２Ａ５，２Ｂ５…データメモリ、３…記憶部、４Ａ，４Ｂ…ディスクドライブ、５…ホスト、６…管理端末、６Ａ…更新指示部、７…接続制御部、７Ａ，７Ｂ…切替スイッチ、７Ｃ，７Ｄ…相互通信経路、８…更新制御部、１０，１０Ａ，１０Ｂ…ホスト、１１…通信インターフェース、１２…アプリケーションプログラム、１３…新プログラム記憶部、１４…更新指示部、１５…管理機能、１６…新プログラム記憶部、１７…更新指示部、１８…LANインターフェース、２０…管理端末、２１…新プログラム記憶部、２２…更新指示部、３０…管理センタ、３１…新プログラム記憶部、３２…プログラム更新通知部、１００…記憶制御装置、２００Ａ，２００Ｂ…コントローラ、２１０Ａ，２１０Ｂ…ホスト側インターフェース部、２２０Ａ，２２０Ｂ…ディスク側インターフェース部、２３０Ａ，２３０Ｂ…プロセッサ、２４０Ａ，２４０Ｂ…メモリ、２４１…プログラムメモリ、２４２…RAM、２５０Ａ，２５０Ｂ…キャッシュメモリ、２６０Ａ，２６０Ｂ…データ転送制御回路、２６１…ホスト側内部バスバッファ、２６２…ディスク側内部バスバッファ、２６３…プロセッサ側内部バスバッファ、２６４…相互通信経路制御部、２６５…キャッシュ制御部、２６６…バススイッチ、２７０Ａ，２７０Ｂ…経路切替スイッチ、３００…記憶部、３１０…ディスクドライブ、３１１…ブートディスク、３１２…空きディスク、３２０…RAIDグループ、３３０…論理ボリューム、４００…相互通信経路、４０１…ホスト側内部バス、４０２…ディスク側内部バス、４０３…キャッシュバス、４０４，４０５…バス
【図１】
2007219571.tif 000003
【図２】
2007219571.tif 000004
【図３】
2007219571.tif 000005
【図４】
2007219571.tif 000006
【図５】
2007219571.tif 000007
【図６】
2007219571.tif 000008
【図７】
2007219571.tif 000009
【図８】
2007219571.tif 000010
【図９】
2007219571.tif 000011
【図１０】
2007219571.tif 000012
【図１１】
2007219571.tif 000013
【図１２】
2007219571.tif 000014
【図１３】
2007219571.tif 000015
【図１４】
2007219571.tif 000016
【図１５】
2007219571.tif 000017
【図１６】
2007219571.tif 000018
【図１７】
2007219571.tif 000019