Weisheiten - der Netz-Weise Blog
Virtuelle Festplatten (vhdx) als Datencontainer verwenden - nicht nur für VMs
Virtuelle Festplatten (Vhdx-Dateien) in Windows sind sehr praktisch. Man kann Sie nämlich nicht nur für virtuelle Maschinen verwenden, sondern auch als universelles Containerformat, um Daten zu transportieren oder sogar, um Windows aus einer VHD-Datei zu booten (s. https://www.netz-weise-it.training/weisheiten/tipps/item/377-boot-von-vhd-auf-einem-leeren-datentraeger-einrichten.html). Das Erstellen einer VHD-Datei ist allerdings etwas mühselig, weil man erst die Datei erstellen, dann einrichten und anschließend eine Partition erstellen muss. Da man das aber auch mit Powershell erledigen kann, und ich dieses Feature sehr oft verwende, habe ich eine kleine Funktion dafür geschrieben.
#requires -Modules Hyper-V, Storage -RunAsAdministrator
function Get-Freedrive
{
<#
.SYNOPSIS
Get-Freedrives lists the first free driveletter in the alphabet.
.DESCRIPTION
Get-Freedrive can be used to test for the first available free driveletter. The Parameter $inverse searches backwards through the alphabet.
.EXAMPLE
get-freedrive -inverse -startLetter Z
Starts the search with letter z searching backwards. Returns a character.
.NOTES
Version: 1.0
Author: Holger Voges
Date: 2018-08-17
www.netz-weise-it.training/weisheiten/
#>
[cmdletbinding()]
param(
# The letter to start the search from - default is C or Z, if -inverse is chosen
[char]$startLetter = 'C',
# Inverse forces a backwards search through the alphabet
[switch]$inverse
)
# Setting Start-Letter to Z when using inverse Search
If ( -not ( $PSBoundParameters.ContainsKey('Startletter') ) -and ( $inverse ) )
{ $startLetter = 'Z' }
[int]$Counter = ([Convert]::ToByte( $startLetter ))
if ( $inverse )
{ $Chararray = $Counter..67 }
Else { $Chararray = $Counter..90 }
$drives = Get-PSDrive -PSProvider FileSystem
foreach ( $letter in $CharArray )
{
if ( [Char]$letter -notin $drives.Name )
{
[char]$letter
break
}
}
}
Function New-ContainerVHD
{
<#
.SYNOPSIS
Creates a new VHD-Container-File
.DESCRIPTION
This Function Creates a VHD-File, creates a partition and formats it with ntfs. The Drive
is mounted afterwards.
.EXAMPLE
Create a new VHDX-File as a 500GB Differencing File and mount it as X:
New-ContainerVHD -Path D:\Sourcen.vhdx -DriveLetter X
.EXAMPLE
Create a new VHDX-File as a 100GB Differencing File and mount it as X: with a label Isos
New-ContainerVHD -Path D:\Sourcen.vhdx -DriveLetter X -Label isos
.NOTES
Version: 1.0
Author: Holger Voges
Date: 2019-04-26
www.netz-weise-it.training/weisheiten/
#>
param(
# The Path for the Container-VHD
[Parameter(Mandatory=$true)]
[string]$Path,
# The Driveletter the Drive is mounted to
[ValidateScript({ if ( $_ -in (( Get-PSDrive ).Name ))
{ Throw "$_ is already used" }
$true
})]
[Char]$DriveLetter = 'M',
# The Size of the Disk in Bytes. Minimum is 100MB, Maximum is 64TB.
[ValidateRange(104857600,70368744177664)]
[int64]$SizeBytes = 500GB,
# The Name which will be shown in the File-Explorer
[ValidateLength(1,32)]
[String]$FileSytemLabel = 'Data'
)
$vhd = New-VHD -Path $Path -SizeBytes $SizeBytes | Mount-VHD -Passthru
$disk = $vhd | Initialize-Disk -PartitionStyle GPT -PassThru
$part = $disk | New-Partition -UseMaximumSize
$part | Format-Volume -FileSystem NTFS -NewFileSystemLabel $FileSytemLabel -Confirm:$false
Set-Partition -DiskNumber $vhd.Number -PartitionNumber $part.PartitionNumber -NewDriveLetter $DriveLetter
}
Sie können die beiden Funktionen in einer Skriptdatei ausführen und anschließend über New-ContainerVHD speichern. Alternativ können Sie die Skriptdatei auch einfach als Modul speichern. Wie das geht beschreibe ich im Artikel Ein Powershell Skriptmodul erstellen.
Beachten Sie, dass das Skript nur dann funktioniert, wenn Sie Hyper-V installiert haben und eine administrative Powershell-Konsole verwenden. Hyper-V können Sie ab Windows 8 in der Professional-Version und aufwärts einfach nachinstallieren. Verwenden Sie hierfür das Kommando
Install-WindowsOptionalFeature -FeatureName Microsoft-Hyper-V-All -online
Kommentare