[libvirt] i want to update the disk driver from ide to virtio, but fail , why ?

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/htm... -------------------------- thanks ! thosmas.kuang

On 12/20/19 6:23 AM, thomas 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'
Hi Thomas. update-device can not be used to change from IDE to virtio for an existing device. update-device can only be used for changing certain parameters of an existing device on the live VM, but changing IDE to virtio is effectively an entirely different device. The closest you can possibly get is trying to detach-device the existing disk, then attach-device the virtio disk, but IDE doesn't support hotplug so the detach step won't work - Cole

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/htm... -------------------------- thanks ! thosmas.kuang
participants (2)
-
Cole Robinson
-
thomas