2016-08-23 79 views
0

我想克隆VM,並且想更改磁盤容量。使用VI Java API修改虛擬磁盤大小

int virtualDisksCount = 0; 
    VirtualDisk virtualDisk = null; 
    for (VirtualDevice virtualDevice : virtualHardware.getDevice()) { 
     if (virtualDevice instanceof VirtualDisk) { 
      virtualDisksCount++; 
      virtualDisk = (VirtualDisk) virtualDevice; 
     } 
    } 
    if (virtualDisksCount == 1) { 
     VirtualDeviceConfigSpec discSpec = new VirtualDeviceConfigSpec(); 
     discSpec.setOperation(VirtualDeviceConfigSpecOperation.EDIT); 

     virtualDisk.setCapacityInBytes(155500000000l); 
     virtualDisk.setCapacityInKB(155500000000000000l); 


     discSpec.setDevice(virtualDisk); 

     return discSpec; 
    } 

代碼拋出異常:設備'0'的無效操作。 我在CloneVm_Task和ReconfigureVM_Task中傳遞了這些參數,發生相同的錯誤

如何更改虛擬磁盤容量?使用Vsphere 5.5

+1

遇到了類似的問題 – bopomofu

+0

我已經找到了解決。您可以使用最少需要的硬盤創建映像,例如10 GB,然後您應該使用DiskManager擴展大小。所以我們只做擴展硬盤不收縮 –

+0

你是指使用virtualDiskManager數據對象嗎?你可以幫助詳細說明如何做到這一點,我們甚至沒有從VirtualDevice捕獲DiskObjectId - 它返回NULL – bopomofu

回答

1

我不用Java編寫代碼,但它足夠接近C#,可以幫助我。首先要做到這一點,您需要獲取磁盤信息,然後取出virtualdeviceconfigspec,對其進行更改,然後添加附加到磁盤。您正在創建一個新的規範,然後設置屬性。另外,你爲什麼要設置字節大小然後kb?

這裏是所有的Java我能鼓起...

myDisk.setCapacityInKB(Long.parseLong(50)*1024*1024); 
VirtualDeviceConfigSpec vdConfigSpec = new VirtualDeviceConfigSpec(); 
vdConfigSpec.setDevice(myDisk); 
vdConfigSpec.setOperation(VirtualDeviceConfigSpecOperation.edit); 
VirtualMachineConfigSpec vmConfigSpec = new VirtualMachineConfigSpec(); 
vmConfigSpec.setDeviceChange(new VirtualDeviceConfigSpec[]{vdConfigSpec}); 
Task task = vm.reconfigVM_Task(vmConfigSpec); 
+0

請你可以分享你的代碼的一部分。 –

+0

我不會發布我的代碼,因爲它太長,而且是C#。這是我可以在Java中實現的最好的代碼(使用Java已經有好幾年了)。獲取要更改的磁盤後,這是您需要的代碼。我將磁盤標記爲「myDisk」。我在上面的答案中添加了代碼。我希望它有幫助。如果您有任何問題,請告訴我。 –

+0

我試過一樣,但說操作編輯是不允許的。我試圖使用DiskManager API,它的工作原理。你使用什麼版本的vsphere? –