以下、本発明の第一の実施の形態について図面を参照して詳細に説明する。
図1は、本発明を実現するためのネットワークシステムの概略構成であり、PC100A,PC100Bと、デバイスサーバ200と、ストレージ300から構成されている。
このネットワークシステムでは、デバイスサーバ200とストレージ300をUSB(Universal Serial Bus)やIEEE1394などのインターフェースに準拠した接続ケーブル400で接続する。また、デバイスサーバ200とPC100(PC100A,PC100B)は、有線または無線のネットワーク500で接続する。
また、図1のネットワークシステムでは、デバイスサーバ200、ストレージ300をそれぞれ別体の装置で構成しているが、この構成に限定されるものではなく、同等の機能を実現できる構成であれば種々の構成を採り得ることは勿論である。例えば、デバイスサーバ200をストレージ300のケーシング内に収まるように一体構造としても良い。
なお、以降の説明においては、クライアントPCのオペレーティングシステム(Operating System;以下、OS)をWindows(登録商標)、デバイスをストレージ、デバイスサーバとデバイスの接続インターフェースをUSBとした場合の構成で説明するが、これらに限定されず、別のOSや接続インターフェースを使用しても良い。
次に、図1のネットワークシステムを構成する各装置について順次説明してゆく。
まず、クライアントであるPC100について説明する。PC100(PC100A,PC100B)は、例えば、パーソナルコンピュータのような装置であり、ネットワーク500と接続し、デバイスサーバ200を介してストレージ300を利用することが可能な構成となっている。
図2は、PC100(PC100A,PC100B)のハードウェア構成およびソフトウェア構成の一例を示すブロック図である。
PC100は、CPU101、入力部102、表示部103、メモリ104、通信部105、外部記憶部106などから構成されており、これらが内部バス107で接続されている。
外部記憶部106は、OS110、アプリケーションプログラム111、本発明を実現するためのソフトウェア群112〜116(後述)など各種ソフトウェアが記録されている。ここで、アプリケーションプログラム111とは、ファイル管理ソフトウェアなど、ストレージ300へのアクセスを発生せしめるソフトウェアプログラムを指す。
外部記憶部106に記憶されたこれらソフトウェアは、CPU101の制御に従い、メモリ104上に読み出されて実行される。
通信部105は、ネットワーク500(有線又は無線ネットワーク)に接続するためのインターフェースであり、デバイスサーバ200との間でデータ通信を行うことで、PC100からデバイスサーバ200を介したストレージ300へのアクセスを可能とする。
本発明を実現するためのソフトウェア群112〜116について説明する。
SCSIコマンド層112は、ストレージ300にアクセスする際に使用するドライバソフトウェア(例えば、disk.sysなど)である。
PC100内において、上位層(OS110およびアプリケーションプログラム111)からの指示によりストレージ300へのアクセスが発生すると、制御コマンドであるSCSIコマンドの生成を行い、フィルタドライバ層113へ送出し、当該SCSIコマンドに対する応答情報を待つ。なお、これ以降の説明では、制御コマンドをSCSIコマンドとして説明するが、SCSIコマンドに限定するものではない。
フィルタドライバ層113は、SCSIコマンド層112又はUSBドライバ層114から送られてくるSCSIコマンドの種類(内容)を解析するソフトウェアである。
また、SCSIコマンドの解析結果に基づいてSCSIコマンド層112を介して上位層に擬似応答情報を返すとともに、ネットワークプロトコル層115と連携してデバイスサーバ200との間のセッションを切断する機能を備えている。
USBドライバ層114は、接続対象となるUSBデバイス(本実施例では、ストレージ300)が持つ機能に合わせた制御を行うドライバソフトウェア(例えば、usbstor.sysなど)であり、また、SCSIコマンドとUSBデバイスが扱えるUSBパケットとの変換処理などを行うソフトウェアである。
ネットワークプロトコル層115は、USBパケットに対してIP(Internet Protocol)ヘッダの付加、取り外しの処理を行い、ネットワーク500を介して接続されているデバイスサーバ200との間のデータ通信を制御するソフトウェアである。
ネットワークインターフェース層116は、Ethernet(登録商標)のような有線ネットワーク、若しくは、IEEE802.11aやIEEE802.11bのような無線ネットワークなどネットワーク500に対応したネットワークパケットによる送受信や通信制御を行うためのドライバソフトウェアである。
なお、本実施例では、フィルタドライバ層113がSCSIコマンド層112とUSBドライバ層114との間に配置してあるが、この位置に限定されるものではない。例えば、USBドライバ層114の下に配置する構成や、ネットワークプロトコル層115のドライバソフトウェアの一部に組み込まれる構成であっても良い。
次に、デバイスサーバ200について説明する。デバイスサーバ200は、PC100A,100Bとデバイスであるストレージ300と間の接続制御を行う装置である。
図3は、デバイスサーバ200のハードウェア構成およびソフトウェア構成の一例を示すブロック図である。
デバイスサーバ200は、CPU201、入力部202、表示部203、ROM204、RAM205、通信部206、USBインターフェース207などから構成されており、これらが内部バス208で接続されている。
ROM(Read Only Memory)204には、OS210、制御プログラム211、本発明を実現するためのソフトウェア群212〜213(後述)など各種ソフトウェアが記録されており、これらソフトウェアは、CPU201の制御に従い、RAM205上に読み出されて実行される。
USBインターフェース207は、接続ケーブル400を介してストレージ300とローカル接続するためのインターフェースである。
通信部206は、ネットワーク500(有線又は無線ネットワーク)に接続してPC100との間でデータ通信するためのインターフェースである。
本発明を実現するためのソフトウェア群212〜213について説明する。
通信層212は、ネットワークに接続された通信部206の制御を行うとともに、ネットワーク500に接続されているPC100との間のセッションやネットワークパケットによる通信を行うソフトウェアである。
また、USBコマンド層213との間で通信するため、ネットワークパケットとUSBパケットとの変換を行う。ネットワークパケットはUSBパケットにIPヘッダを付加して作成するため、変換にはIPヘッダの取り付け及び取り外しを行う。
USBコマンド層213は、USBパケットに基づいて、ストレージ300との間でデータ通信を行うソフトウェアである。
なお、通信層212、USBコマンド層213は、ストレージ300内に内蔵する構成であっても良い。また、通信層212の機能を備えたソフトウェアを別筐体内に設け、デバイス(ストレージ300)に接続可能なインターフェースを有した外付けアダプタの形態として構成してもよい。この場合は、USBコマンド層213の機能を持つソフトウェアは、デバイス300側のRAMや外部記憶装置などに記録しておく構成とする。
ここで、上述した図2及び図3で各ソフトウェア構成を説明したPC100とデバイスサーバ200間の通信に関して説明する。
PC100のネットワークプロトコル層115は、ネットワークインターフェース層116を介して、デバイスサーバ200の通信層212とTCPプロトコル(Transmission Control Protocol)を用いて通信する。TCPプロトコルは、信頼性のある通信を保証するためのプロトコルであり、本実施例においては、ネットワーク500上に流れるストレージ300のデータの転送に用いている。
ストレージ300は、例えば、HDD(Hard Disk Drive)のような装置であり、各種データの書き込み処理や読出し処理が可能な装置である。
なお、本実施例では、デバイスとしてストレージを例に説明しているが、例えば、プリンタやスキャナなど、別のデバイスであってもよい。
図4は、PC100からストレージ300へアクセスするときに使用する主なSCSIコマンドについて、CDB(Command Descriptor Block)の種類、オペレーションコード、サイズと意味を示した一覧リストであり、上述したPC100のSCSIコマンド層112(図2参照)で生成される制御コマンドである。本発明においては、これらのSCSIコマンドをセッション制御に利用する。
各CDBは、1バイトのオペレーションコードとそれに対応する構造体のサイズが定義されており、例えば、Test Unit ReadyのCDBでは、オペレーションコードは0x00であり、サイズは6バイトである。以下、本実施例の説明で使用するコマンドについて説明する。
Test Unit Readyコマンド(以下、TURコマンド)は、ストレージ300へのアクセスがアイドル状態になった場合、PC100から定期的(例えば、一秒間隔)に送出され、ストレージの状態を確認するために用いられている制御コマンドである。
READコマンドは、ストレージ300からデータを読み出すときに用いられるコマンドであり、WRITEコマンドは、ストレージ300へデータを書き込むときに用いられるコマンドである。なお、これ以降の説明では、TURコマンド以外の制御コマンドを「アクセス制御コマンド」として説明する。
図5は、図4に図示した各SCSIコマンドで共通に使用されるSRB(SCSI Request Block)のパケットフォーマットである。パケットは、SRBのサイズを示す2バイトのLengthと、機能を示す1バイトのFunctionのフィールドなどで構成される。
SCSIコマンド層112からフィルタドライバ層113へ送信されるSRB構造体は、64バイトのサイズであり、Length=64が設定される。Functionは、SCSIコマンドの実行コードとして0x00、ストレージ300への要求コードとしての0x01、制御を行う0x02などの値が設定される。
先頭からオフセット10バイト目にあたる1バイトのCdbLengthは、CDBの有効データサイズを示している。CDBは、SCSIデバイスの具体的なコマンドを示しており、オフセット48バイト目から、16バイト固定長のデータ領域が確保されている。
次に、PC100とストレージ300間のデータ通信の大まかな流れについて図6を参照しながら説明する。
まず、PC100からストレージ300へデータ送信を行う場合について説明する。
PC100においてストレージ300へのアクセス要求が発生すると、SCSIコマンド層112は、アクセス要求の内容に応じて図4で説明したSCSIコマンドのいずれかを生成し、図5で示したフォーマットでフィルタドライバ層113へ送る。
フィルタドライバ層113は、SCSIコマンド層112で生成されたSCSIコマンドの解析を行い、どのような内容のアクセス要求なのかを判定する。
USBドライバ層114は、フィルタドライバ層113で解析されたSCSIコマンドをUSBパケットに変換する(SCSIコマンドをUSBパケットのデータ層に格納する)。
ネットワークプロトコル層115は、USBドライバ層114でSCSIコマンドから変換されたUSBパケットにIPヘッダを付加し、ネットワーク500に適した形式のデータであるネットワークパケットを作成する。
ネットワークインターフェース層116は、ネットワークプロトコル層115で作成されたネットワークパケットをネットワーク500を介してデバイスサーバ200に送出する。
デバイスサーバ200では、まず、通信層212で、PC100からネットワーク500を介して送信されたネットワークパケットを受信し、ネットワークパケットからIPヘッダを取り外すことでUSBパケットに変換し、これをUSBコマンド層213へ送る。
USBコマンド層213では、通信層212から送られたUSBパケットを、接続ケーブル400を介してストレージ300へ送る。
ストレージ300は、デバイスサーバ200から送られてきたUSBパケットに含まれるSCSIコマンドを解析し、その種類に応じた応答処理を行う。
SCSIコマンドがTURコマンドである場合は、ストレージ300を使用可能か否かの状態の確認処理を実行する。
SCSIコマンドがREADコマンドである場合は、ストレージ300からの読み込み処理を実行する。
SCSIコマンドがWRITEコマンドである場合は、ストレージ300への書き込み処理を実行する。
SCSIコマンドが上述した以外のコマンドである場合は、該当するコマンドに応じた処理を実行する。
次に、ストレージ300からPC100へデータ送信(応答)を行う場合について説明する。
上述した応答処理を行ったストレージ300は、その結果をPC100に対する応答情報としてUSBパケットでデバイスサーバ200へ送る。
デバイスサーバ200では、USBコマンド層213がストレージからの応答情報であるUSBパケットを受け取り、それを通信層212へ送る。
通信層212では、USBコマンド層213からのUSBパケットにIPヘッダを付加し、ネットワーク500に適した形式のデータであるネットワークパケットを作成し、ネットワーク500を介してPC100に送出する。
このようにして、PC100とストレージ300との間でデバイスサーバ200を介したデータ通信が実行されることになる。
次に、PC100(PC100A,PC100B)の基本制御について説明する。
PC100では、デバイスサーバ200との接続が定常状態であるかどうかを判断して、定常状態に達した場合には、デバイスサーバ200とのセッションを切断し、PC100の上位層(OS110、アプリケーションプログラム111)およびSCSIコマンド層112からはストレージ300が接続されていると認識される、いわゆる「擬似接続状態」へ移行し、定常状態である期間は「擬似接続状態」を維持する制御を実行する。
なお、定常状態とは、PC100とストレージ300との接続が一定に保たれている状態をいい、定常状態であるかどうかの判断には、TURコマンドに対してストレージ300が連続して「SUCCESS」を応答した回数を用いるものとし、この回数(初期値0)をカウントするカウンタを、以降の説明ではSUCCESSカウンタと呼ぶものとする。
図7は、PC100がデバイスサーバ200を介してストレージ300にアクセスするときの制御動作の手順を示すフローチャートである。
まず、PC100において、ストレージ300へのアクセスが発生した場合、SCSIコマンド層112がアクセス要求の内容に応じたSCSIコマンド(図4参照)の生成を行い、生成されたSCSIコマンドは、フィルタドライバ層113へ送信される(ステップS701)。
次に、フィルタドライバ層113が、生成されたSCSIコマンドを解析する(ステップS702)。
SCSIコマンドがTURコマンドである場合(ステップS702でYes)、フィルタドライバ層113では、SUCCESSカウンタの値を判定する(ステップS703)。この判定により、擬似接続状態であるか否かの判定が行われる。
SUCCESSカウンタの値が「5」未満の場合(ステップS703でNo)、次に、デバイスサーバ200との間のセッションの有無を判定する(ステップS705)。
デバイスサーバ200との間で「セッションなし」の場合(ステップS705でYes)、即ち、SUCCESSカウンタの値が「0」の場合は、デバイスサーバ200に対してセッション開始要求を送り、デバイスサーバ200とセッションを開始する(ステップS706)。
デバイスサーバ200との間で「セッションあり」の場合(ステップS705でNo)、即ち、SUCCESSカウンタの値が「1」以上「5」未満の場合、ステップS706の処理はスキップされる。
続いて、デバイスサーバ200に対してTURコマンドを送信する。デバイスサーバ200は、ストレージ300にTURコマンドを送り、ストレージ300で確認処理が実行され、その応答情報がデバイスサーバ200に返送される。デバイスサーバ200は、この応答情報をPC100に返送する(ステップS707)。
PC100は、デバイスサーバ200から送られてくる応答情報を受信すると、応答内容を確認する(ステップS708) 。
応答内容が「FAIL」であった場合 (ステップS708でNo)、デバイスサーバ200との間のセッションを維持したまま、SUCCESSカウンタの値を「0」にリセットし(ステップS715)、次のSCSIコマンドの受信待機状態に移る。
応答内容が「SUCCESS」であった場合(ステップS708でYes)、SUCCESSカウンタの値を1つインクリメントし(ステップS709)、続いて、SUCCESSカウンタの値が規定値「5」であるか否かを判定する(ステップS710)。
SUCCESSカウンタの値が規定値「5」未満の場合(ステップS710でNo)、デバイスサーバ200との間のセッションを維持したまま、次のSCSIコマンドの受信待機状態に移る。
SUCCESSカウンタの値が規定値「5」を示す場合(ステップS710でYes)、デバイスサーバ200との接続が定常状態であると判断してセッションを終了し(ステップS711)、次のSCSIコマンドの受信待機状態に移る。
一方、上述したステップS703の処理において、SUCCESSカウンタの値が規定値「5」以上の場合は(ステップS703でYes)、セッションが終了した状態、すなわち定常状態であるため、実際のネットワーク接続によるストレージ300への問い合わせは行わず、フィルタドライバ層113で擬似応答情報を生成し、SCSIコマンド層112に「SUCCESS」を返す(ステップS704)。そして、SCSIコマンド層112から上位層に対して「SUCCESS」が通知され、次のSCSIコマンドの受信待機状態に移る。
これ以降、フィルタドライバ層113がアクセス制御コマンドを受け取るまで、上述したステップS701〜S704が繰り返される。この間、PC100の上位層(OS110、アプリケーションプログラム111)およびSCSIコマンド層112では、ストレージ300が接続された状態と判断されているが、デバイスサーバ200とのセッションが切断されている状態、いわゆる「擬似接続状態」を維持することになる。
また、上述したステップS702の処理で、フィルタドライバ層113が解析したSCSIコマンドがアクセス制御コマンドである場合の処理について説明する。
SCSIコマンドがアクセス制御コマンドの場合(ステップS702でNo)、例えば、READコマンド/WRITEコマンドなどの場合、次に、デバイスサーバ200との間のセッションの有無を判定する(ステップS712)。
デバイスサーバ200との間で「セッションなし」の場合(ステップS712でYes)、SUCCESSカウンタの値が「0」の場合は、デバイスサーバ200に対してセッション開始要求を送り、デバイスサーバ200とセッションを開始する(ステップS713)。
デバイスサーバ200との間で「セッションあり」の場合(ステップS712でNo)、即ち、SUCCESSカウンタの値が「1」以上「5」未満の場合、ステップS713の処理はスキップされる。
続いて、デバイスサーバ200に対してREADコマンド/WRITEコマンドなどのSCSIコマンドを送信する。デバイスサーバ200は、ストレージ300に対しこのSCSIコマンドを送り、ストレージ300でREADコマンド/WRITEコマンドなどに応じた処理が実行され、その応答情報がデバイスサーバ200に返送される。デバイスサーバ200は、この応答情報をPC100に返送する(ステップS714)。
PC100は、デバイスサーバ200から送られてくる応答情報を受信すると、デバイスサーバ200とのセッションを維持したまま、SUCCESSカウンタの値を「0」にリセットし(ステップS715)、次のSCSIコマンドの受信待機状態に移る。
上記のSUCCESSカウンタは、フィルタドライバ層113がその機能の一部として備えるものでもよく、また、別のソフトウェアとして外部記憶部106に記録され、ソフトウェア群112〜116同様、CPU101の制御に従い、メモリ104上に読み出されて実行されるものでもよい。
上述したように、フィルタドライバ層113では、SUCCESSカウンタの値が規定値「5」となるまでの間にアクセス制御コマンドを受信した場合、又は、応答情報が「FAIL」である場合、SUCCESSカウンタの値を「0」にリセットする。
本実施の形態では、PC100とデバイスサーバ200との接続が定常状態であるかどうかの判断基準の一例として、SUCCESSカウンタの値を用いているが、規定値は「5」以外の値でも良く、ユーザが任意に設定できるようにしても良い。また、TURコマンドに対する応答が一定時間SUCCESSであることなどを条件にしても良い。
図8は、図7の制御フローに基づいて動作するPC100の状態遷移を示した図である。
状態801は、電源投入直後などPC100の初期状態である。このとき、デバイスサーバ200との間は「セッションなし」で、SUCCESSカウンタの値は初期値「0」である。
状態801において、ストレージ300に対するアクセスが発生すると、状態801から状態802に遷移する。
状態802は、デバイスサーバ200との接続がまだ定常状態になっていない状態である。このとき、デバイスサーバ200との間は「セッションあり」で、SUCCESSカウンタの値は「5」未満である。
状態802において、SCSIコマンドを生成してデバイスサーバ200に送出した後、デバイスサーバ200を介してストレージ300からの応答情報を受信すると、次の(a)、(b)、(c)の何れかの状態となる。
(a)TURコマンドの要求があり、これに対する応答が「SUCCESS」であり、SUCCESSカウンタの値が規定値「5」に達した場合、状態803に遷移する。
(b)TURコマンドの要求があり、これに対する応答が「SUCCESS」であり、SUCCESSカウンタの値が規定値「5」未満の場合は、状態802を維持する。
(c)アクセス制御コマンドの要求があり、これに対する応答があった場合、SUCCESSカウンタの値を「0」にリセットし、状態802を維持する。
このように、PC100は、上述した(a)の場合のみ、状態802から状態803に遷移する。
状態803は、デバイスサーバ200との接続が定常状態に達した状態、即ち、擬似接続状態を示している。このとき、デバイスサーバ200との間は「セッションなし」で、SUCCESSカウンタの値は規定値「5」以上である。
状態803において、OS110およびアプリケーションプログラム111からの指示によりSCSIコマンド層112がSCSIコマンドを生成したとき、次の(d)、(e)の何れかの状態となる。
(d)SCSIコマンドがTURコマンドの場合、フィルタドライバ層113で擬似応答情報を生成し、SCSIコマンド層112に対しSUCCESSを応答し、状態803を維持する。
(e)SCSIコマンドがアクセス制御コマンドの場合、デバイスサーバ200との間のセッションを開始し、デバイスサーバ200に対して生成したSCSIコマンドを送る。そして、デバイスサーバ200を介してストレージ300からの応答情報を受信すると、SUCCESSカウンタの値を「0」にリセットし、状態802へ遷移する。
このように、PC100は、ストレージ300にアクセスが必要なときだけ、デバイスサーバ200と間のセッションを開始してSCSIコマンドの送出を行うので、セッションの開始・切断を手動操作することなく、複数のクライアントPCによるストレージのアクセスを実現できる。また、クライアントPCからデバイスサーバ200に対して定期的に送出するTURコマンドを抑制し、ネットワーク上の通信量(トラフィック)を低減することができる。
次に、デバイスサーバ200の制御動作について図9を参照しながら説明する。
デバイスサーバ200では、PC100からのセッション開始要求又はセッション終了要求の受信を監視している。
セッション開始要求を受信した場合(ステップS901でYes)、他のPC100とセッション接続中か否かを確認する(ステップS902)。
既にセッションが開始されている場合(ステップS902でYes)、このPC100に対して「NG」を返す(ステップS903)。
セッションが開始されていない場合(ステップS902でNo)、このPC100とセッションを開始し(ステップS904)、応答情報として「OK」を返す(ステップS905)。
上述したステップS901の処理において、セッション開始要求以外のパケットを受信した場合(ステップS901でNo)、セッション終了要求であれば(ステップS906でYes)、セッション接続中のPC100との間のセッションを切断し(ステップS907)、応答情報として「OK」を返す(ステップS908)。
一方、上述したステップS906の処理において、セッション終了要求以外のパケットを受信した場合(ステップS906でNo)、そのパケットの種類に応じた応答処理を実行する(ステップS909)。
図10は、図9の制御フローに基づいて動作するデバイスサーバ200の状態遷移を示した図である。
状態1001は、デバイスサーバ200の初期状態である。このとき、PC100との間は「セッションなし」である。UDP(User Datagram Protocol)プロトコルを用いた通信などによる外部からの要求に応答し、状態1001を維持する。
ここで、PC100においてストレージ300に対するアクセスが発生すると、PC100からデバイスサーバ200に対してセッション開始要求が送られる。デバイスサーバ200は、セッション開始要求に応じてPC100との間のセッションを開始し、状態1002に遷移する(図10の(a))。
状態1002は、「セッションあり」の状態である。この状態では、次の(b)、(c)、(d)の処理を行い、状態1002を維持する。
(b)セッション接続中のPC100からコマンドを受信して、それをストレージ300に送信し、ストレージ300から受信する当該コマンドに対する応答情報をPC100に返送する。
(c)セッション接続中ではない他のPC100からセッション開始要求があった場合、そのPC100に対して新たにセッションを開始することができないため、「NG」を応答する。
(d)UDPプロトコルを用いた通信などによる外部からの要求に応答する。
一方、状態1002において、セッション接続中のPC100からセッション終了要求があった場合、当該PC100とのセッションを切断し、状態1001へ遷移する(図10の(e))。
このように、デバイスサーバ200では、PC100の状態遷移に応じて、「セッションなし」の状態1001と「セッションあり」の状態1002との遷移を繰り返す。
次に、上述したネットワークシステムにおいて、PC100Aからストレージ300へアクセスするときの具体的なタイミングチャートについて説明する。
簡略化して分り易く説明をするために、まず、PC100A一台だけがストレージ300にアクセスする場合(1対1で接続する場合)について、図11を参照しながら説明する。
ここでは、他のクライアントPCからのセッション開始要求の有無を考慮せず、PC100Aからのセッション開始要求に対して、デバイスサーバ200は常に「OK」を応答するものとする。
PC100Aにおいてストレージ300へのアクセスが発生した場合、ストレージドライバであるSCSIコマンド層112において、アクセスの種類に応じたSCSIコマンドが生成され、生成されたSCSIコマンドは、フィルタドライバ層113へ送信される(タイミングT1101)。
フィルタドライバ層113は、デバイスサーバ200に対してセッション開始要求を行う(タイミングT1102)。このとき、SUCCESSカウンタの値は初期値の「0」である。
デバイスサーバ200は、PC100Aに対して「OK」を応答して、PC100Aとの間のセッションを開始する(タイミングT1103)。
フィルタドライバ層113は、デバイスサーバ200から「OK」の応答がありセッションが開始されると、ストレージ300の状態を確認するためのTURコマンドを送信する(タイミングT1104)。
デバイスサーバ200は、TURコマンドを受信すると、これをストレージ300に送信する(タイミングT1105)。ストレージ300は、TURコマンドに応じた処理を実行し、処理が完了すると応答情報をデバイスサーバ200に返す(タイミングT1106)。デバイスサーバ200はストレージ300からの応答情報をPC100Aに送る(タイミングT1107)。
フィルタドライバ層113は、デバイスサーバ200から応答情報を受信し、これが「SUCCESS」であれば、SUCCESSカウンタの値を1インクリメントするとともにSCSIコマンド層112へ応答を返す(タイミングT1108)。
以後、規定値「5」になるまで定期的(例えば、1秒間隔)にTURコマンドを送出する(タイミングT1109)。そして、SUCCESSカウンタの値が規定値「5」になると、デバイスサーバ200に対してセッション終了要求を送り、デバイスサーバ200とのセッションを切断する(タイミングT1110)。
PC100Aでは、セッションが終了したあともSCSIコマンド層112が定期的にTURコマンドを送出するが(タイミングT1111)、フィルタドライバ層113はSUCCESSカウンタの値が規定値「5」以上となっているので、これ以降に送出するSCSIコマンドがTURコマンドである限り擬似応答情報をSCSIコマンド層112に返す(タイミングT1112)。
PC100Aの上位層(OS110、アプリケーションプログラム111)およびSCSIコマンド層112は、この擬似応答情報によってストレージ300とは接続状態であると認識する。この状態がいわゆる「擬似接続状態」である。
次に、擬似接続状態のPC100Aからストレージ300に対してデータの書き込み/読み出しなどのアクセスを行う場合について説明する。
擬似接続状態のPC100Aからストレージ300に対してデータの書き込み/読み出しなどのアクセスを行うときは、アクセス制御コマンド(READコマンドやWRITEコマンドなど)の送信に先立って、まず、フィルタドライバ層113がデバイスサーバ200に対してセッション開始要求を送る(タイミングT1113)。
デバイスサーバ200は、PC100Aに対して「OK」を応答して、PC100Aとの間でセッションを開始する(タイミングT1114)。
フィルタドライバ層113は、デバイスサーバ200から「OK」の応答がありセッションが開始されると、デバイスサーバ200に対してアクセス制御コマンドを送る(タイミングT1115)。
デバイスサーバ200は、PC100Aからアクセス制御コマンドを受信すると、USBパケットに変換してストレージ300へ送信する(タイミングT1116)。
ストレージ300では、デバイスサーバ200から送られてきたアクセス制御コマンドに応じた処理を実行し(例えば、データの書き込み/読み出しなど)、処理が終了するとその結果を応答情報としてデバイスサーバ200に送信する(タイミングT1117)。
デバイスサーバ200は、ストレージ300からの応答情報を受信すると、この応答情報をPC100Aに対して送信する(タイミングT1118)。
フィルタドライバ層113は、デバイスサーバ200から応答情報を受信すると、SUCCESSカウンタの値を「0」にリセットするとともにSCSIコマンド層112へ応答を返す(タイミングT1119)。
その後は上述と同様に、フィルタドライバ層113からTURコマンドを定期的に送出し、SUCCESSカウンタの値が規定値「5」になると、デバイスサーバ200に対してセッション終了要求を送り、デバイスサーバ200との間のセッションを切断する(タイミングT1120)。そして、再度ストレージ300にアクセスするときまでの間、擬似接続状態を維持する。
次に、実際の運用により近いケースとして、複数台のPC100(PC100A,PC100B)がストレージ300にアクセスする場合(N対1で接続する場合)について、図12を参照しながら説明する。
図12は、PC100Aがセッション接続中、若しくは、ストレージ300にアクセス中に、別のPC100Bからストレージ300にアクセスしたときのタイミングチャートを示した説明図である。なお、PC100Aについては、前述した図11と同じ動作であるため、詳細な説明は省略する。
まず、PC100Aとデバイスサーバ200がセッション接続中のとき、PC100Bがストレージ300にアクセスしようとした場合について説明する。
PC100Aとデバイスサーバ200との間でセッション接続中のとき、PC100Bがデバイスサーバ200にセッション開始要求を送る(タイミングT1201)。
デバイスサーバ200は、PC100Aとセッション接続中のため、PC100Aとの間のセッションが切断されるまで間、PC100Bに対して「NG」を返す(タイミングT1202)。
PC100Bは、デバイスサーバ200から「NG」の応答があると、定期的にセッション開始要求を再送する。
デバイスサーバ200は、PC100Aとのセッションが切断され、「セッションなし」の状態(PC100Aが擬似接続状態)になったとき、PC100Bからの「セッション開始要求」を受信すると、PC100Bとの間でセッションを開始する(タイミングT1203)。
PC100Bは、デバイスサーバ200とセッションが開始されると、ストレージ300の状態を確認するためTURコマンドを送信する(タイミングT1204)。
デバイスサーバ200は、TURコマンドを受信すると、これをストレージ300に送信する(タイミングT1205)。ストレージ300は、TURコマンドに応じた処理を実行し、処理が完了すると応答情報をデバイスサーバ200に返す。デバイスサーバ200はストレージ300からの応答情報をPC100Bに送る(タイミングT1206)。
PC100Bは、デバイスサーバ200から応答情報を受信し、これが「SUCCESS」であれば、SUCCESSカウンタの規定値を判定し、規定値「5」になるまで定期的(例えば、1秒間隔)にTURコマンドを送出する(タイミングT1207)。そして、SUCCESSカウンタの規定値「5」になると、デバイスサーバ200に対してセッション終了要求を送り、デバイスサーバ200とのセッションを切断する(タイミングT1208)。
この時点で、PC100A及びPC100Bは共に擬似接続状態であり、デバイスサーバ200は「セッションなし」の状態である(タイミングT1209)。
続いて、PC100Aがストレージ300にアクセス中(読出し中又は書き込み中など)に、PC100Bからストレージ300にアクセスしようとした場合について説明する。
上述したように、PC100AとPC100Bは共に擬似接続状態であり、デバイスサーバ200は「セッションなし」の状態であるとき、擬似接続状態のPC100Aからデバイスサーバ200にアクセスを開始すると、PC100Aからデバイスサーバ200に対してセッション開始要求が送られ、デバイスサーバ200との間のセッションが開始される。(タイミングT1210)
セッションが開始されると、PC100Aがデバイスサーバ200に対してアクセス制御コマンド(READコマンドやWRITEコマンドなど)を送出し(タイミングT1211)、デバイスサーバ200がストレージ300に対してアクセス制御コマンドを送る(タイミングT1212)。
ストレージ300では、アクセス制御コマンドに応じた処理(例えば、データの書き込み/読出しなど)を実行し、その結果を応答情報としてデバイスサーバ200を介してPC100Aに返信する(タイミングT1213)。
その後は上述と同様に、フィルタドライバ層113からSUCCESSカウンタの値が規定値「5」になるまで定期的に、TURコマンドをデバイスサーバ200に対して送出する(タイミングT1214)。
ここで、PC100Bがストレージ300へのアクセスを開始し、デバイスサーバ200にセッション開始要求を送ると、デバイスサーバ200は、PC100Bに対して「NG」を応答する(タイミングT1215)。
PC100Bは、デバイスサーバ200からの「NG」応答に対して、定期的にセッション開始要求を再送するが、PC100Aとデバイスサーバ200のセッションが切断されるまでは、デバイスサーバ200からは「NG」が応答される。
デバイスサーバ200とPC100Aとの間のセッションが終了し、デバイスサーバ200がセッションなしの状態になると、PC100Bからのセッション開始要求により、PC100Bとの間でセッションを開始する(タイミングT1216)。このときPC100Aは擬似接続状態である。
これ以降のPC100Bの動作は、上述したPC100Aと同様であり、セッションが開始されると、PC100Bがデバイスサーバ200を介してストレージ300にアクセス可能になる。
上述したように、第一の実施の形態におけるネットワークシステムでは、あるクライアントPCがストレージ300にアクセスするときだけ、クライアントPCとデバイスサーバ間のセッションを接続することにより、ネットワーク上の通信量(トラフィック)を低減することが可能となる。
また、高負荷な処理機能をデバイスサーバへ組み込む必要が無くなるため、安価なネットワークシステム構成で複数のクライアントPCからデバイスを共有することが可能となる。
次に、本発明の第二の実施の形態について図面を参照して詳細に説明する。本実施の形態は、図1〜図6、図8〜図12に図示した構成が、上記第一の実施の形態と同じであり、その説明を省略する。以下に、上記第一の実施の形態と異なる点のみを説明する。
第二の実施の形態におけるPC100(PC100A,PC100B)の基本制御フローについて、図13を参照しながら説明する。図13は第一の実施の形態における図7と同様、PC100がデバイスサーバ200を介してストレージ300にアクセスするときの制御動作の手順を示すフローチャートであるが、ステップS1310とステップS1311は、図7にはなかったステップである(詳細は後述)。
PC100において、ストレージ300へのアクセスが発生した場合、SCSIコマンド層112がアクセス要求の内容に応じたSCSIコマンド(図4参照)の生成を行い、生成されたSCSIコマンドは、フィルタドライバ層113へ送信される(ステップS1301)。
次に、フィルタドライバ層113が、生成されたSCSIコマンドを解析する(ステップS1302)。
SCSIコマンドがTURコマンドである場合(ステップS1302でYes)、フィルタドライバ層113では次に、TURコマンドに対する応答が「SUCCESS」であるときの回数をカウントしているカウンタ(以降、SUCCESSカウンタ)の値を判定する(ステップS1303)。この判定により、擬似接続状態であるか否かの判定が行われる。
SUCCESSカウンタの値が「5」未満の場合(ステップS1303でNo)、次に、デバイスサーバ200との間のセッションの有無を判定する(ステップS1305)。
デバイスサーバ200との間で「セッションなし」の場合(ステップS1305でYes)、即ち、SUCCESSカウンタの値が「0」の場合は、デバイスサーバ200に対してセッション開始要求を送り、デバイスサーバ200とセッションを開始する(ステップS1306)。
デバイスサーバ200との間で「セッションあり」の場合(ステップS1305でNo)、即ち、SUCCESSカウンタの値が規定値未満の場合、ステップS1306の処理はスキップされる。
続いて、デバイスサーバ200に対してTURコマンドを送信する。デバイスサーバ200は、ストレージ300にTURコマンドを送り、ストレージ300で確認処理が実行され、その応答情報がデバイスサーバ200に返送される。デバイスサーバ200は、この応答情報をPC100に返送する。なお、このとき、デバイスサーバ200は、他のクライアントPC(例えば、PC100B)から所定時間内に受信したセッション開始要求の有無をあわせて通知する。(ステップS1307)。
ここでいう所定時間とは、セッション開始後の累計時間や、定期的に送出されるTURコマンドの送出間隔(例えば、1秒間隔)を指すが、これに限定されるものではない。
PC100Aは、デバイスサーバ200から送られてくる応答情報を受信すると、応答内容を確認する(ステップS1308) 。
応答内容が「FAIL」であった場合 (ステップS1308でNo)、デバイスサーバ200との間のセッションを維持したまま、SUCCESSカウンタの値を「0」にリセットし(ステップS1317)、次のSCSIコマンドの受信待機状態に移る。
応答内容が「SUCCESS」であった場合(ステップS1308でYes)、SUCCESSカウンタの値を1つインクリメントする(ステップS1309)。
次に、PC100Aは、デバイスサーバ200との接続を擬似接続状態に移行するかの基準となる規定値を変更するか否かを判定する(ステップS1310)。この判定には、ステップS1307において、デバイスサーバ200から通知された他のクライアントPCからのセッション開始要求の有無に関する情報が用いられる。
他のクライアントPCからのセッション開始要求が「あり」の場合(ステップS1310でYes)、規定値を変更する(例えば、「5」から「3」に下げる)(ステップS1311)。
一方、他のクライアントPCからのセッション開始要求が「なし」の場合(ステップS1310でNo)、ステップS1311をスキップして規定値を変更しない。
続いて、SUCCESSカウンタの値が規定値であるか否かを判定する(ステップS1310)。ステップS1311で規定値を変更した場合には、変更後の規定値に基づいて判定される。
SUCCESSカウンタの値が規定値未満の場合(ステップS1310でNo)、デバイスサーバ200との間のセッションを維持したまま、次のSCSIコマンドの受信待機状態に移る。
一方、上述したステップS1303の処理において、SUCCESSカウンタの値が規定値以上の場合は(ステップS1303でYes)、セッションが終了した状態、すなわち定常状態であるため、実際のネットワーク接続によるストレージ300への問い合わせは行わず、フィルタドライバ層113で擬似応答情報を生成し、SCSIコマンド層112に「SUCCESS」を返す(ステップS1304)。そして、SCSIコマンド層112から上位層に対して「SUCCESS」が通知され、次のSCSIコマンドの受信待機状態に移る。
これ以降、フィルタドライバ層113がアクセス制御コマンドを受け取るまで、上述したステップS1301〜S1304が繰り返される。この間、PC100の上位層(OS110、アプリケーションプログラム111)およびSCSIコマンド層112では、ストレージ300が接続された状態と判断されているが、デバイスサーバ200とのセッションが切断されている状態、いわゆる「擬似接続状態」を維持することになる。
SUCCESSカウンタの値が規定値を示す場合(ステップS1310でYes)、デバイスサーバ200との接続が定常状態であると判断してセッションを切断し(ステップS1311)、次のSCSIコマンドの受信待機状態に移る。
また、上述したステップS1302の処理で、フィルタドライバ層113が解析したSCSIコマンドがアクセス制御コマンドである場合の処理について説明する。
SCSIコマンドがアクセス制御コマンドの場合(ステップS1302でNo)、例えば、READコマンド/WRITEコマンドなどの場合、次に、デバイスサーバ200との間のセッションの有無を判定する(ステップS1314)。
デバイスサーバ200との間で「セッションなし」の場合(ステップS1314でYes)、SUCCESSカウンタの値が「0」の場合は、デバイスサーバ200に対してセッション開始要求を送り、デバイスサーバ200とセッションを開始する(ステップS1315)。
デバイスサーバ200との間で「セッションあり」の場合(ステップS1314でNo)、即ち、SUCCESSカウンタの値が規定値未満の場合、ステップS1315の処理はスキップされる。
続いて、デバイスサーバ200に対してREADコマンド/WRITEコマンドなどのSCSIコマンドを送信する。デバイスサーバ200は、ストレージ300に対しこのSCSIコマンドを送り、ストレージ300でREADコマンド/WRITEコマンドなどに応じた処理が実行され、その応答情報がデバイスサーバ200に返送される。デバイスサーバ200は、この応答情報をPC100に返送する(ステップS1316)。
PC100は、デバイスサーバ200から送られてくる応答情報を受信すると、デバイスサーバ200とのセッションを維持したまま、SUCCESSカウンタの値を「0」にリセットし(ステップS1317)、次のSCSIコマンドの受信待機状態に移る。
上述したように、フィルタドライバ層113では、SUCCESSカウンタの値が規定値となるまでの間にアクセス制御コマンドを受信した場合、又は、応答情報が「FAIL」である場合、SUCCESSカウンタの値を「0」にリセットする。
上述したように、第二の実施の形態におけるネットワークシステムでは、デバイスサーバ200がPC100に対して、他のクライアントPCからのセッション開始要求の有無をあわせて通知することによって、PC100がより早く擬似接続状態に移行し、デバイスサーバ200とのセッションを開放することができる。
なお、本発明は、上述した実施の形態に限定されるものではなく、本発明の要旨を逸脱しない範囲内において適宜変更可能である。
上述した実施の形態では、1台のデバイスサーバが1台のストレージを管理する構成で説明したが、1台のサーバに複数のストレージを接続する構成としても良い。また、この場合はストレージ毎にセッションを用意し制御することで、複数のクライアントPCから、別々のストレージであれば、同時にアクセスが可能となる。
また、デバイスサーバとデバイスの接続インターフェースをUSBとした場合の構成で説明したが、これらに限定されず、別の接続インターフェースを使用しても良い。具体的には、IEEE1394に対応するためには、PC100が備えるUSBドライバ層114とデバイスサーバ200が備えるUSBコマンド層212が、それぞれIEEE1394ドライバ層とIEEE1394コマンド層が置き換われば良い。
さらにはPC100が複数の異なるドライバ層を持ち、デバイスサーバ200がそれに対応した複数の異なるコマンド層を備えるようにすれば、様々な接続インターフェースを備えたデバイスにも柔軟に対応できる。
また、本発明の目的は、上述した実施の形態の機能を実現するソフトウェアのプログラムコードを記録した記憶媒体を、システム或いは装置に供給し、そのシステム或いは装置のコンピュータ(またはCPUやMPU等)が記憶媒体に格納されたプログラムコードを読み出して処理を実行することによっても達成することができる。
この場合、記憶媒体から読み出されたプログラムコード自体が前述した実施の形態の機能を実現することになり、そのプログラムコードを記憶したコンピュータで読み取り可能な記憶媒体は本発明を構成することになる。
また、プログラムコードの指示に基づき、コンピュータ上で稼動しているOS(オペレーティングシステム)等が実際の処理の一部または全部を行い、その処理によって前述した実施形態の機能が実現されるように構成しても良い。
さらに、記憶媒体から読み出されたプログラムコードが、コンピュータに挿入された機能拡張ボードやコンピュータに接続された機能拡張ユニットに備わるメモリに書き込まれたあと、このプログラムコードの指示に基づき、その機能拡張ボードや機能拡張ユニットに備わるCPU等が実際の処理の一部または全部を実行し、その処理に応じて上述した実施形態が実現される場合も含んでいる。
なお、プログラムコードを供給するため、例えば、フロッピー(登録商標)ディスク、ハードディスク、光磁気ディスク、CDやDVDに代表される光ディスク、磁気テープ、不揮発性のメモリカード、ROM等の記憶媒体を用いることができる。または、プログラムコードは、ネットワークを介してダウンロードしてもよい。