提交 834aebcc 编写于 作者: D Doug Goldstein

VMX: Add support for 'auto detect' fileNames

VMWare Fusion 5 can set the CD-ROM's device name to be 'auto detect' when
using the physical drive via 'cdrom-raw' device type. VMWare will then
connect to first available host CD-ROM to the virtual machine upon start
up according to VMWare documentation. If no device is available, it
appears that the device will remain disconnected.

To better model this a CD-ROM that is marked as "auto detect" when in
the off state would be modeled as the following with this patch:
  <disk type='block' device='lun'>
    <source startupPolicy='optional'/>
    <target dev='hda' bus='ide'/>
    <address type='drive' controller='0' bus='0' target='0' unit='0'/>
  </disk>

Once the domain transitions to the powered on state, libvirt can
populate the remaining source data with what is connected, if anything.
However future power cycles, the domain may not always start with that
device attached.
上级 4b5652d0
......@@ -2221,14 +2221,26 @@ virVMXParseDisk(virVMXContext *ctx, virDomainXMLOptionPtr xmlopt, virConfPtr con
goto ignore;
} else if (STRCASEEQ(deviceType, "atapi-cdrom")) {
(*def)->type = VIR_DOMAIN_DISK_TYPE_BLOCK;
(*def)->src = fileName;
fileName = NULL;
if (STRCASEEQ(fileName, "auto detect")) {
(*def)->src = NULL;
(*def)->startupPolicy = VIR_DOMAIN_STARTUP_POLICY_OPTIONAL;
} else {
(*def)->src = fileName;
fileName = NULL;
}
} else if (STRCASEEQ(deviceType, "cdrom-raw")) {
/* Raw access CD-ROMs actually are device='lun' */
(*def)->device = VIR_DOMAIN_DISK_DEVICE_LUN;
(*def)->type = VIR_DOMAIN_DISK_TYPE_BLOCK;
(*def)->src = fileName;
fileName = NULL;
if (STRCASEEQ(fileName, "auto detect")) {
(*def)->src = NULL;
(*def)->startupPolicy = VIR_DOMAIN_STARTUP_POLICY_OPTIONAL;
} else {
(*def)->src = fileName;
fileName = NULL;
}
} else {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Invalid or not yet handled value '%s' "
......@@ -3473,7 +3485,13 @@ virVMXFormatDisk(virVMXContext *ctx, virDomainDiskDefPtr def,
VIR_FREE(fileName);
} else if (def->type == VIR_DOMAIN_DISK_TYPE_BLOCK) {
if (def->src != NULL) {
if (!def->src &&
def->startupPolicy == VIR_DOMAIN_STARTUP_POLICY_OPTIONAL) {
virBufferAsprintf(buffer, "%s%d:%d.autodetect = \"true\"\n",
busType, controllerOrBus, unit);
virBufferAsprintf(buffer, "%s%d:%d.fileName = \"auto detect\"\n",
busType, controllerOrBus, unit);
} else {
virBufferAsprintf(buffer, "%s%d:%d.fileName = \"%s\"\n",
busType, controllerOrBus, unit, def->src);
}
......
config.version = "8"
virtualHW.version = "4"
ide0:0.present = "true"
ide0:0.deviceType = "cdrom-raw"
ide0:0.fileName = "auto detect"
<domain type='vmware'>
<uuid>00000000-0000-0000-0000-000000000000</uuid>
<memory unit='KiB'>32768</memory>
<currentMemory unit='KiB'>32768</currentMemory>
<vcpu placement='static'>1</vcpu>
<os>
<type arch='i686'>hvm</type>
</os>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<disk type='block' device='lun'>
<source startupPolicy='optional'/>
<target dev='hda' bus='ide'/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
<controller type='ide' index='0'/>
<video>
<model type='vmvga' vram='4096'/>
</video>
</devices>
</domain>
config.version = "8"
virtualHW.version = "4"
scsi0.present = "true"
scsi0:0.present = "true"
scsi0:0.deviceType = "cdrom-raw"
scsi0:0.fileName = "auto detect"
<domain type='vmware'>
<uuid>00000000-0000-0000-0000-000000000000</uuid>
<memory unit='KiB'>32768</memory>
<currentMemory unit='KiB'>32768</currentMemory>
<vcpu placement='static'>1</vcpu>
<os>
<type arch='i686'>hvm</type>
</os>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<disk type='block' device='lun'>
<source startupPolicy='optional'/>
<target dev='sda' bus='scsi'/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
<controller type='scsi' index='0'/>
<video>
<model type='vmvga' vram='4096'/>
</video>
</devices>
</domain>
......@@ -238,9 +238,11 @@ mymain(void)
DO_TEST("cdrom-scsi-file", "cdrom-scsi-file");
DO_TEST("cdrom-scsi-device", "cdrom-scsi-device");
DO_TEST("cdrom-scsi-raw-device", "cdrom-scsi-raw-device");
DO_TEST("cdrom-scsi-raw-auto-detect", "cdrom-scsi-raw-auto-detect");
DO_TEST("cdrom-ide-file", "cdrom-ide-file");
DO_TEST("cdrom-ide-device", "cdrom-ide-device");
DO_TEST("cdrom-ide-raw-device", "cdrom-ide-raw-device");
DO_TEST("cdrom-ide-raw-auto-detect", "cdrom-ide-raw-auto-detect");
DO_TEST("floppy-file", "floppy-file");
DO_TEST("floppy-device", "floppy-device");
......
.encoding = "UTF-8"
config.version = "8"
virtualHW.version = "4"
guestOS = "other"
uuid.bios = "56 4d 9b ef ac d9 b4 e0-c8 f0 ae a8 b9 10 35 15"
displayName = "cdrom-ide-device"
memsize = "4"
numvcpus = "1"
ide0:0.present = "true"
ide0:0.deviceType = "cdrom-raw"
ide0:0.autodetect = "true"
ide0:0.fileName = "auto detect"
floppy0.present = "false"
floppy1.present = "false"
<domain type='vmware'>
<name>cdrom-ide-device</name>
<uuid>564d9bef-acd9-b4e0-c8f0-aea8b9103515</uuid>
<memory unit='KiB'>4096</memory>
<os>
<type>hvm</type>
</os>
<devices>
<disk type='block' device='lun'>
<source startupPolicy='optional'/>
<target dev='hda' bus='ide'/>
</disk>
</devices>
</domain>
.encoding = "UTF-8"
config.version = "8"
virtualHW.version = "4"
guestOS = "other"
uuid.bios = "56 4d 9b ef ac d9 b4 e0-c8 f0 ae a8 b9 10 35 15"
displayName = "cdrom-scsi-device"
memsize = "4"
numvcpus = "1"
scsi0.present = "true"
scsi0:0.present = "true"
scsi0:0.deviceType = "cdrom-raw"
scsi0:0.autodetect = "true"
scsi0:0.fileName = "auto detect"
floppy0.present = "false"
floppy1.present = "false"
<domain type='vmware'>
<name>cdrom-scsi-device</name>
<uuid>564d9bef-acd9-b4e0-c8f0-aea8b9103515</uuid>
<memory unit='KiB'>4096</memory>
<os>
<type>hvm</type>
</os>
<devices>
<disk type='block' device='lun'>
<source startupPolicy='optional'/>
<target dev='sda' bus='scsi'/>
</disk>
</devices>
</domain>
......@@ -254,9 +254,11 @@ mymain(void)
DO_TEST("cdrom-scsi-file", "cdrom-scsi-file", 4);
DO_TEST("cdrom-scsi-device", "cdrom-scsi-device", 4);
DO_TEST("cdrom-scsi-raw-device", "cdrom-scsi-raw-device", 4);
DO_TEST("cdrom-scsi-raw-auto-detect", "cdrom-scsi-raw-auto-detect", 4);
DO_TEST("cdrom-ide-file", "cdrom-ide-file", 4);
DO_TEST("cdrom-ide-device", "cdrom-ide-device", 4);
DO_TEST("cdrom-ide-raw-device", "cdrom-ide-raw-device", 4);
DO_TEST("cdrom-ide-raw-auto-detect", "cdrom-ide-raw-auto-detect", 4);
DO_TEST("floppy-file", "floppy-file", 4);
DO_TEST("floppy-device", "floppy-device", 4);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册