vSphere Horizon View中运用了链接克隆的方法来使多个VDI使用同一基础镜像,而在没有View环境的时候,vSphere的GUI中没有链接克隆的相关使用项。这种情况下,可以使用PowerCLI来创建链接克隆的VM。


方法一:

来源:http://michlstechblog.info/blog/vmware-vsphere-create-a-linked-clone-with-powercli/

Connect-VIServer "vCenter_FQDN"
$sourceVM="source_vm_name"
#指定源VM名称

$sourceVMSnapshotName="linkedclone_snap" 
#定义快照名称

$NewVMName="linked_clone_VM"
#定义链接克隆方式创建的VM的名字

$cloneFolder=(Get-VM $sourceVM).Folder
#获取源VM所在文件夹

$sourceSnapShot=New-Snapshot -VM $sourceVM -Name $sourceVMSnapshotName -Description "Snapshot for linked clones" -Memory -Quiesce
#为源VM创建快照

$ESXDatastore=Get-Datastore -Name "Datastore1"
#指定存储

$LinkedCloneVM=New-VM -Name $NewVMName -VM $sourceVM -Location $cloneFolder -Datastore $ESXDatastore -ResourcePool Resources -LinkedClone -ReferenceSnapshot $sourceSnapShot
#以LinkedClone方式生成VM

Start-VM $LinkedCloneVM
#链接克隆VM开机

Stop-VM $LinkedCloneVM -Confirm:$false
#关机

Remove-VM -DeletePermanently $LinkedCloneVM -Confirm:$false 
#删除链接克隆VM

Remove-Snapshot -Snapshot $sourceSnapShot -Confirm:$false
#移除快照

 
方法二:

来源:http://www.vmdev.info/?p=40

Connect-VIServer "vCenter_FQDN"
#连接到vCenter
$sourceVM = Get-VM "source_vm_name" | Get-View
#获取源VM对象的View对象
$cloneName = "linked_clone_VM"
#定义克隆VM名称
$cloneFolder = $sourceVM.parent
#获取源VM所在文件夹(群集、资源池)
$cloneSpec = new-object Vmware.Vim.VirtualMachineCloneSpec
$cloneSpec.Snapshot = $sourceVM.Snapshot.CurrentSnapshot
#指定克隆方式,基于源VM的当前快照

$cloneSpec.Location = new-object Vmware.Vim.VirtualMachineRelocateSpec
$cloneSpec.Location.DiskMoveType = [Vmware.Vim.VirtualMachineRelocateDiskMoveOptions]::createNewChildDiskBacking
#磁盘拷贝类型为ChildDiskBacking
 
$sourceVM.CloneVM_Task( $cloneFolder, $cloneName, $cloneSpec )
#执行链接克隆


综上方法,写成脚本

#加载PowerCLI环境
Add-PSSnapin VMware.VimAutomation.Core 
C:\"Program Files (x86)\VMware\Infrastructure\vSphere PowerCLI\Scripts\Initialize-PowerCLIEnvironment.ps1"

#根据提示输入vCenter连接信息的方式,可以根据实际环境,将部分变量写成固定参数
$VCServer = Read-Host "Enter vCenter Server Name"
$Username = Read-Host "Enter Username"
$Password = Read-Host "Enter Password"
$SourceVM = Read-Host "Enter Source VM Name"
$CloneVM  = Read-Host "Enter Clone VM Name"
#连接vCenter Server
Connect-VIServer $VCServer -User $Username -Password $Password -Port 443

#如果源VM当前快照名称不是Linked_Clone则为该VM创建快照
if ((Get-Snapshot -VM $sourceVM).Name -ne "Linked_Clone") {
$SourceSnapshot = New-Snapshot -VM $SourceVM -Name "Linked_Clone" -Description "Snapshot for linked clones." -Memory -Quiesce
}

$sourceVMView = Get-VM $SourceVM | Get-View
$CloneFolder = $sourceVMView.parent
$CloneSpec = New-Object Vmware.Vim.VirtualMachineCloneSpec
$CloneSpec.Snapshot = $sourceVMView.Snapshot.CurrentSnapshot
$CloneSpec.Location = new-object Vmware.Vim.VirtualMachineRelocateSpec
$CloneSpec.Location.DiskMoveType = [Vmware.Vim.VirtualMachineRelocateDiskMoveOptions]::createNewChildDiskBacking

#执行VM链接克隆任务
$sourceVMView.CloneVM_Task($CloneFolder, $CloneVM, $CloneSpec)