-
Notifications
You must be signed in to change notification settings - Fork 1
/
Move-VMThin SVMotion.ps1
67 lines (55 loc) · 2.48 KB
/
Move-VMThin SVMotion.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#suspends running vm and moves to different datastore.
#bulk of this file is the Move-VMThin function, which can be modfied to do preallocated too
#edit the $spec.transform line to "sparse" to use thin disks, and "flat" for normal
#end of files has example lines to edit to choose the vm's you want to move and where
#edit line 13 to point to your vcenter
#setup vi api
if ((Get-PSSnapin "VMware.VimAutomation.Core" -ErrorAction SilentlyContinue) -eq $null) {
Add-PSSnapin "VMware.VimAutomation.Core"
}
#connect to vcenter
Connect-VIServer -server vcenter
function Move-VMThin {
PARAM(
[Parameter(Mandatory=$true,ValueFromPipeline=$true,HelpMessage="Virtual Machine Objects to Migrate")]
[ValidateNotNullOrEmpty()]
[System.String]$VM
,[Parameter(Mandatory=$true,HelpMessage="Destination Datastore")]
[ValidateNotNullOrEmpty()]
[System.String]$Datastore
)
Begin {
#Nothing Necessary to process
} #Begin
Process {
#Prepare Migration info, uses .NET API to specify a transformation to thin disk
$vmView = Get-View -ViewType VirtualMachine -Filter @{"Name" = "$VM"}
$dsView = Get-View -ViewType Datastore -Filter @{"Name" = "$Datastore"}
#Abort Migration if free space on destination datastore is less than 50GB
if (($dsView.info.freespace / 1GB) -lt 50) {throw "Move-ThinVM ERROR: Destination Datastore $Datastore has less than 50GB of free space. This script requires at least 50GB of free space for safety. Please free up space or use the VMWare Client to perform this Migration"}
#suspends first and wait
Suspend-VMGuest -VM $VM
while ("poweredOn" -contains $vmView.Runtime.PowerState) {
sleep 1
$vmView.UpdateViewData("Runtime.PowerState")
$vmView.Runtime.PowerState
}
#Prepare VM Relocation Specificatoin
$spec = New-Object VMware.Vim.VirtualMachineRelocateSpec
$spec.datastore = $dsView.MoRef
$spec.transform = "sparse" #"flat"
#Perform Migration
$taskMoRef = $vmView.RelocateVM_Task($spec, $null)
#wait for migrate
$task = Get-View $taskMoRef
while ("running","queued" -contains $task.Info.State) {
sleep 5
$task.UpdateViewData("Info.State")
}
#start again
Start-VM -VM $VM
} #Process
}
Move-VMThin -VM "vpn" -Datastore "iscsi2"
Move-VMThin -VM "web" -Datastore "iscsi2"
Move-VMThin -VM "mailman" -Datastore "iscsi2"