RAID1ではなく記憶域プールでバックアップを冗長化した理由と手順

なんだからよく分からない記憶域プールを分からないなりに完全に理解したつもり
更新履歴 見出しにジャンプ
日時 | 内容 |
---|---|
2020-12-29 |
|
2025-07-07 |
|
バックアップと冗長化 見出しにジャンプ
誤っていたり不正確な場合は、布に包んだ斧を優しく投げて頂けると嬉しい。
バックアップはWindows上のpwshからWSL上のrsyncを叩いて世代管理しているが、大容量ファイル(動画ファイルなど)は片方向ミラーという微妙な状態。
一方向のミラーではあまり冗長化にならないという認識。
バックアップ | 冗長化 |
---|---|
|
|
RAIDと記憶域プール 見出しにジャンプ
RAIDも検討したが、構成変更のし易さから記憶域プールの双方向ミラーを選択。
最初はまっさらな物理ディスクが必要だが、環境ができれば、既にある仮想ディスク上のパーティションの内容を保持しながら、必要に応じて後から物理ディスクを追加できる。
全体的な流れとしては
- 使うディスクをリセットして
- 記憶域プールをつくって
- 仮想ディスクをつくる(ドライブレターを割り当て)
前提環境 見出しにジャンプ
- Windows 10 Pro 1909
- Windows PowerShell 管理者 $PSVersionTable 5.1.18362.145
- ストレージ 1TB x1(起動ドライブ)、4TB x4(記憶域プールへ)、10TB x1(無視)
Segate IronWorfやWD PurpleはBarraCudaやBlueに比べ明らかに静かで、動作も快適。
ディスクの管理が挙動不審 見出しにジャンプ
Win
- X
-> ディスクの管理
でのディスクのフォーマット操作が怪しく、更にexplorer.exeが停止する問題があるため、PowerShellですべての操作を行うことにした。
プールを作成できません 見出しにジャンプ
ディスクの管理で操作した際に、アクセスしているアプリケーションがあるとのエラーが出た。
私の場合は、WSLが各ドライブをマウントしていたので、WSLで下記コマンドを実行しアクセスを止めた。
# mount一覧
mount -l
C:\ on /mnt/c type drvfs (rw,noatime,uid=1000,gid=1000,umask=22,fmask=11,case=off)
D:\ on /mnt/d type drvfs (rw,noatime,uid=1000,gid=1000,umask=22,fmask=11,case=off)
E:\ on /mnt/e type drvfs (rw,noatime,uid=1000,gid=1000,umask=22,fmask=11,case=off)
F:\ on /mnt/f type drvfs (rw,noatime,uid=1000,gid=1000,umask=22,fmask=11,case=off)
G:\ on /mnt/g type drvfs (rw,noatime,uid=1000,gid=1000,umask=22,fmask=11,case=off)
H:\ on /mnt/h type drvfs (rw,noatime,uid=1000,gid=1000,umask=22,fmask=11,case=off)
# umount
sudo umount /mnt/d
sudo umount /mnt/e
sudo umount /mnt/f
sudo umount /mnt/g
rem 一連の記憶域・仮想ディスクの設定が終わったらWSLを再起動
wslconfig /t Ubuntu
物理ディスクの初期化 見出しにジャンプ
ディスク一覧の取得 見出しにジャンプ
ディスク一覧を取得する。
Get-PhysicalDisk
でも良いが、デフォルトの表示項目が微妙に違う。
Get-Disk
Number Friendly Name Serial Number HealthStatus OperationalStatus Total Size Partition Style
------ ------------- ------------- ------------ ----------------- ---------- ---------------
6 Msft Virtual… ************* Healthy Online 8 GB MBR
0 SanDisk Extr… ************* Healthy Online 931.51 GB GPT
1 ST4000VN008-… ************* Healthy Online 3.64 TB GPT
2 ST4000VN008-… ************* Healthy Online 3.64 TB GPT
5 WDC WD100EMA… ************* Healthy Online 9.1 TB GPT
3 WDC WD40PURZ… ************* Healthy Online 3.64 TB GPT
4 WDC WD40PURZ… ************* Healthy Online 3.64 TB GPT
7 HogeDisk ************* Healthy Online 100 TB RAW
DriveLetter
はGet-Partition
、MediaType
はGet-PhysicalDisk
でないと取得できない。
下記はGet-Disk
と合わせて表示させる例。
Get-Disk | ForEach-Object {
[Array]$List +=
[PSCustomObject]@{
DriveLetter = ($_ | Get-Partition).Driveletter
DiskNumber = $_.DiskNumber
FriendlyName = $_.FriendlyName
SerialNumber = $_.SerialNumber
HealthStatus = $_.HealthStatus
OperationalStatus = $_.OperationalStatus
TotalSize = $_.Size
MediaType = ($_ | Get-PhysicalDisk).MediaType
PartitionStyle = $_.PartitionStyle
}
}
$List | Format-Table
DriveLetter DiskNumber FriendlyName SerialNumber HealthStatus OperationalStatus TotalSize MediaType PartitionStyle
----------- ---------- ------------ ------------ ------------ ----------------- --------- --------- --------------
7 Msft Virtual Disk ************ Healthy Online 8589934592 SSD MBR
{ , , , C} 0 SanDisk Extreme Pro 1TB ************ Healthy Online 1000204886016 SSD GPT
H 5 WDC WD100EMAZ-00WJTA0 ************ Healthy Online 10000831348736 HDD GPT
{ , E} 3 WDC WD40PURZ-85TTDY0 ************ Healthy Online 4000787030016 HDD GPT
{ , F} 4 WDC WD40PURZ-85TTDY0 ************ Healthy Online 4000787030016 HDD GPT
{ , D} 6 VideoVirtualDisk ************ Healthy Online 109951162777600 GPT
FriendlyNameの変更 見出しにジャンプ
FriendlyName
が同じディスクは、オペレーションミスを招くので予め変更しておきたいところだが、
Get-Disk
とGet-PhysicalDisk
のFriendlyName
は別のようで、下記のように変更しても肝心のGet-Disk
では使用できなかった。
# Get-PhysicalDiskからSet-PhysicalDiskにパイプで渡し、NewFriendlyNameを取得
Get-PhysicalDisk -SerialNumber "WD-XXXXXXXXX7PZ" | Set-PhysicalDisk -NewFriendlyName "WD40PURZ-85TTDY0-7PZ"
SerialNumber
指定で操作していく。
ディスクの削除・初期化 見出しにジャンプ
ディスク内のデータの削除(完全な削除ではない)と初期化を行う。
パイプラインを使用せず、個別のCmdLetでDiskNumber
やUniqueId
を指定するような操作方法では、私のように誤ってデータの方を飛ばす可能性が高まるのでオススメしない。
Get-Disk | Where-Object SerialNumber -Eq " WD-XXXXXXXXXJER" | Clear-Disk -RemoveData | Initialize-Disk -PassThru
この操作を実行しますか?
This will erase all data on disk 4.
[Y] はい(Y) [A] すべて続行(A) [N] いいえ(N) [L] すべて無視(L) [S] 中断(S) [?] ヘルプ (既定値は "Y"): y
Initialize-Disk
の既定値は-PartitionStyle GPT
。
Clear-Disk : The disk has not been initialized.
エラーが出る場合、不要であればClear-Disk -RemoveData
を省くか、先にInitialize-Disk
を行う。
この時点でexplorer.exeなどから見えなくなっているはず。正常。
ドライブレター割り当て・フォーマット 見出しにジャンプ
記憶域プールでなく、単体のディスクとして使う場合はNew-Partition
とFormat-Volume
も併せて実行するが、
記憶域プールを使う場合、仮想ディスクを作成してから行わないと、CanPool = $False
の原因となるので、実行しない。
実行してしまった場合は、ディスクの削除・初期化を再度行えばよい。
# 物理ディスク
Get-Disk | Where-Object SerialNumber -Match "WD-XXXXXXXXXJER" | Clear-Disk -RemoveData | Initialize-Disk -PassThru | New-Partition -AssignDriveLetter -UseMaximumSize | Format-Volume
# 仮想ディスク
Get-Disk | Where-Object FriendlyName -Eq "HogeDisk" | Initialize-Disk -PassThru | New-Partition -AssignDriveLetter -UseMaximumSize | Format-Volume
Format-Volume
の既定値は-FileSystem NTFS
。Windows 11でも-FileSystem ReFS
を使用できないが、-DevDrive
を使うとReFSでフォーマットできる。
ただ、空き容量が更新されず書き込めなくなることがあるので、まだまだ枯れていなさそうだ。
アロケーションユニットサイズは既定値の4KBが推奨されるが、
Cluster size recommendations for ReFS and NTFS | Microsoft Community Hub
シーケンシャル・DB用途なら-AllocationUnitSize 65536
を指定するとパフォーマンスが向上するかもしれない。(-UseLargeFRS
は使えなかった)
Pure Storage Documentation portal
下記のようなフォーマットを促すGUIが表示されるかもしれないが、既に実行されているためキャンセルを押下。
Microsoft Windows | ||
---|---|---|
|
新しいディスク 見出しにジャンプ
挿したてほやほやの新しいHDDがある場合は、ここから始める。
PartitionStyle
が"RAW"
なディスクすべてを記憶域プール用に初期化する例。
Get-Disk | Where-Object PartitionStyle -Eq "RAW" | Initialize-Disk -PassThru
cf. https://docs.microsoft.com/en-us/powershell/module/storage/new-partition?view=win10-ps#examples
Get-Partition -DiskNumber 1
# ドライブレターが無い場合
DiskPath: \\?\scsi#disk&ven_
PartitionNumber DriveLetter Offset Size Type
--------------- ----------- ------ ---- ----
1 1048576 128 MB Reserved
2 135266304 3.64 TB Basic
# パーティションが無い場合(RAW)
Get-Partition : プロパティ 'DiskNumber' が '1' の MSFT_Partition オブジェクトが見つかりません。プロパティの値を確認して
から再試行してください。
発生場所 行:1 文字:1
+ Get-Partition -DiskNumber 1
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (1:UInt32) [Get-Partition], CimJobException
+ FullyQualifiedErrorId : CmdletizationQuery_NotFound_DiskNumber,Get-Partition
記憶域プールの作成 見出しにジャンプ
記憶域プールを作成可能なディスクを取得する。
Get-PhysicalDisk | Select SerialNumber, CanPool, CannotPoolReason
SerialNumber CanPool CannotPoolReason
------------ ------- ----------------
XXXXXN1N False Insufficient Capacity
XXXXXQKM False In a Pool
False Insufficient Capacity
XXXXXBSA False In a Pool
WD-XXXXXXXXXJER False Insufficient Capacity
XXXX_XXXX_XXXX_XXXX_XXXX_XXXX_XXXX_5A70. False Insufficient Capacity
WD-XXXXXXXXX7PZ False Insufficient Capacity
作成可能なディスクCanPool = $True
が出てこない場合、下記コマンドを実行。
cf. https://docs.microsoft.com/ja-jp/windows-server/storage/storage-spaces/add-nodes#adding-drives
# SerialNumberを指定し、Reset-PhysicalDiskを実行
Get-PhysicalDisk | Where-Object SerialNumber -Eq "WD-XXXXXXXXXJER" | Reset-PhysicalDisk
これでもCanPool = $False
の場合、ディスクの削除・初期化を再度行い cf. #ドライブレター割り当て・フォーマット、再度実行。
記憶域プールを作成。
プールのFriendlyName
はSet-StoragePool -NewFriendlyName
で変更できるので、適当で良い。
New-StoragePool -FriendlyName "HogePool" -StorageSubsystemFriendlyName "Windows Storage*" -PhysicalDisks (Get-PhysicalDisk -CanPool $True) -ResiliencySettingNameDefault Mirror -ProvisioningTypeDefault Thin -Verbose
FriendlyName OperationalStatus HealthStatus IsPrimordial IsReadOnly Size AllocatedSize
------------ ----------------- ------------ ------------ ---------- ---- -------------
HogePool OK Healthy False False 7.28 TB 512 MB
-ResiliencySettingNameDefault Mirror
を指定したのに、Size
がミラーっぽくないと思うかもしれないが、仮想ディスク用の既定値を指定しているだけなので正常。実際にミラーになるのは、記憶域プールでなく仮想ディスク。
-ProvisioningTypeDefault Thin
は、物理ディスクの中で最も小さいディスクの容量を超えた仮想ディスクを作成できる、ということらしい。
cf. https://social.technet.microsoft.com/Forums/Azure/ja-JP/2a2eacb5-6148-485f-9986-25bf35582062/35352250142249512473125061254012473123981249712522124861245112?forum=winserver10TP
# 確認
Get-StoragePool
FriendlyName OperationalStatus HealthStatus IsPrimordial IsReadOnly Size AllocatedSize
------------ ----------------- ------------ ------------ ---------- ---- -------------
HogePool OK Healthy False False 7.28 TB 512 MB
Primordial OK Healthy True False 24.57 TB 14.55 TB
Primordial
はデフォルトの記憶域、ということらしい。
cf. https://docs.microsoft.com/ja-jp/windows-server/storage/storage-spaces/deploy-standalone-storage-spaces#step-1-create-a-storage-pool
記憶域プールの削除 見出しにジャンプ
間違って作成したときなどに。
Remove-StoragePool -FriendlyName "HogePool"
仮想ディスクの作成 見出しにジャンプ
記憶域プールの作成が正しく行われているか確認する。
Get-StoragePool
FriendlyName OperationalStatus HealthStatus IsPrimordial IsReadOnly Size AllocatedSize
------------ ----------------- ------------ ------------ ---------- ---- -------------
Primordial OK Healthy True False 24.57 TB 7.28 TB
HogePool OK Healthy False False 7.28 TB 512 MB
仮想ディスクを作成。
Resize-VirtualDisk
ではサイズの縮小はできないので、不必要に大きな値は設定しないほうが良い。
仮想プロビジョニング-ProvisioningType Thin
の場合、記憶域を過度に割り当てることができるため、使用可能な物理容量を注意して監視する必要がある。
-ProvisioningType Thin
と-UseMaximumSize
は相容れないので、New-VirtualDisk : Invalid Parameter
エラーが出る。
固定プロビジョニング-ProvisioningType Fixed
にする必要がある。
cf. http://www.gi-architects.co.uk/2017/01/new-virtual-disk-error-usemaximumsize-storage-pool/
固定プロビジョニング、おすすめ。
New-VirtualDisk -StoragePoolFriendlyName HogePool -FriendlyName HogeDisk -ProvisioningType Fixed -ResiliencySettingName Mirror -UseMaximumSize
FriendlyName ResiliencySettingName FaultDomainRedundancy OperationalStatus HealthStatus Size FootprintOnPool StorageEfficiency
------------ --------------------- --------------------- ----------------- ------------ ---- --------------- -----------------
HogeDisk Mirror 1 OK Healthy 3.64 TB 7.28 TB 50.00%
# 天使の分け前が無視できない
仮想プロビジョニング、よくわからん。
New-VirtualDisk -StoragePoolFriendlyName HogePool -FriendlyName HogeDisk -ProvisioningType Thin -ResiliencySettingName Mirror -Size 8TB
FriendlyName ResiliencySettingName FaultDomainRedundancy OperationalStatus HealthStatus Size FootprintOnPool StorageEfficiency
------------ --------------------- --------------------- ----------------- ------------ ---- --------------- -----------------
HogeDisk Mirror 1 OK Healthy 8 TB 1.5 GB 33.33%
仮想ディスクのドライブレター割り当て・フォーマットを行う。
Get-Disk | Where-Object FriendlyName -Eq "HogeDisk" | Initialize-Disk -PassThru | New-Partition -AssignDriveLetter -UseMaximumSize | Format-Volume
DriveLetter FriendlyName FileSystemType DriveType HealthStatus OperationalStatus SizeRemaining Size
----------- ------------ -------------- --------- ------------ ----------------- ------------- ----
D NTFS Fixed Healthy OK 3.64 TB 3.64 TB
仮想ディスクの削除 見出しにジャンプ
Get-VirtualDisk
Remove-VirtualDisk -FriendlyName "HogeDisk"
既存の記憶域プールへの物理ディスクの追加 見出しにジャンプ
既存の記憶域プールへ、新たに物理ディスクを追加する。
追加可能な物理ディスクの確認。
CanPoolについては記憶域プールの作成で触れているので割愛。
Get-PhysicalDisk | Select SerialNumber, CanPool, CannotPoolReason
Canpool = $True
な物理ディスクをすべて既存の記憶域プールに追加する例。
Get-PhysicalDisk -Canpool $True
Number FriendlyName SerialNumber MediaType CanPool OperationalStatus HealthStatus Usage Size
------ ------------ ------------ --------- ------- ----------------- ------------ ----- ----
1 ST4000VN008-2DR166 XXXXXQKM HDD True OK Healthy Auto-Select 3.64 TB
2 ST4000VN008-2DR166 XXXXXBSA HDD True OK Healthy Auto-Select 3.64 TB
Add-PhysicalDisk -PhysicalDisks (Get-PhysicalDisk -Canpool $True) -StoragePoolFriendlyName HogePool
下記のようにエラーが出る場合はGet-Disk | Where-Object SerialNumber -Match "**********" | Clear-Disk -RemoveData | Initialize-Disk -PassThru | Reset-PhysicalDisk
Add-PhysicalDisk: Failed
Extended information:
One or more physical disks encountered an error during addition to the storage pool.
Physical Disks:
{0a9a5945-18cb-a362-be9f-1f615a067f62}: この操作のための十分に使用可能な空き容量がありません。
Get-PhysicalDisk -SerialNumber ********** | Reset-PhysicalDisk
Add-PhysicalDisk: One or more physical disks are not supported by this operation.
Extended information:
One or more physical disks encountered an error during addition to the storage pool.
Physical Disks:
{0a9a5945-18cb-a362-be9f-1f615a067f62}: この要求はサポートされていません。
Size
、AllocatedSize
が増えていることを確認。
下記は4TBx2 Mirrorに4TBx2を追加した例。
Get-StoragePool
FriendlyName OperationalStatus HealthStatus IsPrimordial IsReadOnly Size AllocatedSize
------------ ----------------- ------------ ------------ ---------- ---- -------------
Primordial OK Healthy True False 24.57 TB 14.55 TB
HogePool OK Healthy False False 14.55 TB 7.28 TB
既存の仮想ディスクのサイズ変更 見出しにジャンプ
同じ記憶域プールに追加しただけではディスクとして使用できないので、仮想ディスクのサイズを変更する必要がある。
-UseMaximumSize
を使用したいところだが、Resize-VirtualDisk
にはそんな引数はないので、-Size
で代用する。
cf. https://docs.microsoft.com/en-us/powershell/module/storage/resize-virtualdisk?view=win10-ps
Get-StoragePool
のAllocatedSize
は7.28TB
(8TB≒7.28TiB)となっているが、Resize-VirtualDisk : Not enough available capacity
エラーが出ないのは7.27TB
が最大だった。
Resize-VirtualDisk -FriendlyName "HogeDisk" -Size 7.27TB
# 確認
Get-VirtualDisk
FriendlyName ResiliencySettingName FaultDomainRedundancy OperationalStatus HealthStatus Size FootprintOnPool StorageEfficiency
------------ --------------------- --------------------- ----------------- ------------ ---- --------------- -----------------
HogeDisk Mirror 1 OK Healthy 7.27 TB 14.54 TB 50.00%
Get-StoragePool -FriendlyName HogePool | Optimize-StoragePool -AsJob
Optimize-Volume -DriveLetter E -SlabConsolidate -Verbose
パーティションのサイズ変更 見出しにジャンプ
仮想ディスクのサイズを変更とともに、パーティション割り当ても変更する必要がある。
ドライブレター指定で目的のパーティションを取得する。
Get-Partition -DriveLetter D
DiskPath: \\?\storage#disk#
PartitionNumber DriveLetter Offset Size Type
--------------- ----------- ------ ---- ----
2 D 16777216 3.64 TB Basic
未割り当てのディスク領域の可能な限りすべてを使ってパーティションをリサイズする。
cf. https://docs.microsoft.com/en-us/powershell/module/storage/resize-partition?view=win10-ps
Resize-Partition -DriveLetter D -Size (Get-PartitionSupportedSize -DriveLetter D).SizeMax
記憶域プールのアップデート 見出しにジャンプ

Get-StoragePool | select Version
Update-StoragePool -FriendlyName HogePool -WhatIf
Update-StoragePool (Storage) | Microsoft Learn
既存の記憶域プールの物理ディスクを交換 見出しにジャンプ
HDDの故障や容量変更等で別のHDDに交換するとき、記憶域プールの容量に余裕がなければ、新しいディスクを追加してからでないと古いディスクを取り外すことはできない。
Get-PhysicalDisk | Select-Object DeviceId,FriendlyName,SerialNumber,MediaType,CanPool,HealthStatus,Usage,@{Name="Size(TB)";Expression={[Math]::Round($_.Size/1TB,2)}},@{Name="AllocatedSize(TB)";Expression={[Math]::Round($_.AllocatedSize/1TB,2)}},@{Name="VirtualDiskFootprint(TB)";Expression={[Math]::Round($_.VirtualDiskFootprint/1TB,2)}} | Format-Table
DeviceId FriendlyName SerialNumber MediaType CanPool HealthStatus Usage Size(TB) AllocatedSize(TB) VirtualDiskFootprint(TB)
-------- ------------ ------------ --------- ------- ------------ ----- -------- ----------------- ------------------------
0 ST4000VN008-2DR166 XXXXXQKM HDD False Healthy Retired 3.64 0 0
4 ST4000VN008-2DR166 XXXXXBSA HDD True Healthy Auto-Select 3.64 0 0
2 WDC WD40PURZ-85TTDY0 WD-XXXXXXXXXJER HDD False Healthy Auto-Select 3.64 3.64 3.64
5 SanDisk Extreme Pro 1TB ************ SSD False Healthy Auto-Select 0.91 0.91 0
3 WDC WD100EMAZ-00WJTA0 XXXXXN1N HDD False Healthy Auto-Select 9.1 7.28 7.28
1 WDC WD40PURZ-85TTDY0 WD-XXXXXXXXX7PZ HDD False Healthy Auto-Select 3.64 3.64 3.64
一対一でHDDを取り替える 見出しにジャンプ
PS> Get-StoragePool -FriendlyName HogePool | ||||||
---|---|---|---|---|---|---|
4TB (3.6TiB) | 4TB | |||||
4TB | 4TB |
# Size = 3.6TiB x 4
# AllocatedSize = 3.6TiB x 4
Get-StoragePool -FriendlyName HogePool
FriendlyName OperationalStatus HealthStatus IsPrimordial IsReadOnly Size AllocatedSize
------------ ----------------- ------------ ------------ ---------- ---- -------------
HogePool OK Healthy False False 14.55 TB 14.55 TB
まずは既存の記憶域プールへの物理ディスクの追加を行う。
PS> Get-StoragePool -FriendlyName HogePool | ||||||||
---|---|---|---|---|---|---|---|---|
4TB | 4TB | |||||||
4TB | 4TB 取り外す前に | 10TB 追加 |
取り外したいPhysicalDisk
をRetired
に設定する。
即座にRemovePhysicalDisk
が完了し、HogeDisk-Repair
が待機される。
Get-PhysicalDisk -SerialNumber XXXXXQKM | Set-PhysicalDisk –Usage Retired
Get-StorageJob
Name IsBackgroundTask ElapsedTime JobState PercentComplete BytesProcessed BytesTotal
---- ---------------- ----------- -------- --------------- -------------- ----------
RemovePhysicalDisk False 00:00:00 Completed 100 0 B 0 B
HogeDisk-Repair True 4165.11:33:54 Suspended 0 0 B 3.64 TB
PS> Get-StoragePool -FriendlyName HogePool | ||||||||
---|---|---|---|---|---|---|---|---|
4TB | 4TB | |||||||
4TB | 4TB Retired | 10TB |
Repair-VirtualDisk
でRetired
になったPhysicalDisk
が提供していたVirtualDisk
を修復する。
JobState
がCompleted
になったら完了。
Get-PhysicalDisk -SerialNumber XXXXXQKM | Get-VirtualDisk | Repair-VirtualDisk -AsJob
Get-StorageJob
Name IsBackgroundTask ElapsedTime JobState PercentComplete BytesProcessed BytesTotal
---- ---------------- ----------- -------- --------------- -------------- ----------
HogeDisk-Repair False 4166.15:43:56 Running 0 375.75 MB 949 GB
HogeDisk-Regeneration True 00:00:02 Running 0 375.25 MB 949 GB
Get-StorageJob
Name IsBackgroundTask ElapsedTime JobState PercentComplete BytesProcessed BytesTotal
---- ---------------- ----------- -------- --------------- -------------- ----------
HogeDisk-Repair False 01:24:26 Completed 100 0 B 0 B
最後にPhysicalDisk
をStoragePool
から取り外す。
Remove-PhysicalDisk -PhysicalDisks (Get-PhysicalDisk -SerialNumber XXXXXQKM) -StoragePoolFriendlyName "HogePool"
Confirm
Are you sure you want to perform this action?
Removing a physical disk will cause problems with the fault tolerance capabilities of the following storage pool: "HogePool".
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): y
PS> Get-StoragePool -FriendlyName HogePool | ||||||
---|---|---|---|---|---|---|
4TB | 4TB | |||||
4TB | 10TB |
譲渡や破棄する場合は、取り外したHDDを再度マウントして0Fill&ランダムFillしておく
Get-PhysicalDisk -SerialNumber XXXXXQKM | Reset-PhysicalDisk
Get-Disk | Where-Object SerialNumber -match "XXXXXQKM"
Get-Disk | Where-Object SerialNumber -match "XXXXXQKM" | Clear-Disk -RemoveData | Initialize-Disk -PassThru | New-Partition -AssignDriveLetter -UseMaximumSize | Format-Volume
Get-Disk | Where-Object SerialNumber -match "XXXXXQKM" | Initialize-Disk -PassThru | New-Partition -AssignDriveLetter -UseMaximumSize | Format-Volume
C:\Windows\system32>FORMAT F: /FS:NTFS /P:1
ファイル システムの種類は NTFS です。
警告: ハード ディスクのドライブ F: のデータは
失われます。
フォーマットしますか (Y/N)? y
フォーマットしています 3.6 TB
ボリューム ラベルを入力してください。
(半角で 32 文字、全角で 16 文字以内)
必要なければ、Enter キーを押してください:
ファイル システム構造を作成します。
フォーマットは完了しました。
3.6 TB: 全ディスク領域
3.6 TB: 使用可能領域
C:\Windows\system32>
大容量HDDで既存のHDDを置き換えて台数を減らす 見出しにジャンプ
これを
PS> Get-StoragePool -FriendlyName HogePool | ||||||
---|---|---|---|---|---|---|
4TB | 4TB | |||||
4TB | 10TB |
# Size = 3.6TiB x 3 + 9TiB
# AllocatedSize = 3.6TiB x 4
Get-StoragePool -FriendlyName HogePool
FriendlyName OperationalStatus HealthStatus IsPrimordial IsReadOnly Size AllocatedSize
------------ ----------------- ------------ ------------ ---------- ---- -------------
HogePool OK Healthy False False 20.01 TB 14.55 TB
こうしたい
PS> Get-StoragePool -FriendlyName HogePool | ||||
---|---|---|---|---|
4TB | 4TB | |||
10TB (9TiB) |
# Size = 3.6TiB x 2 + 9TiB
# AllocatedSize = 3.6TiB x 4
Get-StoragePool -FriendlyName HogePool
FriendlyName OperationalStatus HealthStatus IsPrimordial IsReadOnly Size AllocatedSize
------------ ----------------- ------------ ------------ ---------- ---- -------------
HogePool OK Healthy False False 16.37 TB 14.55 TB
基本的に一対一でHDDを取り替える際の手順と同じ。
取り外したいPhysicalDisk
をRetired
にし、
Get-PhysicalDisk -SerialNumber XXXXXQKM
Number FriendlyName SerialNumber MediaType CanPool OperationalStatus HealthStatus Usage Size
------ ------------ ------------ --------- ------- ----------------- ------------ ----- ----
4 ST4000VN008-2DR166 XXXXXQKM HDD False OK Healthy Retired 3.64 TB
それが提供するVirtualDisk
を修復する。
しかし、Not enough available capacity
或いはこの操作のための十分に使用可能な空き容量がありません
と例外になってしまう。
PercentComplete
やBytesProcessed
を見ても、容量不足により途中で止まってしまっている。
Get-PhysicalDisk -SerialNumber XXXXXQKM | Get-VirtualDisk | Repair-VirtualDisk
Repair-VirtualDisk: Not enough available capacity
Get-StorageJob
Name IsBackgroundTask ElapsedTime JobState PercentComplete BytesProcessed BytesTotal
---- ---------------- ----------- -------- --------------- -------------- ----------
HogeDisk-Repair False 00:05:01 Exception 2 50.68 GB 2.39 TB
HogeDisk-Regeneration True 00:04:54 Running 2 50.68 GB 2.39 TB
PS> Get-StoragePool -FriendlyName HogePool | ||||||
---|---|---|---|---|---|---|
4TB (99.9%) | 4TB (99.9%) | |||||
4TB Retired (36.1%) | 10TB (65.8%) |
Optimize-StoragePool
を試したが、意味がないどころか何が最適化だと言わんばかりに方向性が真逆。
Get-StoragePool -FriendlyName HogePool | Optimize-StoragePool –Asjob
Get-StorageJob
Name IsBackgroundTask ElapsedTime JobState PercentComplete BytesProcessed BytesTotal
---- ---------------- ----------- -------- --------------- -------------- ----------
HogePool-Optimize False 00:01:14 Running 0 0 B 2.39 TB
HogeDisk-Regeneration True 00:01:01 Running 33 10.72 GB 32 GB
Get-StorageJob
Name IsBackgroundTask ElapsedTime JobState PercentComplete BytesProcessed BytesTotal
---- ---------------- ----------- -------- --------------- -------------- ----------
HogeDisk-Repair False 04:15:48 Exception 0 0 B 1.25 TB
HogePool-Optimize False 00:00:10 Completed 100 0 B 0 B
HogePool-Optimize False 00:00:10 Completed 100 0 B 0 B
PS> Get-StoragePool -FriendlyName HogePool | ||||||
---|---|---|---|---|---|---|
4TB (99.9%) | 4TB (99.9%) | |||||
4TB (94.4%) | 10TB (66.1%) |
Retired
に戻してもほぼ元に戻るだけ。
PS> Get-StoragePool -FriendlyName HogePool | ||||||
---|---|---|---|---|---|---|
4TB (99.9%) | 4TB (99.9%) | |||||
4TB Retired (34.5%) | 10TB (66.1%) |
どうして🤔
StoragePool
はHDDが綺麗にペアをつくってミラーなりパリティになっているイメージかもしれないが、
PS> Get-StoragePool -FriendlyName HogePool | |||||||
---|---|---|---|---|---|---|---|
4TB 🔵🟨 | 4TB 🔶🔺 | ||||||
↕ | ↕ | ||||||
4TB 🔵🟨 | 4TB 🔶🔺 |
実際のデータは浮気しまくりの混沌のミラー(およびパリティ)になっている。
PS> Get-StoragePool -FriendlyName HogePool | |||||||
---|---|---|---|---|---|---|---|
4TB 🔵🟨🔶 | ←→ | 4TB 🔵🟨🔺 | |||||
↕ | ↙↘↖↗ | ↕ | |||||
4TB 🔶🔺🔵 | ←→ | 4TB 🔶🔺🟨 |
私の環境では、同じ色(型番)のHDDは一緒に入れているので、寧ろこの状態に近い推測できる。
PS> Get-StoragePool -FriendlyName HogePool | |||||||
---|---|---|---|---|---|---|---|
4TB 🔵🟨 | ←→ | 4TB 🔵🟨 | |||||
4TB 🔶🔺 | ←→ | 4TB 🔶🔺 |
緑のPhysicalDisk
両方共取り出すには都合が悪く、首尾よく取り出せるはずもない。
PS> Get-StoragePool -FriendlyName HogePool | |||||||
---|---|---|---|---|---|---|---|
4TB 🔵🟨 | ←→ | 4TB 🔵🟨 | |||||
4TB 🔶🔺 | ←→ | 4TB 🔶🔺 |
ハノイの塔のようにじわじわとデータを移動させながら取り外す必要がある。
StoragePool
は異なるサイズのHDDを組み合わせられるが、限られた容量の中で賢くデータを移動させてくれる訳でも、移動先を明示的に指定するCmdLetが用意されている訳でもない(Optimize-StoragePool
は目的に合わない)。
潔く同じサイズのストレージをペアで多めに入荷するのが良いのだろう。コンシューマ向けの少ないSATAポートでやりくりしようとしているのがそもそもの間違いだ。
私の環境ではこのように取り外す予定のないPhysicalDisk
もRetired
にしデータの移動を促して、一応目的のPhysicalDisk
を取り外すことができた。
Get-PhysicalDisk
のAllocatedSize
やGet-StorageJob
のBytesProcessed
、GUIがあればコントロールパネルで進捗を確認しながら進めると良いだろう。
PS> Get-StoragePool -FriendlyName HogePool | ||||||
---|---|---|---|---|---|---|
4TB 🔵🟨 | 4TB 🔵🟨 | |||||
4TB Retired 🔶🔺 | 10TB 🔶🔺 |
# ダメです!
Get-PhysicalDisk -SerialNumber XXXXXQKM | Get-VirtualDisk | Repair-VirtualDisk
Repair-VirtualDisk: Not enough available capacity
PS> Get-StoragePool -FriendlyName HogePool | ||||||
---|---|---|---|---|---|---|
4TB Retired 🟨 | 4TB 🔵🟨 | |||||
4TB Retired 🔶🔺 | 10TB 🔶🔺🔵 |
# 左上のPhysicalDiskをRetiredにして
Get-PhysicalDisk -SerialNumber WD-XXXXXXXXXJER | Set-PhysicalDisk –Usage Retired
# 左上のPhysicalDiskが提供するVirtualDiskをRepairして
Get-PhysicalDisk -SerialNumber WD-XXXXXXXXXJER | Get-VirtualDisk | Repair-VirtualDisk -AsJob
Get-StorageJob
# 左上のPhysicalDiskをAutoSelectに戻す
Get-PhysicalDisk -SerialNumber WD-XXXXXXXXXJER | Set-PhysicalDisk –Usage AutoSelect
# 左下のPhysicalDisk、ダメです!
Get-PhysicalDisk -SerialNumber XXXXXQKM | Get-VirtualDisk | Repair-VirtualDisk
Repair-VirtualDisk: Not enough available capacity
Get-StorageJob
Name IsBackgroundTask ElapsedTime JobState PercentComplete BytesProcessed BytesTotal
---- ---------------- ----------- -------- --------------- -------------- ----------
HogeDisk-Repair False 04:11:47 Exception 0 0 B 1.25 TB
PS> Get-StoragePool -FriendlyName HogePool | ||||||
---|---|---|---|---|---|---|
4TB 🟨🔶 | 4TB Retired 🔵 | |||||
4TB Retired 🔺 | 10TB 🔶🔺🔵🟨 |
# 右上のPhysicalDiskをRetiredにして
Get-PhysicalDisk -SerialNumber WD-XXXXXXXXX7PZ | Set-PhysicalDisk –Usage Retired
# 右上のPhysicalDiskが提供するVirtualDiskをRepairして
Get-PhysicalDisk -SerialNumber WD-XXXXXXXXX7PZ | Get-VirtualDisk | Repair-VirtualDisk -AsJob
Get-StorageJob
Name IsBackgroundTask ElapsedTime JobState PercentComplete BytesProcessed BytesTotal
---- ---------------- ----------- -------- --------------- -------------- ----------
HogeDisk-Repair False 15:31:28 Exception 0 10.73 GB 1.26 TB
HogeDisk-Repair False 15:31:28 Running 0 10.73 GB 1.26 TB
HogeDisk-Regeneration True 00:01:02 Running 0 10.73 GB 1.26 TB
# 右上のPhysicalDiskをAutoSelectに戻す
Get-PhysicalDisk -SerialNumber WD-XXXXXXXXX7PZ | Set-PhysicalDisk –Usage AutoSelect
# 左下のPhysicalDisk、まだダメです!
# 複数回実行すると少し進むかもしれないが限界はある
Get-PhysicalDisk -SerialNumber XXXXXQKM | Get-VirtualDisk | Repair-VirtualDisk
Repair-VirtualDisk: Not enough available capacity
Get-StorageJob
Name IsBackgroundTask ElapsedTime JobState PercentComplete BytesProcessed BytesTotal
---- ---------------- ----------- -------- --------------- -------------- ----------
HogeDisk-Repair False 15:39:27 Exception 7 92.67 GB 1.26 TB
HogeDisk-Regeneration True 00:09:01 Running 7 92.67 GB 1.26 TB
PS> Get-StoragePool -FriendlyName HogePool | ||||||
---|---|---|---|---|---|---|
4TB 🟨🔶 | 4TB 🔵🔺 | |||||
4TB Retired | 10TB 🔶🔺🔵🟨 |
# 左下のPhysicalDisk、
Get-PhysicalDisk -SerialNumber XXXXXQKM | Get-VirtualDisk | Repair-VirtualDisk -AsJob
Get-StorageJob
Name IsBackgroundTask ElapsedTime JobState PercentComplete BytesProcessed BytesTotal
---- ---------------- ----------- -------- --------------- -------------- ----------
HogeDisk-Repair False 4166.15:43:56 Running 0 375.75 MB 949 GB
HogeDisk-Regeneration True 00:00:02 Running 0 375.25 MB 949 GB
Get-StorageJob
Name IsBackgroundTask ElapsedTime JobState PercentComplete BytesProcessed BytesTotal
---- ---------------- ----------- -------- --------------- -------------- ----------
HogeDisk-Repair False 4166.16:56:00 Running 73 693.03 GB 949 GB
HogeDisk-Regeneration True 01:12:06 Running 73 693.03 GB 949 GB
# ヨシッ!
Get-StorageJob
Name IsBackgroundTask ElapsedTime JobState PercentComplete BytesProcessed BytesTotal
---- ---------------- ----------- -------- --------------- -------------- ----------
HogeDisk-Repair False 01:24:26 Completed 100 0 B 0 B
最後にPhysicalDisk
をStoragePool
から削除する。一対一でHDDを取り替える際の手順と同じ。
Remove-PhysicalDisk -PhysicalDisks (Get-PhysicalDisk -SerialNumber XXXXXQKM) -StoragePoolFriendlyName "HogePool"
StoragePool
にPhysicalDisk
を追加したことで、VirtualDisk
に割り当てられる実効容量が増えた場合は、Resize-VirtualDisk
でWindows上のディスク容量を拡張する。
今回は実効容量は増えていないので例外。
Get-VirtualDisk HogeDisk | Resize-VirtualDisk -Size 14.56TB
4TBx2, 10TBから生まれた端数2TBを有効活用すべく、冗長化のないVirtualDisk
を最大サイズで作成。
PS> Get-StoragePool -FriendlyName HogePool | ||||
---|---|---|---|---|
4TB | 4TB | |||
10TB (9TiB) |
New-VirtualDisk -StoragePoolFriendlyName HogePool -FriendlyName BackupVirtualDisk -ProvisioningType Fixed -ResiliencySettingName Simple -UseMaximumSize
FriendlyName ResiliencySettingName FaultDomainRedundancy OperationalStatus HealthStatus Size FootprintOnPool StorageEfficiency
------------ --------------------- --------------------- ----------------- ------------ ---- --------------- -----------------
BackupVirtualDisk Simple 0 OK Healthy 1.82 TB 1.82 TB 100.00%
Get-VirtualDisk
FriendlyName ResiliencySettingName FaultDomainRedundancy OperationalStatus HealthStatus Size FootprintOnPool StorageEfficiency
------------ --------------------- --------------------- ----------------- ------------ ---- --------------- -----------------
HogeDisk Mirror 1 OK Healthy 7.28 TB 14.55 TB 50.00%
BackupVirtualDisk Simple 0 OK Healthy 1.82 TB 1.82 TB 100.00%
仮想ディスクのドライブレター割り当て・フォーマットを行う。
Get-Disk | Where-Object FriendlyName -Eq "BackupVirtualDisk" | Initialize-Disk -PassThru | New-Partition -AssignDriveLetter -UseMaximumSize | Format-Volume
DriveLetter FriendlyName FileSystemType DriveType HealthStatus OperationalStatus SizeRemaining Size
----------- ------------ -------------- --------- ------------ ----------------- ------------- ----
F NTFS Fixed Healthy OK 1.82 TB 1.82 TB