Internals/Storage.ps1

#Requires -RunAsAdministrator
#Requires -Modules Hyper-V


# * Fixtures


$GUID_EFI_SYSTEM_PARTITION = '{c12a7328-f81f-11d2-ba4b-00a0c93ec93b}'


$vmms = gwmi -namespace root\virtualization\v2 Msvm_VirtualSystemManagementService
$vmmsSettings = gwmi -namespace root\virtualization\v2 Msvm_VirtualSystemManagementServiceSettingData
$VirtualDrivePath = $vmmsSettings.DefaultVirtualHardDiskPath


# * Fns


function New-VHDForWindowsVMSystemVolume
{
    [CmdletBinding()]
    param
    (
        [UInt64]
        [ValidateNotNullOrEmpty()]
        [ValidateRange(16GB, 64TB)]
        $SizeBytes = 255GB,

        [UInt64]
        [ValidateNotNullOrEmpty()]
        $BlockSizeBytes = 1MB,

        [string]
        [ValidateNotNullOrEmpty()]
        $vhdName = ([guid]::NewGuid().toString() + ".vhdx"),

        [string]
        [ValidateNotNullOrEmpty()]
        $vhdPath = (Join-Path $VirtualDrivePath $vhdName)
    )


    $NewVHDParam = @{
        Path = $vhdPath
        SizeBytes = $SizeBytes
        BlockSizeBytes = $BlockSizeBytes
    }
    $VHD = New-VHD @NewVHDParam


    $disk = $VHD | Mount-VHD -PassThru | Initialize-Disk -PartitionStyle GPT -Passthru
    $disk | New-Partition -GptType $GUID_EFI_SYSTEM_PARTITION -Size 200MB `
      | Format-Volume -FileSystem FAT32 -NewFileSystemLabel ESP -confirm:$false `
      | Out-Null
    $disk | New-Partition -UseMaximumSize `
      | Format-Volume -FileSystem NTFS -NewFileSystemLabel WINNT -confirm:$false `
      | Out-Null


    $VHD | Format-Table | Out-String | Write-Host
    $disk | Get-Partition | Format-Table | Out-String | Write-Host
    $disk | Get-Partition | Get-Volume | Format-Table | Out-String | Write-Host


    Dismount-VHD -Path $NewVHDParam.Path


    return $VHD
}


function New-VHDForWindowsVMDataVolume
{
    #Requires -RunAsAdministrator
    #Requires -Modules Hyper-V
    [CmdletBinding()]
    param
    (
        [UInt64]
        [ValidateNotNullOrEmpty()]
        [ValidateRange(16GB, 64TB)]
        $SizeBytes = 255GB,

        [UInt64]
        [ValidateNotNullOrEmpty()]
        $BlockSizeBytes = 1MB,

        [string]
        [ValidateNotNullOrEmpty()]
        $vhdName = ([guid]::NewGuid().toString() + ".vhdx"),

        [string]
        [ValidateNotNullOrEmpty()]
        $vhdPath = (Join-Path $VirtualDrivePath $vhdName)
    )


    $NewVHDParam = @{
        Path = $vhdPath
        SizeBytes = $SizeBytes
        BlockSizeBytes = $BlockSizeBytes
    }
    $VHD = New-VHD @NewVHDParam


    $disk = $VHD | Mount-VHD -PassThru | Initialize-Disk -PartitionStyle GPT -Passthru
    $disk | Get-Partition | Remove-Partition -confirm:$false
    $disk | New-Partition -UseMaximumSize `
      | Format-Volume -FileSystem NTFS -NewFileSystemLabel DATA -confirm:$false `
      | Out-Null


    $disk | Get-Partition | Format-Table | Out-String | Write-Host
    $disk | Get-Partition | Get-Volume | Format-Table | Out-String | Write-Host


    Dismount-VHD -Path $NewVHDParam.Path


    return $VHD
}


function New-VHDForDataVolume
{
    #Requires -RunAsAdministrator
    #Requires -Modules Hyper-V
    [CmdletBinding()]
    param
    (
        [UInt64]
        [ValidateNotNullOrEmpty()]
        [ValidateRange(16GB, 64TB)]
        $SizeBytes = 255GB,

        [UInt64]
        [ValidateNotNullOrEmpty()]
        $BlockSizeBytes = 1MB,

        [string]
        [ValidateNotNullOrEmpty()]
        $vhdName = ([guid]::NewGuid().toString() + ".vhdx"),

        [string]
        [ValidateNotNullOrEmpty()]
        $vhdPath = (Join-Path $VirtualDrivePath $vhdName)
    )


    $NewVHDParam = @{
        Path = $vhdPath
        SizeBytes = $SizeBytes
        BlockSizeBytes = $BlockSizeBytes
    }
    $VHD = New-VHD @NewVHDParam


    return $VHD
}