Etikettarkiv: VHDX

Hyper-V – Automatisering av diskhantering

Spinner vidare på Drakfots guide om initiering, partionering samt formatering av disk på virtuell server.

Har skapat ett script som jobbat mot Hyper-V i Windows Server 2012 (ej R2).
Kommer anpassa scriptet för Hyper-V i 2012 R2 när jag hunnit få upp en sådan maskin.

Stora förändringen mellan Hyper-V i 2012 och 2012 R2 är att du kan utföra allt i drift. I 2012 behöver den virtuella servern stängas ner för att koppla disken osv.

Scriptet tar bara hänsyn till lokala diskar som finns kopplade på Hyper-V-servern.
Har inte lagt in så mycket felhantering utan mer fokuserat på att få upp funktionen.

Krav före exekvering:
1) En fungerande inloggningsmiljö
2) Kontot du exekverar koden med måste vara administratör på Hyper-V-servern samt den virtuella servern du vill installera disken på.
3) Namnet på den virtuella maskinen i Hyper-V måste vara samma som DNS-namnet för att Powershell remoting ska fungera.

Då kör vi. 🙂

# Skapat av Qraze, https://www.qraze.se
# Kommandon som exekveras på den virtuella maskinen är hämtat från http://sleepdontexist.com.
# Scriptnamn: Add_Disk_to_VM.ps1
# Skapat: 2013-12-28
# Exekveras på Hyper-V-servern.

# Hämtar samtliga lokala diskar på Hyper-V-servern. Har filtrerat ut C: och System Reserved då dessa inte ska användas till virtuella maskiner.
# Välj den disk du vill skapa VHDX-filen på.
$selectedPhysicalDisk = Get-Volume | where { $_.DriveLetter -ne "C" -and $_.FileSystemLabel -ne "System Reserved" } | select DriveLetter,@{Name=”Free Space (GB)”;Expression={“{0:N1}” -f($_.SizeRemaining/1gb)}} | Out-GridView -PassThru

# Placerar data från selectedPhysicalDisk i separata variabler för enklare hantering.
$PhysicalDriveLetter = "$($selectedPhysicalDisk.DriveLetter):"
$PhysicalDiskFreeSpace = $selectedPhysicalDisk.'Free Space (GB)'

if (!(Test-Path "$($PhysicalDriveLetter)AutoDisk")){
    New-Item -ItemType Directory -Name AutoDisk -Path $PhysicalDriveLetter
}

# Hämtar samtliga virtuella maskiner.
# Välj den maskin du vill koppla den nya disken till.
$selectedVirtualMachine = Get-VM | Out-GridView -PassThru
$VmName = $selectedVirtualMachine.Name

# Hämtar antal filer för löpnummer
[int]$count = (Get-ChildItem "$($PhysicalDriveLetter)AutoDisk").count
$count++
$count.ToString()
$VHDName = "$($VMname)_disk$($count).vhdx"
$VHDFullPath = "$($PhysicalDriveLetter)AutoDisk$($VHDName)"

# Ange önskad diskstorlek
[int]$diskSize = Read-Host "Ange önskad diskstorlek i GB (Max $($PhysicalDiskFreeSpace)GB) (Ex: 40)"
$diskSizeBytes = $diskSize * 1073741824
New-VHD -Dynamic -Path "$($PhysicalDriveLetter)AutoDisk$($VHDName)" -SizeBytes $diskSizeBytes

# Kontrollerar om den virtuella maskinen är igång, i så fall stängs den av nu.
$VmState = (Get-Vm -Name $VmName).State
if ($VmState -eq "Running"){
    $state = "Running"
    Stop-Computer -ComputerName $VmName -Force
    While ($state -eq "Running"){
        Write-Host "Väntar på att den virtuella maskinen stängs ner."
        $VmState = (Get-Vm -Name $VmName).State
        if ($VmState -eq "Running"){
            Start-Sleep -Seconds 5
        }
        else{
            $state = "Stopped"
            Write-Host "Maskinen har stoppats."
        }
    }
}

Write-Host "Lägger till disken på den virtuella maskinen."
# Kopplar den nya disken till den virtuella maskinen på IDE-port.
ADD-VMHardDiskDrive -VMName $VmName -Path $VHDFullPath

# Startar den virtuella maskinen
Write-Host "Startar den virtuella maskinen"
Start-VM -VMName $VmName

# Väntar 30 sekunder på att maskinen startar och svarar på ping.
Write-Host "Väntar 30 sekunder på att den virtuella maskinen svarar på ping"
Start-sleep -Seconds 30
if (Test-Connection -ComputerName $VmName){
    Write-Host "Maskinen svarar på ping. Exekverar kod remote på maskinen"
    # Kör Powershell remote på den virtuella maskinen för att aktivera den nya disken och formatera den samt generera en ledig enhetsbokstav.
    Invoke-Command -ComputerName $VmName -ScriptBlock {
        # Detta körs inne på den virtuella maskinen.
        Get-Disk | where { $_.PartitionStyle -eq "RAW" } | Initialize-Disk -PartitionStyle GPT -PassThru | New-Partition -AssignDriveLetter -UseMaximumSize | Format-Volume -Confirm:$False
    }
}