At 2019-12-20 19:23:59, "thomas" <s_kuang@163.com> wrote:

hi, ALL:
my question description as follow:


virsh dumpxml root-vsys_v2  > v2.xml ,  
 in the v2.xml has the following information:
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/home/root-vsys_v2.qcow2'/>
      <backingStore/>
      <target dev='hda' bus='ide'/>  // i want change the 'ide' to 'virtio', but fail
      <alias name='ide0-0-0'/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>

so i create a new xml name v2-new.xml ,it content is:
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/home/root-vsys_v2.qcow2'/>
      <target dev='vda' bus='virtio'/>
    </disk>

then run:
virsh update-device root-vsys_v2 /root/v2-new.xml  --live
the result is:
[root@NSG ~]# virsh update-device root-vsys_v2 /root/v2-new.xml  --live
error: Failed to update device from /root/v2-new.xml
error: internal error: No device with bus 'virtio' and target 'vda'

i read the source code for libvirt ,the log outprint at funcion:
static int
qemuDomainChangeDiskLive(virDomainObjPtr vm,
                         virDomainDeviceDefPtr dev,
                         virQEMUDriverPtr driver,
                         bool force)
{
    virDomainDiskDefPtr disk = dev->data.disk;
    virDomainDiskDefPtr orig_disk = NULL;
    virDomainDeviceDef oldDev = { .type = dev->type };
    int ret = -1;

    if (!(orig_disk = virDomainDiskFindByBusAndDst(vm->def,
                                                   disk->bus, disk->dst))) {
        virReportError(VIR_ERR_INTERNAL_ERROR,
                       _("No device with bus '%s' and target '%s'"),
                       virDomainDiskBusTypeToString(disk->bus),
                       disk->dst); //the failure log is here, the vm->def has disk item :dev = hda, bus=ide ,and disk->bus = virtio disk->dst=vda,
        goto cleanup;
    }
//the disk->bus and disk->dst can't in the vm->def ,so the api virDomainDiskFindByBusAndDst failed
    oldDev.data.disk = orig_disk;
    if (virDomainDefCompatibleDevice(vm->def, dev, &oldDev,
                                     VIR_DOMAIN_DEVICE_ACTION_UPDATE,
                                     true) < 0)
        goto cleanup;

    if (!qemuDomainDiskChangeSupported(disk, orig_disk))
        goto cleanup;

    if (!virStorageSourceIsSameLocation(disk->src, orig_disk->src)) {
        /* Disk source can be changed only for removable devices */
        if (disk->device != VIR_DOMAIN_DISK_DEVICE_CDROM &&
            disk->device != VIR_DOMAIN_DISK_DEVICE_FLOPPY) {
            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
                           _("disk source can be changed only in removable "
                             "drives"));
            goto cleanup;
        }

        if (qemuDomainAttachDeviceDiskLive(driver, vm, dev, force) < 0)
            goto cleanup;
    }

    orig_disk->startupPolicy = dev->data.disk->startupPolicy;
    orig_disk->snapshot = dev->data.disk->snapshot;

    ret = 0;
 cleanup:
    return ret;
}

what  reason lead the faiure ? is my v2-new.xml write error ? how to write the xml for virsh update-device ?



i refer the link
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/virtualization_host_configuration_and_guest_installation_guide/form-virtualization_host_configuration_and_guest_installation_guide-para_virtualized_drivers-using_kvm_para_virtualized_drivers_for_existing_devices

--------------------------
thanks !
thosmas.kuang