記憶域スペースの NumberOfColumns と仮想ディスクの拡張について

こんにちは、Windows プラットフォーム サポートの鎌滝です。
今回は記憶域スペースの機能を利用して、作成した仮想ディスクを拡張する場合の注意点についてお伝えいたします。

まず、記憶域スペース機能の概要をご紹介いたします。
記憶域スペースは Windows Server 2012 / Windows 8 からの新機能で、ソフトウェア定義ストレージ (ディスクの仮想化) 機能を提供します。複数の物理ディスクをプールとして管理し、その中から必要な容量の仮想ディスクを切り出して利用します。この機能を利用することで、物理ディスクを複数束ねて、物理ディスクの容量以上のディスクを利用したり、I/O の負荷を分散させたり、また、物理ディスクの耐障害性などを実現することができます。
詳細については、以下の情報をご参照ください。

記憶域スペースの概要
https://technet.microsoft.com/ja-jp/library/hh831739(v=ws.11).aspx

Azure 環境で利用可能なディスクのサイズは、現在日本では 1 本 1023 GB (近々 4095 GB に拡張予定) との制限があるため、1 本分以上のサイズのディスクを使用したい場合は、この記憶域スペースの機能を使用して複数のディスクをプール化し、その記憶域プールから 1 本のディスクより大きい仮想ディスクを作成する必要があります。

記憶域スペースを利用した環境でこの記憶域スペースの仮想ディスクの拡張が必要なケースが出てくることは珍しくありません。
例えば 1 TB の物理ディスク 3 本でプールを作って、3 TB のディスクを利用していたが、運用が進むにうちに空き容量がひっ迫し、さらに 1 TB のディスクを追加して 4 TB のディスクに拡張したい、といったケースです。
そういった環境で、物理ディスクを記憶域プールには追加できたものの、仮想ディスクの拡張がグレーアウトされていて実行できない、というお問合せをいただくことがあります。

これは、仮想ディスクの NumberOfColumns の値に依存する、想定された挙動です。NumberOfColumns は仮想ディスクのストライプ数、つまり 1 つのデータが仮想ディスクを構成する物理ディスクのうち、何本の物理ディスクに分散して書き込まれるかを決定する属性です。仮想ディスクの拡張のためには、そのストライプ数を維持するため、NumberOfColumns の数の単位の利用可能な物理ディスクが必要となります。GUI (サーバー マネージャー) を利用して仮想ディスクを作成すると、シンプル ボリュームを選択した場合でも複数の物理ディスクにストライピングを行い、その既定のストライプ数 (NumberOfColumns) は仮想ディスクを作成したときに利用可能な物理ディスクの本数と同じになります。例をあげると、はじめに 3 本の物理ディスクの存在する記憶域プール内に作成した仮想ディスクは、NumberOfColumns が 3 で作成されているため、ディスクの拡張のためにも 3 本単位での利用可能な物理ディスクが必要になります。

NumberOfColumns は仮想ディスク作成後に変更することができないため、拡張が見込まれている領域に記憶域スペースのディスクを割り当てる場合には、注意が必要です。なお、仮想ディスクの現在の NumberOfColumns の値を調べるためには、以下の PowerShell コマンドレットを実行してください。

> Get-VirtualDisk –FriendlyName "<仮想ディスク名>" | FL NumberOfColumns

[参考情報]
Windows Server 2012 R2 記憶域スペースのアーキテクチャーと設計・管理のベストプラクティス
https://download.microsoft.com/download/0/7/B/07BE7A3C-07B9-4173-B251-6865ADA98E5D/WS2012R2_StorageSpace_ConfigGuide_v1.0.docx
記憶域スペースに関するFAQ - 記憶域スペースを作成したあとに変更できない主な属性 項 参照

先述の例のように、最初 3 本で構成した仮想ディスクに同じ容量のディスクを 1 本単位で追加したい場合は、GUI からではなく、New-VirtualDisk PowerShell コマンドレットの -NumberOfColumns オプションを利用すると NumberOfColumns を指定して、仮想ディスクを作成することができます。("回復性" (ResiliencySettingName) のタイプによっては、パリティを利用するため、ストライプ数を 1 に設定できません。)

実行例) 全ての物理ディスクを利用するが、NumberOfColumns は 1 のシンプル仮想ディスクを作成する場合
> New-VirtualDisk -StoragePoolFriendlyName "<記憶域プール名>" -FriendlyName "<仮想ディスク名>" -NumberOfColumns 1 -ProvisioningType Fixed -ResiliencySettingName Simple -UseMaximumSize

また、GUI の場合は、NumberOfColumns を指定できないため、まず 1 本の物理ディスクのみが存在するプールにて仮想ディスクを作成いただき、その後、物理ディスクのプールへの追加および仮想ディスクの拡張を実施いただくことでも回避策となります。

詳細は以下のブログでの紹介されておりますので、ご参照ください。

Cannot Extend Simple Virtual Disk in Windows Server 2012 R2
https://blogs.technet.microsoft.com/askcore/2013/12/18/cannot-extend-simple-virtual-disk-in-windows-server-2012-r2/

なお、NumberOfColumns はストライプ数の指定であるため、この値を小さくすることは、パフォーマンスに影響が出る可能性があります。仮想ディスクの作成時には、拡張性だけでなく、パフォーマンスの観点からも、適切な NumberOfColumns 数をご検討ください。

最後に、補足とはなりますが、今後さらに仮想ディスクを拡張する予定がある場合は、ファイル システムのフォーマット時に指定するクラスター サイズについても注意が必要です。

既定値の 4 KB のクラスター サイズの場合、ボリュームのサイズの上限は 16 TB となり、このクラスター サイズの変更は、ファイル システムの作成後には実施できません。(再フォーマットが必要です。) 今後の運用を考慮に入れた際に、さらにディスクの追加を行い、16 TB 以上のディスクを使用する可能性がある環境では、仮想ディスク上のファイル システムのフォーマット時に既定値 (4 KB) より大きいクラスターサイズを指定しておくことをお勧めいたします。

NTFS の概要
https://msdn.microsoft.com/ja-jp/library/dn466522%28v=ws.11%29.aspx?f=255&MSPPError=-2147217396

クラスター サイズごとのサポートされるボリュームの最大サイズは、上記リンクの "実際の適用例" 項に記載されています。今後拡張される可能性のあるボリューム サイズが作成した仮想ディスクのクラスター サイズで対応可能かどうかも併せて確認ください。

[参考情報]
Storage Spaces Frequently Asked Questions (FAQ)
https://social.technet.microsoft.com/wiki/contents/articles/11382.storage-spaces-frequently-asked-questions-faq.aspx

本ブログが少しでも皆様のお役に立てば幸いです。