问题背景介绍:
虚拟机操作系统centos
挂载数据盘vdb(将数据盘进行格式化,并挂载到文件中)
执行命令数据copy命令:
time dd if=/dev/zero of=vdb/test bs=1M count=100000
通过命令卸载云硬盘发现卸载不成功,命令如下:
virsh detach-disk domain vdb --live
virsh qemu-monitor-command domain --hmp info block
代码分析
virDomainDetachDeviceFlags
|
|--conn->driver->domainDetachDeviceFlags
|
|--qemuDomainDetachDeviceFlags
|
|--qemuDomainObjFromDomain{获取domain}
|
|--virDomainDetachDeviceFlagsEnsureACL
|
|--qemuDomainObjBeginJob{QEMU_JOB_MODIFY}
|
|--virDomainObjUpdateModificationImpact{检查flags是否满足要求}
|
|--qemuDomainDetachDeviceLiveAndConfig(driver, vm, xml, flags){开启真正的卸载过程}
|
|--virDomainDeviceDefParse
|
|--qemuDomainDetachDeviceLive
| |
| |--qemuDomainDetachPrepDisk
| |
| |--qemuDomainDeleteDevice{qemu层删除设备}
| | |
| | |--qemuMonitorDelDevice{"execute":"device_del","arguments":{"id":"virtio-disk1"}}
| |
| |--qemuDomainWaitForDeviceRemoval
| | |
| | |-virDomainObjWaitUntils
| |
| |--qemuDomainRemoveDevice{libvirt层删除设备}
| |
| |--qemuDomainRemoveDiskDevice
| |
| |--virDomainDiskRemove
|
|
|--qemuDomainUpdateDeviceList
|
|--qemuDomainSaveStatus
|
|--virDomainDefSave
qemu层热卸载云硬盘的代码:
hmp_device_del
|
|--qmp_device_del
|
|--find_device_state{返回一个DeviceState对象}
|
|--qdev_unplug
|
|--qbus_is_hotpluggable{判断是否支持热插拔}
|
|--qdev_get_hotplug_handler
|
|--hotplug_handler_unplug_request{async}
| |
| |--hdc->unplug_request(plug_handler, plugged_dev, errp)
|
|--hotplug_handler_unplug{sync}
|
|--hdc->unplug(plug_handler, plugged_dev, errp)
当前libvirt只是通过qemu-monitor-command向qemu发送"device_del"命令,实际上若存在I/O读写的情况,qemu层并不会立即将云硬盘卸载掉,会持续一段时间才能卸载。
但是为什么会持续一段时间才能卸载,这个问题现在还不能确定