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データベース
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 |
パーティションエントリはシステムがボリュームに割り当てたディスク上の領域を定義し、コンポーネントエントリはパーティションエントリとボリュームエントリを接続しています。また、ボリュームエントリは、Windowsがボリュームを識別するために内部で使用するGUIDを含んでいます。マルチパーティションボリュームは、3個以上のエントリを必要とします。たとえば、後ほど説明するストライプボリュームは、少なくともコンポーネントエントリとボリュームエントリの2つのエントリで構成されます。1個以上のコンポーネントエントリを持つボリュームタイプだけは、ミラーです。つまり、ミラーは2つのコンポーネントエントリを持ち、それぞれのエントリはミラーの一方を表しているわけです。LDMは、ミラー用の2つのコンポーネントを使用していますから、ミラーを分割すると、その分割はコンポーネントレベルで行われます。このため、分割後は、2つのボリュームが作成され、それぞれのボリュームはコンポーネントエントリを持っています。
LDMデータベースが持っているトランザクションログ領域は、2、3のセクタで構成され、更新対象となるデータベースのバックアップ情報を記憶しています。この領域があるおかげで、システムクラッシュや電源障害が発生しても、データベース内容が保護されることになります。LDMは、ログ内容を基に、以前のデータベース状態を再構築し、状態の一貫性を維持しています。
|
■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」 |
- Azure Web Appsの中を「コンソール」や「シェル」でのぞいてみる (2017/7/27)
AzureのWeb Appsはどのような仕組みで動いているのか、オンプレミスのWindows OSと何が違うのか、などをちょっと探訪してみよう - Azure Storage ExplorerでStorageを手軽に操作する (2017/7/24)
エクスプローラのような感覚でAzure Storageにアクセスできる無償ツール「Azure Storage Explorer」。いざというときに使えるよう、事前にセットアップしておこう - Win 10でキーボード配列が誤認識された場合の対処 (2017/7/21)
キーボード配列が異なる言語に誤認識された場合の対処方法を紹介。英語キーボードが日本語配列として認識された場合などは、正しいキー配列に設定し直そう - Azure Web AppsでWordPressをインストールしてみる (2017/7/20)
これまでのIaaSに続き、Azureの大きな特徴といえるPaaSサービス、Azure App Serviceを試してみた! まずはWordPressをインストールしてみる
|
|