Home > Windows にまつわる e.t.c.

Windows Server 2016 で SSD + HDD の階層を作る


このコンテンツは、以前「WS16TP4 で SSD + HDD の階層作る」として公開していたのを、Windows Server 2016 製品版用に書き直したものです。
 

Windows Server 2016 には「記憶域プール」と呼ばれるストレージを束ねる機能があります。

更に、Windows Server では SSD と HDD を階層化させ、パフォーマンスアップとビット単価ダウンを両立させることができます。
この環境に慣れてしまうと、素の HDD 環境は使いたくなくなるくらいの中毒性があります。

どのくらいの性能差があるかは、これを見てもらえると一目でわかると思います。

素の HDD(最近買ったHDD)
SSD + HDD で階層化(数年前に買ったSSD&HDD)

 

Windows Server 2016 では、SSD x1 と HDD x1 を階層化して、安価で高速なストレージ環境を作る事が出来ます。
(TP4 では SSDxN HDDxN : N >= 2 でしか階層化はできなかったのですが、製品版では SSDx1 HDDx1 構成が可能になりました)

ただし、階層化をする場合にフルサイズを割り当てようとするとエラーになるので、1割引きサイズで割り当てをします。(仕様なのか bug なのか不明)

フルサイズを割り当てるとエラーになる

1割引きにする

 

PowerShell で構築する際の手順

それでは、PowerShell で構築する際の手順です。

# 物理ディスク確認
Get-PhysicalDisk | ft FriendlyName,SerialNumber,CanPool,BusType,DeviceId,EnclosureNumber,MediaType,Size -AutoSize

### ストレージプールに組み込むディスク
# ディスクを選択する場合
# $SerialNumbers = "CVMP227602BH120BGN", "W1D05S2A"
# $Disks = Get-PhysicalDisk | ?{$SerialNumbers -Contains $_.SerialNumber}

# 組み込み可能な全てのディスクを組み込む
$Disks = Get-PhysicalDisk -CanPool $true

# プールに組み込むディスク確認
$Disks

# ストレージプール作成
New-StoragePool -FriendlyName Pool01 -PhysicalDisks $Disks -StorageSubSystemUniqueId (Get-StorageSubSystem).UniqueId

# ストレージプール確認(作成時に詳細が表示さるので、必要に応じて)
# Get-StoragePool Pool01

# プールに組み込まれた物理ディスク確認
Get-StoragePool Pool01 | Get-PhysicalDisk | ft FriendlyName,SerialNumber,CanPool,BusType,DeviceId,EnclosureNumber,MediaType, Size -AutoSize

### 物理ディスクの MediaType がセットされていなかったら設定
# Get-StoragePool Pool01 | Get-PhysicalDisk | ? [条件] | Set-PhysicalDisk -MediaType SSD
# Get-StoragePool Pool01 | Get-PhysicalDisk | ? [条件] | Set-PhysicalDisk -MediaType HDD

# プールに組み込まれている物理ディスク確認
# Get-StoragePool Pool01 | Get-PhysicalDisk | ft FriendlyName,SerialNumber,CanPool,BusType,DeviceId,EnclosureNumber,MediaType,Size -AutoSize

# ストレージ階層作成
Get-StoragePool Pool01 | New-StorageTier -FriendlyName SSDtier -MediaType SSD
Get-StoragePool Pool01 | New-StorageTier -FriendlyName HDDtier -MediaType HDD

# ストレージ階層確認(作成時に詳細が表示さるので、必要に応じて)
# Get-StorageTier -FriendlyName SSDtier
# Get-StorageTier -FriendlyName HDDtier

# 階層のサイズを求める(1割引き)
$SsdSize = 0
Get-StoragePool Pool01 | Get-PhysicalDisk | ?{$_.MediaType -eq "SSD"} | % {$SsdSize += $_.Size}
$SsdSize *= 0.9

$HddSize = 0
Get-StoragePool Pool01 | Get-PhysicalDisk | ?{$_.MediaType -eq "HDD"} | % {$HddSize += $_.Size}
$HddSize *= 0.9

# Simple で仮想ディスク作成
$SSD = Get-StorageTier -FriendlyName SSDtier
$HDD = Get-StorageTier -FriendlyName HDDtier
Get-StoragePool Pool01 | New-VirtualDisk -FriendlyName VirtualDisk01 -ResiliencySettingName Simple -StorageTiers $SSD,$HDD -StorageTierSizes $SsdSize,$HddSize

# 仮想ディスク確認(作成時に詳細が表示さるので、必要に応じて)
# Get-StoragePool Pool01 | Get-VirtualDisk

 

削除する場合の手順

# 仮想ディスク削除
Get-VirtualDisk | Remove-VirtualDisk -Confirm:$false

# ストレージ階層削除
Get-StorageTier | Remove-StorageTier -Confirm:$false

# 記憶域プール削除
Get-StoragePool | ? IsPrimordial -eq $false | Remove-StoragePool -Confirm:$false

 

構築ログ

実際に構築した際のログはこんな感じです。

PS C:\> # 物理ディスク確認
PS C:\> Get-PhysicalDisk | ft FriendlyName,SerialNumber,CanPool,BusType,DeviceId,EnclosureNumber,MediaType,Size -AutoSize

FriendlyName        SerialNumber       CanPool BusType DeviceId EnclosureNumber MediaType          Size
------------        ------------       ------- ------- -------- --------------- ---------          ----
TOSHIBA DT01ACA300  93640AEKS            False SATA    2                        HDD       3000592982016
INTEL SSDSC2CT060A3 CVMP220201YB060AGN   False SATA    0                        SSD         60022480896
INTEL SSDSC2CT120A3 CVMP227602BH120BGN    True SATA    1                        SSD        120034123776
ST1000DM003-9YN162  W1D05S2A              True SATA    3                        HDD       1000204886016


PS C:\>
PS C:\> ### ストレージプールに組み込むディスク
PS C:\> # ディスクを選択する場合
PS C:\> # $SerialNumbers = "CVMP227602BH120BGN", "W1D05S2A"
PS C:\> # $Disks = Get-PhysicalDisk | ?{$SerialNumbers -Contains $_.SerialNumber}
PS C:\>
PS C:\> # 組み込み可能な全てのディスクを組み込む
PS C:\> $Disks = Get-PhysicalDisk -CanPool $true
PS C:\>
PS C:\> # プールに組み込むディスク確認
PS C:\> $Disks

FriendlyName        SerialNumber       CanPool OperationalStatus HealthStatus Usage            Size
------------        ------------       ------- ----------------- ------------ -----            ----
INTEL SSDSC2CT120A3 CVMP227602BH120BGN True    OK                Healthy      Auto-Select 111.79 GB
ST1000DM003-9YN162  W1D05S2A           True    OK                Healthy      Auto-Select 931.51 GB


PS C:\>
PS C:\> # ストレージプール作成
PS C:\> New-StoragePool -FriendlyName Pool01 -PhysicalDisks $Disks -StorageSubSystemUniqueId (Get-StorageSubSystem).UniqueId

FriendlyName OperationalStatus HealthStatus IsPrimordial IsReadOnly
------------ ----------------- ------------ ------------ ----------
Pool01       OK                Healthy      False        False


PS C:\> # ストレージプール確認(作成時に詳細が表示さるので、必要に応じて)
PS C:\> # Get-StoragePool Pool01
PS C:\>
PS C:\> # プールに組み込まれた物理ディスク確認
PS C:\> Get-StoragePool Pool01 | Get-PhysicalDisk | ft FriendlyName,SerialNumber,CanPool,BusType,DeviceId,EnclosureNumber,MediaType,Size -AutoSize

FriendlyName        SerialNumber       CanPool BusType DeviceId EnclosureNumber MediaType          Size
------------        ------------       ------- ------- -------- --------------- ---------          ----
INTEL SSDSC2CT120A3 CVMP227602BH120BGN   False SATA    1                        SSD        119990648832
ST1000DM003-9YN162  W1D05S2A             False SATA    3                        HDD       1000190509056


PS C:\> ### 物理ディスクの MediaType がセットされていなかったら設定
PS C:\> # Get-StoragePool Pool01 | Get-PhysicalDisk | ? [条件] | Set-PhysicalDisk -MediaType SSD
PS C:\> # Get-StoragePool Pool01 | Get-PhysicalDisk | ? [条件] | Set-PhysicalDisk -MediaType HDD
PS C:\>
PS C:\> # プールに組み込まれている物理ディスク確認
PS C:\> # Get-StoragePool Pool01 | Get-PhysicalDisk | ft FriendlyName,SerialNumber,CanPool,BusType,DeviceId,EnclosureNumber,MediaType, Size -AutoSize
PS C:\>
PS C:\> # ストレージ階層作成
PS C:\> Get-StoragePool Pool01 | New-StorageTier -FriendlyName SSDtier -MediaType SSD


ObjectId               : {1}\\WSV12\root/Microsoft/Windows/Storage/Providers_v2\SPACES_StorageTier.ObjectId="{d8e5dc90-8833-11e6-8a90-806e6f6e6963}:ST:{86579bb5-2f77-4810
                         -bda6-2699ed54ced6}{f5dd133b-50b2-4065-9710-57041d330f72}"
PassThroughClass       :
PassThroughIds         :
PassThroughNamespace   :
PassThroughServer      :
UniqueId               : {f5dd133b-50b2-4065-9710-57041d330f72}
AllocatedSize          : 0
AllocationUnitSize     : Auto
ColumnIsolation        : PhysicalDisk
Description            :
FaultDomainAwareness   : PhysicalDisk
FootprintOnPool        : 0
FriendlyName           : SSDtier
Interleave             : 262144
MediaType              : SSD
NumberOfColumns        : Auto
NumberOfDataCopies     : 2
NumberOfGroups         : 1
ParityLayout           :
PhysicalDiskRedundancy : 1
ProvisioningType       : Fixed
ResiliencySettingName  : Mirror
Size                   : 0
Usage                  : Data
PSComputerName         :



PS C:\> Get-StoragePool Pool01 | New-StorageTier -FriendlyName HDDtier -MediaType HDD


ObjectId               : {1}\\WSV12\root/Microsoft/Windows/Storage/Providers_v2\SPACES_StorageTier.ObjectId="{d8e5dc90-8833-11e6-8a90-806e6f6e6963}:ST:{86579bb5-2f77-4810
                         -bda6-2699ed54ced6}{64b882b4-2190-4a39-9292-207c31adea25}"
PassThroughClass       :
PassThroughIds         :
PassThroughNamespace   :
PassThroughServer      :
UniqueId               : {64b882b4-2190-4a39-9292-207c31adea25}
AllocatedSize          : 0
AllocationUnitSize     : Auto
ColumnIsolation        : PhysicalDisk
Description            :
FaultDomainAwareness   : PhysicalDisk
FootprintOnPool        : 0
FriendlyName           : HDDtier
Interleave             : 262144
MediaType              : HDD
NumberOfColumns        : Auto
NumberOfDataCopies     : 2
NumberOfGroups         : 1
ParityLayout           :
PhysicalDiskRedundancy : 1
ProvisioningType       : Fixed
ResiliencySettingName  : Mirror
Size                   : 0
Usage                  : Data
PSComputerName         :



PS C:\> # ストレージ階層確認(作成時に詳細が表示さるので、必要に応じて)
PS C:\> # Get-StorageTier -FriendlyName SSDtier
PS C:\> # Get-StorageTier -FriendlyName HDDtier
PS C:\>
PS C:\> # 階層のサイズを求める(1割引き)
PS C:\> $SsdSize = 0
PS C:\> Get-StoragePool Pool01 | Get-PhysicalDisk | ?{$_.MediaType -eq "SSD"} | % {$SsdSize += $_.Size}
PS C:\> $SsdSize *= 0.9
PS C:\>
PS C:\> $HddSize = 0
PS C:\> Get-StoragePool Pool01 | Get-PhysicalDisk | ?{$_.MediaType -eq "HDD"} | % {$HddSize += $_.Size}
PS C:\> $HddSize *= 0.9
PS C:\>
PS C:\> # Simple で仮想ディスク作成
PS C:\> $SSD = Get-StorageTier -FriendlyName SSDtier
PS C:\> $HDD = Get-StorageTier -FriendlyName HDDtier
PS C:\> Get-StoragePool Pool01 | New-VirtualDisk -FriendlyName VirtualDisk01 -ResiliencySettingName Simple -StorageTiers $SSD,$HDD -StorageTierSizes $SsdSize,$HddSize

FriendlyName  ResiliencySettingName OperationalStatus HealthStatus IsManualAttach      Size
------------  --------------------- ----------------- ------------ --------------      ----
VirtualDisk01                       OK                Healthy      False          939.25 GB


PS C:\> # 仮想ディスク確認(作成時に詳細が表示さるので、必要に応じて)
PS C:\> # Get-StoragePool Pool01 | Get-VirtualDisk
PS C:\>

 

仮想ディスクが出来たら、その上にボリュームを作って ReFS か NTFS でフォーマットすれば普通のボリュームとして使えます。
PowerShell でボリューム作成とフォーマットまでするのでしたら、こんな感じで出来ます。

# ディスク確認
Get-Disk

# ディスクの初期化
Initialize-Disk -Number 5 -PartitionStyle GPT

# ボリュームの表示
Get-Volume

# パーティションの作成
New-Partition -DiskNumber 5 -UseMaximumSize -DriveLetter E

# ReFS でフォーマット
Format-Volume -DriveLetter E -FileSystem ReFS -Confirm:$false

 

記憶域プールの良いところは、メーカーやサイズがバラバラでもプールに収容できる点です。

試しに 60GB SSD + 240GB SSD + 2TB HDD + 1TB HDD のバラバラのサイズで構成しましたが、何ら問題なく使用できました。

 

 

余談ですが、Windows 10 にも階層コマンドレットはあるのですが、階層がサポートされていないので仮想ディスク作成時にラーになり階層化することはできません。

 

back.gif (1980 バイト)

home.gif (1907 バイト)

Copyright © MURA All rights reserved.