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

記憶域プール

なんだからよく分からない記憶域プールを分からないなりに完全に理解したつもり

更新履歴 見出しにジャンプ

日時 内容
2020-12-29
  • 既存の記憶域プールの物理ディスクを交換して一対一でHDDを取り替えたり大容量HDDで既存のHDDを置き換えて台数を減らす
  • バックアップと冗長化 見出しにジャンプ

    誤っていたり不正確な場合は、布に包んだ斧を優しく投げて頂けると嬉しい。

    バックアップはWindows上のpwshからWSL上のrsyncを叩いて世代管理しているが、大容量ファイル(動画ファイルなど)は片方向ミラーという微妙な状態。
    一方向のミラーではあまり冗長化にならないという認識。

    バックアップ 冗長化
  • 変更前のファイルに戻せる
  • 削除したファイルを戻せる
  • HDD破損時にも動き続ける
  • HDD破損時に戻せる
  • RAIDと記憶域プール 見出しにジャンプ

    RAIDも検討したが、構成変更のし易さから記憶域プールの双方向ミラーを選択。
    最初はまっさらな物理ディスクが必要だが、環境ができれば、既にある仮想ディスク上のパーティションの内容を保持しながら、必要に応じて後から物理ディスクを追加できる。

    全体的な流れとしては

    1. 使うディスクをリセットして
    2. 記憶域プールをつくって
    3. 仮想ディスクをつくる(ドライブレターを割り当て)

    前提環境 見出しにジャンプ

    • 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
    

    DriveLetterGet-PartitionMediaTypeGet-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-DiskGet-PhysicalDiskFriendlyNameは別のようで、下記のように変更しても肝心のGet-Diskでは使用できなかった。

    # Get-PhysicalDiskからSet-PhysicalDiskにパイプで渡し、NewFriendlyNameを取得
    Get-PhysicalDisk -SerialNumber "WD-XXXXXXXXX7PZ" | Set-PhysicalDisk -NewFriendlyName "WD40PURZ-85TTDY0-7PZ"
    

    SerialNumber指定で操作していく。

    ディスクの削除・初期化 見出しにジャンプ

    ディスク内のデータの削除(完全な削除ではない)と初期化を行う。

    パイプラインを使用せず、個別のCmdLetでDiskNumberUniqueIdを指定するような操作方法では、私のように誤ってデータの方を飛ばす可能性が高まるのでオススメしない

    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-PartitionFormat-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

    下記のようなフォーマットを促すGUIが表示されるかもしれないが、既に実行されているためキャンセルを押下。

    Microsoft Windows
  • ドライブ D: を使うにはフォーマットする必要があります。
  • フォーマットしますか?
  • ディスクのフォーマットキャンセル

    新しいディスク 見出しにジャンプ

    挿したてほやほやの新しい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. #ドライブレター割り当て・フォーマット、再度実行。

    記憶域プールを作成。
    プールのFriendlyNameSet-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}: この要求はサポートされていません。
    
    

    SizeAllocatedSizeが増えていることを確認。
    下記は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-StoragePoolAllocatedSize7.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 
    

    記憶域プールのアップデート 見出しにジャンプ

    Update-StoragePool -FriendlyName HogePool -WhatIf
    

    既存の記憶域プールの物理ディスクを交換 見出しにジャンプ

    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 追加

    取り外したいPhysicalDiskRetiredに設定する。
    即座に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-VirtualDiskRetiredになったPhysicalDiskが提供していたVirtualDiskを修復する。
    JobStateCompletedになったら完了。

    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
    

    最後にPhysicalDiskStoragePoolから取り外す。

    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を取り替える際の手順と同じ。
    取り外したいPhysicalDiskRetiredにし、

    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或いはこの操作のための十分に使用可能な空き容量がありませんと例外になってしまう。
    PercentCompleteBytesProcessedを見ても、容量不足により途中で止まってしまっている。

    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ポートでやりくりしようとしているのがそもそもの間違いだ。

    私の環境ではこのように取り外す予定のないPhysicalDiskRetiredにしデータの移動を促して、一応目的のPhysicalDiskを取り外すことができた。
    Get-PhysicalDiskAllocatedSizeGet-StorageJobBytesProcessed、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
    

    最後にPhysicalDiskStoragePoolから削除する。一対一でHDDを取り替える際の手順と同じ。

    Remove-PhysicalDisk -PhysicalDisks (Get-PhysicalDisk -SerialNumber XXXXXQKM) -StoragePoolFriendlyName "HogePool"
    

    StoragePoolPhysicalDiskを追加したことで、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