12.4 添加设备至虚拟机

使用 VirtualMachineConfigSpec.deviceChange 属性(一个 VirtualDeviceSpec)创建虚拟机时,你可以添加设备至虚拟机,通过使用一个支持对象(backing object),你可以指定虚拟设备应该映射到的主机设备,一个 backing 对象表示与虚拟设备相关联的主机设备。

■   Backing option objects – 可以通过提取相关的 backing 选项对象来查找主机支持哪些设备。

■   Backing information object – backing 信息对象允许你为虚拟设备配置提供数据,访问一个 VirtualDeviceBackinInfo 对象如下所示:

VirtualMachineConfigSpec.deviceChange[].device.backing

要添加一个设备至虚拟机,必须首先查明在相应的 ESX/ESXi 主机上哪些设备是其所支持的,然后指定一个 VirtualDevice 对象,执行下面的这些任务添加设备至虚拟机:

1   通过调用 QueryConfigOption 方法查明你的 ESXi 系统支持哪些设备,通过 VirtualMachine.environmentBrowser 属性查明哪些设备你可以访问。该方法返回一个指明 ESXi/ESXi 支持什么设备的VirtualMachineConfigOption 数据对象。例如,VirtualMachineConfigOption.hardwareOptions 包括有关所支持的 CPU 和内存及一组 VirtualDeviceOption 数据对象的信息。


注意:不能使用 QueryConfigOption 方法来创建另外一个默认设备的实例,如果试着添加一个默认设备,如一个 IDE 控制器,服务器会忽略该操作。


2   为设备指定 backing 信息,不同对象的对象定义的实际过程不同。如,对于一个 CD-ROM 透传设备,使用 VirtualCdromPassthroughBackingInfo 设备,VirtualDevice.backing 属性是一个由该设备扩展的 VirtualDeviceBackingInfo 对象。

下面的代码片段添加了一个 CD-ROM 透传设备:

VirtualCdromPassthroughBackingInfo vcpbi = new VirtualCdromPassthroughBackingInfo();
// Does the virtual device have exclusive access to the CD-ROM device?
vcpbi.setExclusive(false);
// Specifies the device name.
vcpbi.setDeviceName('cdrom0');

3   为设备指定连接信息

      VirtualDevice.connectable 属性是一个 VirtualDeviceConnectInfo 数据对象,当虚拟机在运行时,该对象提供有关限制删除设备的信息。如果设备不可移动,则该属性为 null。

VirtualDeviceConnectInfo vdci = new VirtualDeviceConnectInfo();
// Allow the guest to control whether the virtual device is connected?
vdci.setAllowGuestControl(false);
// Is the device currently connected?
vdci.setConnected(true);
// Connect the device when the virtual machine starts?
vdci.setStartConnected(true);

4   定义 controller key,虚拟设备 key,及单元号

      使用整数属性定义这些项: controllerKey、key 和 unitNumber。可在 API 参考文档中查看 VirtualDevice 数据对象。

5   指定设备信息

      deviceInfo 属性是一个 Description 数据对象,该对象有一个 name 属性和一个 summary 属性,可以为每个属性提供一个字符值以描述设备。

Description vddesc = new Description();
vddesc.setLabel('CD-ROM Device cdrom0');
vddesc.setSummary('The CD-ROM device for this virtual machine.');

6   将虚拟设备指定为 VirtualDeviceConfigSpec 的 device 属性。

7   将 VirtualDeviceConfigSpec 作为 deviceChange 属性指定到 VirtualMachineConfigSpec 对象,该对象是传入 Folder.CreateVM_Task 或 VirtualMachine.ReconfigVM_Task 方法的参数。

      下面是一个 CD-ROM 透传设备的完整代码片段:

VirtualDevice vd = new VirtualDevice();
vd.setBacking(vcpbi);
vd.setConnectable(vdci);
vd.setControllerKey(257);
vd.setDeviceInfo(vddesc);
vd.setKey(2);
vd.setUnitNumber(25);