BOOK Preview

インサイドMicrosoft Windows 第4版 下

第10章 ストレージ管理

10.2.2 ディスククラス、ポート、およびミニポートドライバ
10.2.3 ディスクデバイスオブジェクト
10.2.4 パーティションマネージャ

マイクロソフトプレスの書籍紹介ページ
書籍情報のページ
2005/10/25

10.2.2 ディスククラス、ポート、およびミニポートドライバ

 初期化時、Windows I/Oマネージャは、ハードディスクストレージドライバを起動します。Windowsのストレージドライバは、クラス/ポート/ミニポートドライバアーキテクチャに基づいています。Microsoftは、すべてのストレージデバイスに共通する機能を実装したストレージクラスドライバと、SCSI(Small Computer System Interface)バスやIDE(Integrated Device Electronics)システムなどの特定のバスに共通する機能を実装したストレージポートドライバを提供しています。OEMベンダーは、ポートドライバに組み入れられ、特定の実装製品へのインターフェイスをWindowsに提供するミニポートドライバを提供しています。

 ディスクストレージドライバアーキテクチャでは、クラスドライバのみが標準Windowsデバイスドライバインターフェイスに準拠しています。ミニポートドライバは、デバイスドライバインターフェイスの代わりに、ポートドライバインターフェイスを使用し、ポートドライバは、ミニポートドライバにWindowsへのインターフェイスを提供するデバイスドライバサポートルーチンを実装するだけです。このアプローチは、ミニポートドライバ開発者の役割を単純化し、オペレーティングシステム固有のポートドライバをMicrosoftが提供するため、Windows 98、Windows Millennium Edition、およびWindows間のミニポートドライババイナリ移植を可能とします。

 Windowsは、ディスク操作に共通する機能を実装したDisk(\Windows\System32\Drivers\Disk.sys)というクラスドライバを提供しています。Windowsはまた、多数のディスクポートドライバも提供しています。たとえば、Scsiport.sysはSCSIバス上にあるディスクのポートドライバであり、Atapi.sysはIDEベースシステムのポートドライバです。Windows Server 2003は、Scsiport.sysの代わりになるStorport.sysポートドライバを導入しました。このドライバは、ハードウェアRAIDとファイバチャネルアダプタの高性能機能を引き出すために設計されたものです。Storportモデルは、Scsiportと類似しているため、既存SCSIミニポートドライバのStorportへの開発者の移植負担を軽減しています。Storportを使用するために開発されたミニポートドライバは、Storportのパフォーマンス改善機能のいくつかを活用できます。たとえば、マルチプロセッサシステム上でのI/O起動と完了の同時実行、より柔軟なI/O要求キューアーキテクチャの制御メカニズム、あるいはハードウェア割り込みマスキング期間を最小化する低IRQLでのコード実行などが活用できます。

 Scsiport.sysとAtapi.sysドライバは、いずれもC-LOOKとして知られるディスクスケジューリングアルゴリズムを実装しています。ドライバは、ディスクI/O要求を、送信先となる第1セクタ(論理ブロック番号:LBN)により分類されるリスト内に置きます。この処理では、要求の開始セクタをキーとして、KeInsertByKeyDeviceQueueとKeRemoveByKeyDeviceQueue関数を呼び出しています(関数の詳細については、DDKドキュメントを参照してください)。これらの関数はI/O要求を項目と表現しています。要求にサービスを提供するとき、ドライバはリスト内の下位セクタから上位セクタに向かって順々に対処していきます。リストの終端に達すると、ドライバは先頭に戻り、再度処理を開始します。これは、新しい要求が次々に挿入される可能性があるからです。ディスク要求がディスク全体に拡散している場合、このアプローチはディスクヘッドを継続的に先頭から終端まで移動し続けることになります。Storport.sysは、ストレージ配列向けのI/O要求を管理するために使用されることが多いため、ディスクスケジューリングを実装していません。つまり、ディスクの先頭と終端という概念を持っていません。

 Windowsは、Adaptecの1540ファミリSCSIコントローラ用のAha154x.sysなどのいくつかのミニポートドライバを内蔵しています。ATAPIベースのIDEデバイスを少なくとも1つ持つシステム上では、Pciidex.sysとPciide.sysが連携してミニポート機能を提供しています。ほとんどのWindowsバージョンは、1つ以上のドライバを備えています。

■iSCSIドライバ

 iSCSIはディスクトランスポートプロトコルとして開発され、SCSIとTCP/IPネットワークを統合しました。この統合により、コンピュータは、ディスクをはじめとするブロックストレージデバイスとIPネットワーク経由で通信できるようになりました。SAN(Storage Area Network)は通常ファイバチャネルネットワーク上に構築されますが、管理者はiSCSIを活用し、ギガビットEthernetなどのネットワーク技術ベースの比較的安価なSANを作成し、スケーラビリティ、耐障害性、効率的なバックアップ、および高度なセキュリティを提供できます。WindowsのiSCSIサポートは、Microsofti SCSI ソフトウェアイニシエータとして実装され、MicrosoftのWebサイトからダウンロードできます(Windows 2000、Windows XP、およびWindows Server 2003上で動作します)。

 MicrosoftiSCSIソフトウェアイニシエータは、次のようなコンポーネントで構成されています。

  • イニシエータ ― このオプションコンポーネントは、iSCSIポートドライバ(\Windows\System32\Drivers\Iscsiprt.sys)とミニポートドライバ(\Windows\System32\Drivers\Msisci.sys)で構成され、TCP/IPドライバを使ってソフトウェアiSCSIを実装しています。このコンポーネントは、標準のEthernetアダプタとTCP/IPオフロードネットワークアダプタを通信ベースとしています。

  • イニシエータサービス ― このサービスは、\Windows\System32\Iscsiexe.exeに実装され、すべてのiSCSIイニシエータの発見とセキュリティ、ならびに、セッションの開始と終了を管理しています。iSCSIデバイス発見機能は、\Windows\System32\Iscsium.dllに実装され、iSNS(Internet Storage Name Service)プロトコルに準拠しています。

  • 管理アプリケーション ― 管理アプリケーションにはIscsicli.exeという、コマンドラインツールがあります。このツールは、iSCSIデバイスの接続とセキュリティ、および対応するコントロールパネルアプリケーションを管理します。

 いくつかのベンダーは、iSCSIプロトコルをハードウェアにオフロードするiSCSIアダプタを製造しています。イニシエータサービスは、(iSNSをサポートする)こうしたアダプタで動作するため、イニシエータサービスやiSCSIハードウェアが発見したiSCSIデバイスは、標準的なWindowsインターフェイス経由で認識、管理されます。

■マルチパスI/O(MPIO)ドライバ

 ほとんどのディスクデバイスは、コンピュータと1つの「パス(一連のアダプタ、ケーブル、およびスイッチ)」で接続されています。高可用性を必要とするサーバーは、「マルチパス」を採用しています。このソリューションでは、コンピュータとディスク間に複数の接続ハードウェアが用意されており、1つのパスに障害が発生した場合には、別の代替パスが使用されます。しかし、オペレーティングシステムやディスクドライバのサポートがない場合には、たとえば、2つのパスを持つディスクは2つの個別のディスクとなってしまいます。Windowsは、マルチパスI/Oサポートを組み入れ、マルチパスディスクを1つの単位として管理しています。このI/Oサポートは、「デバイス固有モジュール(DSM)」と呼ばれるサードパーティ製ドライバを利用し、パス管理の詳細を実装しています。要求ルートパスの選択を行うロードバランシングポリシーや、Windowsへのパス障害発生通知などを行うエラー検出メカニズムは、DSMをベースにして実装されています。MPIOサポートは、Windows 2000 Server、Advanced Server、Datacenter Server、Windows Server 2003で利用でき、Microsoft MPIOドライバ開発キットとしてハードウェアとソフトウェアベンダーにライセンス公開されています。

 Windows MPIOストレージスタックは、図10-2のような構成になっています。この図を見るとわかるように、マルチパスディスクドライブリプレースメント(\Windows\System32\Drivers\Mpdev.sys)は、標準のDisk.sysの代わりに使用されます。このドライバは、マルチパスディスクを表現するデバイスオブジェクトの所有権を握り、デバイスへのパスを管理する適切なDSMを特定します。このため、Mpdev.sysドライバは、1つのデバイスオブジェクトを作成し、マルチパスディスクを正確に表現できます。マルチバスドライバ(\Windows\System32\Drivers\Mpio.sys)は、デバイスの電源管理を含む、コンピュータとデバイス間の相互接続を管理します。Mpdev.sysは、管理対象となるデバイスの存在をMpio.sysに通知します。マルチパスポートフィルタ(\Windows\System32\Drivers\Mpsfltr.sys)は、ポートドライバの上位層を形成し、マルチパスディスクがデバイススタック経由で受け取る情報を管理できるようにしています。

図10-2 WindowsMPIOストレージスタック
 
実験:物理ディスクI/Oを監視する

 www.sysinternals.comからダウンロードできるDiskmonユーティリティは、ディスククラスドライバのETW(Event Tracing for Windows)を活用し、物理ディスクへのI/O要求を監視し、収集情報をウィンドウに表示します(ETWについては、第3章を参照してください)。Diskmonは、ウィンドウ画面を1秒間に1回の割合で更新します。個々のI/O要求の表示情報は、発生時刻、期間、目的のディスク番号、タイプとオフセット、および長さを含んでいます。

10.2.3 ディスクデバイスオブジェクト

 Windowsディスククラスドライバは、ディスクとパーティションを表現するデバイスオブジェクトを作成します。ディスクを表現するデバイスオブジェクトは、\Device\HarddiskX\DRXという形式の名称を持ちます。ディスクを識別する番号は、Xの部分に入ります。ディスククラスドライバは、I/OマネージャのIoReadPartitionTable関数(Windows 2000)か、IoReadPartitionTableEx関数(Windows XPとWindows Server 2003)を呼び出し、パーティションを識別したうえで、関連するデバイスオブジェクトを作成します。ブートプロセスの初期の段階で特定したディスクをミニポートドライバがディスククラスドライバに知らせると、ディスククラスドライバはIoReadPartitionTableやIoReadPartitionTableExをそれぞれのディスクに対して呼び出します。これらの関数は、クラス、ポート、およびミニポートドライバが提供するセクタレベルディスクI/Oを実行し、それぞれのディスクのMBRあるいはGPTスタイルのパーティションテーブル(後述します)を読み込み、ディスクの固定パーティションの内部表現データを作成します。ディスククラスドライバは、IoReadPartitionTableやIoReadPartitionTableExで取得した、それぞれのプライマリパーティション(拡張パーティション内の論理ドライブを含みます)を表現するデバイスオブジェクトを作成します。パーティションオブジェクト名は、たとえば、次のようになります。

\Device\Harddisk0\DP(1)0x7e000-0x7ff50c00+2

 このサンプル名は、システムの第1ディスク上の第1パーティションを示しています。最初の2つの16進数(0x7e000と0x7ff50c00)は、パーティションの先頭と長さを示し、最後の数値は、クラスドライバが割り当てている内部識別子を示しています。

 Windows NT 4命名規約と使用するアプリケーションとの互換性を維持するために、ディスククラスドライバは、ドライバが作成したデバイスオブジェクトを指すWindows NT 4書式名を使ってシンボルリンクを作成します。たとえば、ディスククラスドライバは、\Device\Harddisk0\DR0を指す\Device\Harddisk0\Partition0リンクを作成します。同じように、第1ディスクの第1パーティションデバイスオブジェクトを指す\Device\Harddisk0\Partition1リンクを作成します。クラスドライバはまた、Windows NT 4システム内に作成した、物理ドライブを表現する同一のシンボルリンクをWindows内に作成します。たとえば、\??\PhysicalDrive0は\Device\Harddisk0\DR0を指します。図10-3は、www.sysinternals.comからダウンロードできるWinobjユーティリティの実行画面ですが、基本ディスクのHarddiskディレクトリの内容が表示されています。右側のペインには、物理ディスクとパーティションデバイスオブジェクトが見えます。

図10-3 基本ディスクのHarddiskディレクトリを表示するWinobj

 第3章で触れたように、Windows APIはWindowsオブジェクトマネージャ名前空間を認識しません。Windowsは、2つの名前空間サブディレクトリを予約しています。1つは、\Global??(Windows 2000では\??)サブディレクトリです(残りの1つは、第3章で取り上げた\BaseNamedObjectsサブディレクトリです)。Windowsは、このサブディレクトリからデバイスオブジェクト(COM、パラレルポート、ディスクなど)を公開し、Windowsアプリケーションが対話できるようにしています。ディスクオブジェクトは、実際には他のサブディレクトリに置かれていますから、Windowsはシンボルリンクを使用して\Global??下の名前と名前空間内の他の箇所に置かれているオブジェクトを接続します。システム上の個々の物理ディスクに対しては、I/Oマネージャが\Device\HarddiskX\Partition0を指す\Global??\PhysicalDriveXリンクを作成しています(番号は0から始まり、Xの部分に番号が入ります)。ディスク上のセクタと直接対話するWindowsアプリケーションは、WindowsのCreateFile関数を呼び出し、「\\.\PhysicalDriveX」という名前をパラメータに指定することにより、目的のディスクをオープンします(Xにはディスク番号が入ります)。Windowsアプリケーション層は、この名前を「\Global??\PhysicalDriveX」に変換し、その後、Windowsオブジェクトマネージャに渡します。

10.2.4 パーティションマネージャ

 パーティションマネージャ(\Windows\System32\Drivers\Partmgr.sys)は、PnPマネージャにパーティションの存在を通知する機能を提供しています。この後で説明するボリュームマネージャは、パーティションの作成と削除に関する通知をPnPマネージャから受け取ります。

 パーティションマネージャは、パーティションを認識するために、ディスククラスドライバが作成したディスクデバイスオブジェクト用のファンクションドライバとして機能します。システムドライバブート時、システムにアタッチされているディスクのパーティションテーブルが読み込まれ(Windows 2000ではIoReadPartitionTableカーネル関数であり、Windows XPとWindows Server 2003ではIoReadPartitionTableEx関数)、PnPマネージャに通知されます。ボリュームマネージャデバイスドライバは、管理対象となるディスクのパーティションに関する通知を受信し、ボリュームを構成するすべてのパーティションを考慮したうえで、ボリュームオブジェクトを作成します。パーティションマネージャのデバイスオブジェクトは、ディスクデバイスオブジェクトをフィルタするため、パーティションマネージャは、パーティションテーブル修正に関するI/O要求パケット(IRP)を監視し、内部パーティションマップを更新できるようになっています。更新後は、パーティションの作成と削除をPnPマネージャに通知します。


 INDEX
  インサイドMicrosoft Windows 第4版 下
  第10章 ストレージ管理
    10.1 ストレージ関連用語/10.2 ディスクドライバ/10.2.1 Ntldr
  10.2.2 ディスククラス、ポート、およびミニポートドライバ/10.2.3 ディスクデバイスオブジェクト/10.2.4 パーティションマネージャ
    10.3 ボリューム管理/10.3.1 基本ディスク
    10.3.2 ダイナミックディスク
    10.3.3 マルチパーティションボリューム管理
    10.3.4 ボリューム名前空間NEW!
    10.3.5 ボリュームI/O処理/10.3.6 仮想ディスクサービス(VDS)/10.3.7 ボリュームシャドウコピーサービス/まとめNEW!
 
インデックス・ページヘ  「BOOK Preview」


Windows Server Insider フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Windows Server Insider 記事ランキング

本日 月間