🖋️2020-01-17 🔄2020-01-17
by shibanyan_1

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

記憶域プール

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

バックアップと冗長化 #

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

バックアップは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 -Eq "     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
    

    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となっているが、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-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