BOOK Preview

インサイドMicrosoft Windows 第4版 下

第10章 ストレージ管理

10.3.2 ダイナミックディスク

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

10.3.2 ダイナミックディスク

 既に触れたように、ダイナミックディスクは、ミラー、ストライプ、および後述するRAID5のようなマルチパーティションボリュームを作成するために必要な、Windowsにおけるディスクフォーマットです。ダイナミックディスクは、論理ディスクマネージャ(LDM)パーティショニングを使って管理されます。WindowsのLDMサブシステムは、ユーザーモードとデバイスドライバコンポーネントで構成され、ダイナミックディスクを管理します。Microsoftは、VERITASソフトウェアからLDMライセンス供与を受けています(LDMは、元々はUNIXのために開発された技術です)。堅牢なパーティショニングとマルチパーティションボリュームを提供するために、VERITASはMicrosoftと協力し、LDMをWindowsに移植しました。LDMパーティショニングとMBR/GPTパーティショニング間の大きな違いは、LDMが1つのデータベースを持っていることです。このデータベースは、システム上のすべてのダイナミックディスクに関する統一的なパーティショニング情報を記憶しています。たとえば、マルチパーティションボリューム構成情報などは、このデータベースに格納されます。

   

 LDMのUNIXバージョンは「ディスクグループ」を組み入れています。ファイルシステムが1つのディスクグループに割り当てるすべてのダイナミックディスクは、共通のデータベースを共有します。Windows用に市販しているVERITASのボリューム管理ソフトウェアもこのディスクグループを含んでいますが、Windows LDM実装は1つのディスクグループを持っているだけです。

■LDMデータベース

 LDMデータベースは、個々のダイナミックディスクの最後に予約されている1MB空間に置かれます。これは、Windowsの基本ディスクからダイナミックディスクへの変換時の条件なのです。つまり、基本ディスクをダイナミックディスクに変換するときには、基本ディスクの最後に空き空間が必要となるのです。LDMデータベースは、図10-5に示すように、ヘッダー、TOC(Table of Contents:目次)、データベースレコード、およびトランザクションログという4つの領域で構成されています(図10-5には第5の領域がありますが、ヘッダーのコピーにすぎません)。なお、LDMはヘッダーをプライベートヘッダーと呼んでいます。プライベートヘッダーセクタは、ダイナミックディスクの最後の1MBの直前に置かれ、データベース境界を固定します。Windowsをちょっとの間使ってみると、ほとんどすべてのものを特定するためにGUIDが使われていることに気付くはずです。ディスクも例外ではありません。GUIDは、Windows内の各種のコンポーネントがオブジェクトを特定するために使用する128ビットの値です。LDMは、個々のダイナミックディスクにGUIDを割り当て、プライベートヘッダーは自分が置かれているダイナミックディスクのGUIDを記録しています。このため、プライベートヘッダーの情報は、そのディスクにプライベートなものとなります。プライベートヘッダーはまた、ディスクグループの名前を記憶しています。記憶している名前は、コンピュータ名とDg0を連結して成り立っています(たとえば、コンピュータ名がDarylである場合、ディスクグループはDarylDg0となります)。さらに、プライベートヘッダーは、データベースのTOC先頭へのポインタも記憶しています(既に触れたように、LDMのWindows実装は1つのディスクグループを持っているだけですから、ディスクグループ名は常にDg0で終わります)。信頼性を改善するため、LDMは、ディスクの最終セクタにプライベートヘッダーのコピーを保存しています。

 データベースのTOCは、大きさが16セクタで、データベースのレイアウト情報を保持しています。LDMは、データベースレコードヘッダーとなるセクタを持つTOCの直後からデータベースレコード領域を開始します。このセクタには、格納されているレコード数、データベースが関係しているディスクグループの名前とGUID、データベース内に次に作成するエントリ用のシーケンシャル番号識別子などが格納されます。データベースレコードヘッダーに続くセクタは、128バイトの固定長のレコードであり、ディスクグループのパーティションとボリュームを示すエントリを記憶しています。

図10-5 LDMデータベースレイアウト

 それぞれのデータベースエントリは、パーティション、ディスク、コンポーネント、あるいはボリュームのいずれかのタイプになることができます。LDMは、これらのエントリタイプを使って、ボリュームを表現する3つのレベルを識別しています。LDMは、エントリを内部のオブジェクト識別子に接続しています。最も低レベルな「パーティション」は、ディスク上の連続領域であるソフトパーティションを定義します。パーティションエントリに格納される識別子は、そのエントリをコンポーネントとディスクエントリにリンクします。「ディスクエントリ」は、ディスクグループの一部であるダイナミックディスクを表し、ディスクのGUIDを記憶します。「コンポーネントエントリ」は、1つ以上のパーティションエントリと、それぞれのパーティションが関連しているボリュームエントリ間のコネクタとしての役割を果たします。「ボリュームエントリ」は、ボリュームのGUID、合計サイズ、状態、およびドライブ文字ヒントを記憶します。データベースレコードを超える大きさのディスクエントリは、

 複数のレコードとして格納されます。ただし、パーティション、コンポーネント、およびボリュームタイプのエントリは、複数レコードにまたがるようなことはめったにありません。

 LDMは、1つの単純なボリュームを表現する際にも、パーティション、コンポーネント、およびボリュームという3種類のエントリを必要とします。次のリストは、1個のパーティション構成の、200MBのボリュームを定義する単純なLDMデータベースの内容を示しています。

Disk Entry      Volume Entry    Component Entry   Partition Entry
Name: Disk1     Name: Volume1   Name: Volume1-01  Name: Disk1-01
GUID: XXX-XX... ID: 0x408       ID:0x409          ID: 0x407
Disk ID: 0x404  State: ACTIVE   Parent ID: 0x408  Parent ID: 0x409
                Size: 200MB                       Disk ID: 0x404
                GUID: XXX-XX...                   Start: 300MB
                Drive Hint: H:                    Size: 200MB

 パーティションエントリはシステムがボリュームに割り当てたディスク上の領域を定義し、コンポーネントエントリはパーティションエントリとボリュームエントリを接続しています。また、ボリュームエントリは、Windowsがボリュームを識別するために内部で使用するGUIDを含んでいます。マルチパーティションボリュームは、3個以上のエントリを必要とします。たとえば、後ほど説明するストライプボリュームは、少なくともコンポーネントエントリとボリュームエントリの2つのエントリで構成されます。1個以上のコンポーネントエントリを持つボリュームタイプだけは、ミラーです。つまり、ミラーは2つのコンポーネントエントリを持ち、それぞれのエントリはミラーの一方を表しているわけです。LDMは、ミラー用の2つのコンポーネントを使用していますから、ミラーを分割すると、その分割はコンポーネントレベルで行われます。このため、分割後は、2つのボリュームが作成され、それぞれのボリュームはコンポーネントエントリを持っています。

 LDMデータベースが持っているトランザクションログ領域は、2、3のセクタで構成され、更新対象となるデータベースのバックアップ情報を記憶しています。この領域があるおかげで、システムクラッシュや電源障害が発生しても、データベース内容が保護されることになります。LDMは、ログ内容を基に、以前のデータベース状態を再構築し、状態の一貫性を維持しています。

実験:LDMデータベースを調べる

 LDMデータベースの詳細内容を調べたい場合には、www.sysinternals.comからダウンロードできるLDMDumpユーティリティを使用できます。このユーティリティは、ディスク番号をコマンドラインパラメータとして受け取ります。出力情報は、画面に納まりきれない量になるのが普通ですから、出力内容をファイルにパイプ切り替え、後でテキストエディタでじっくり検討するとよいでしょう。たとえば、ldmdump/d0>disk.txtなどと入力します。次に紹介する出力例は、LDMDump実行後の一部です。LDMデータベースヘッダーがまず表示され、次に、4GBの単純なボリュームを持つ、4GBディスクを記述するLDMデータベースレコードが続きます。ボリュームのデータベースエントリは、Volume1とリストされています。出力結果の最後には、ボリュームのソフトパーティションと定義リストが返されています。

C:\>ldump /d0
Logical Disk Manager Configuration Dump v1.03
Copyright (C) 2000-2002 Mark Russinovich

PRIVATE HEAD:
Signature            : PRIVHEAD
Version              : 2.11
Disk Id              : b78e4169-2e39-4a57-a98b-afd7131392f9
Host Id              : 1b77da20-c717-11d0-a5be-00a0c91db73c
Disk Group Id        : 2ea3c400-c92a-4172-9286-de46dda1098a
Disk Group Name      : Vmware03Dg0
Logical disk start   : 3F
Logical disk size    : 7FF54B (4094 MB)
Configuration start  : 7FF7E0
Configuration size   :  800 (1 MB)
Number of TOCs       : 1
TOC size             : 7FE (1023 KB)
Number of Configs    : 1
Config size          : 5AC (726 KB)
Number of Logs       : 1
Log size             : DC (110 KB)

TOC 0:
Signature            : TOCBLOCK
Sequence             : 0x9
Config bitmap start  : 0x11
Config bitmap size   : 0x5AC
...

VBLK DATABASE:
0x000004: [000004] <Disk>
         Name        : Disk1
         Object Id   : 0x0403
         Disk Id     : b78e4169-2e39-4a57-a98b-afd7131392f9

0x000005: [000002] <DiskGroup>
         Name        : Vmware03Dg0
         Object Id   : 0x0401
         GUID        : 2ea3c400-c92a-4172-9286-de46dda1098a

0x000006: [000006] <Volume>
         Name        : Volume1
         Object Id   : 0x0406
         Volume state: ACTIVE
         Size        : 0x007FB68A (4086 MB)
         GUID        : e6ee6edc-d1ba-11d8-813e-806e6f6e6963
         Drive Hint  : C:


...
PARTITION LAYOUT:
Disk Disk1:
         Disk1-01 Offset: 0x00000000 Length: 0x007FB68A (4086 MB)
VOLUME DEFINITIONS: Volume1 Size: 0x007FB68A (4086 MB)
    Volume1-01 -
       Disk1-01 VolumeOffset: 0x00000000 Offset: 0x00000000 Length:
0x007FB68A

■LDMとGPT/MBRスタイルパーティショニング

 コンピュータにWindowsをインストールするとき、システムのプライマリ物理ディスク上にパーティションを作成する必要があります。Windowsは、このパーティション上のシステムボリュームにブートプロセスの初期の段階で呼び出すファイルを格納することになっています。さらに、Windowsセットアップは、ブートボリュームのホームとなるパーティションを作成するように要求し、作成後、そこにシステムファイルを格納し、システムディレクトリ(\Windows)を作成します。システムとブートボリュームは同一のボリュームとなることができ、その場合、ブートボリューム用のパーティションを新規作成する必要はありません。Microsoftが使用するシステムボリュームとブートボリュームという用語の意味は、ちょっとした混乱を発生させているようです。システムボリュームというのは、Windowsがブートローダー(Ntldr)とNtdetectを含むブートファイルを格納するボリュームを指しています。一方、ブートボリュームは、コアカーネルファイルであるNtoskrnl.exeなどのオペレーティングシステムファイルを格納するボリュームです。

 ダイナミックディスクのパーティショニングデータはLDMデータベース内に置かれますが、LDMはMBRスタイルパーティショニングやGPTパーティショニングを実装し、ボリュームがダイナミックディスクにあるときに、Windowsブートコードがシステムとブートボリュームを見つけ出せるようにしています(たとえば、NtldrとIA64ファームウェアは、LDMパーティショニングについては何も知らないのです)。ディスクがシステムやブートボリュームを含んでいる場合、MBRやGPTパーティションテーブル内のパーティションはそれらのボリュームの位置を記述しています。記述されていない場合には、1つのパーティションはディスクの利用可能領域全体を含んでいることになります。LDMは、このパーティションに「LDM」という印を付けます(このパーティションタイプはWindows 2000で導入されました)。この種のプレースホルダMBRスタイルやGPTパーティションがカバーする領域には、LDM作成パーティションが置かれ、LDMデータベースにより組織化されます。MBRパーティションディスク上では、LDMデータベースはディスクの最後の隠しセクタに置かれます。GPTパーティションディスクの場合には、LDMメタデータパーティションというものがあり、ディスクの先頭付近のLDMデータベースをカバーしています。

 LDMがMBRスタイルやGPTパーティションテーブルを作成する理由は、もう1つあります。Windowsやデュアルブート環境で採用されている、他のオペレーティングシステム内で動作する旧式のディスク管理ユーティリティの中には、ダイナミックディスクを未パーティションディスクと誤って認識してしまう製品があるからなのです。

 LDMパーティションは、MBRスタイルやGPTパーティションテーブル内には記述されていないため、「ソフトパーティション」と呼ばれています。一方、MBRスタイルやGPTパーティションは、「ハードパーティション」と呼ばれています。図10-6は、MBRスタイルパーティションディスク上のダイナミックディスクレイアウトを示しています。

図10-6 ダイナミックディスクの内部構成

■ダイナミックディスクボリュームマネージャ

 図10-7に示したディスク管理MMCスナップインDLL(\Windows\System32\Dmdskmgr.dllに実装されているDMDiskManager)は、DMAdmin(\Windows\System32\Dmadmin.exeに実装されているLDMディスク管理サービス)を使用し、LDMデータベース内容を作成、変更しています。ディスク管理MMCスナップインを起動すると、DMDiskManagerはDMAdminをメモリにロードし、(起動されていない場合には)それを起動します。DMAdminは、個々のディスクからLDMデータベースを読み込み、読み込んだ内容をDMDiskManagerに返します。DMAdminが別のコンピュータのディスクグループにあるデータベースを検出した場合には、ディスク上のボリュームが別のコンピュータのものであることを記憶し、必要になった時点で、データベース内容を現在のコンピュータのデータベースにインポートします。ダイナミックディスクの構成を変更した場合、DMDiskManagerはその変更をDMAdminに通知し、DMAdminはデータベースのインメモリコピーを更新します。DMAdminがコミット変更を行うと、更新データベースをDMIOに渡します。この場合のDMIOは、Dmio.sysデバイスドライバを指しています。このドライバは、FtDiskのダイナミックディスクバージョンに等しく、オンディスクデータベースへのアクセスを制御し、ダイナミックディスク上のボリュームを表現するデバイスオブジェクトを作成します。ディスクマネージャを終了すると、DMDiskManagerは動作を停止し、DMAdminサービスをアンロードします。

図10-7 ディスク管理MMCスナップイン

 DMIOは、データベースを解釈する方法を知りません。DMAdminがロードするDMConfig(\Windows\System32\Dmconfig.dll)ともう1つのデバイスドライバであるDMBoot(Dmboot.sys)は、データベースを解釈する機能を実装しています。DMConfigは、データベースを読み出し、更新する方法を知っています。DMBootは、データベース内容を読み出す機能を提供しているにすぎません。DMBootは、別のLDMドライバであるDMLoad(Dmload.sys)がシステム内に少なくとも1つのダイナミックディスクが存在することを確認した場合、ブートプロセスの間にロードされます。DMLoadは、DMIOに問い合わせ、ダイナミックディスクの存在を確認しています。DMLoadはDMBootを起動し、LDMデータベースを走査します。DMBootは、それぞれのボリュームの構成をDMIOに通知し、DMIOがそれぞれのボリュームを表現するデバイスオブジェクトを作成できるようにします。DMBootは、走査が終了すると、即座にメモリからアンロードされます。DMIOは、データベース解釈ロジックを持っていないため、小さなプログラムです。これは、DMIOが常にロードされるため、メモリ消費を抑える意味で望ましいことといってよいでしょう。

 FtDiskと同じように、DMIOはバスドライバであり、検出したそれぞれのダイナミックディスクボリュームに対してデバイスオブジェクトを作成します。作成されるデバイスオブジェクトは、\Device\HarddiskDmVolumes\PhysicalDmVolumes\BlockVolumeXという形式を持っています(Xの部分には、DMIOがボリュームに割り当てる識別子が入ります)。DMIOはまた、構造を持たない生のI/Oを表現する別のデバイスオブジェクトを作成しています。このオブジェクトは、\Device\HarddiskDmVolumes\PhysicalDmVolumes\RawVolumeXという形式を持っています。図10-8は、3個のダイナミックディスクボリュームで構成されるシステム上に、DMIOが作成したデバイスオブジェクトを示しています。DMIOはまた、それぞれのボリュームへの多数のシンボルリンクをオブジェクトマネージャ名前空間内に作成しています。シンボルリンクは、\Device\HarddiskDmVolumes\ComputerNameDg0\VolumeYという形式を持っています。DMIOは、ComputerNameに実際のコンピュータ名で、Yをボリューム識別子(DMIOがデバイスオブジェクトに割り当てる内部の識別子と異なるもの)でそれぞれ置き換えます。これらのリンクは、PhysicalDmVolumesディレクトリ内にあるブロックデバイスオブジェクトを指しています。

図10-8 DMIOドライバが作成したデバイスオブジェクト
 

 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 記事ランキング

本日 月間