项目需要,将host os的usb设备透传给guest os,同时实现usb设备的过滤功能。
首先,将这个功能分解为几个小功能:
- usb设备拔插事件的侦测。
用pyudev侦测linux系统中的设备插入,拔出事件。 - usb设备类型的判断。参考一
用pyusb获取usb设备interface类型信息。 - libvirt usb设备透传的实现。
这里用到了libvirt的python api。顺便说一下我怎么学习python的?
我怎么学习Python
Python学起来真的是太舒服了,你可以通过写代码来学习。怎么说,就比如说libvirt的python api,怎么学习,上网查api?不用!几个简单的build-in function:type(), dir(), help()。这就够了。
#!/usr/bin/evn python
#-*- coding: utf-8 -*-
import libvirt
help(libvirt)
#基本上重要的东西都在下面了
#通过libvirt.open(),获得virConnect
#通过virtConnect.lookupByName(),获得virDomain
'''
CLASSES
__builtin__.object
virConnect
virDomain
virDomainSnapshot
virInterface
virNWFilter
virNetwork
virNodeDevice
virSecret
virStoragePool
virStorageVol
virStream
exceptions.Exception(exceptions.BaseException)
libvirtError
'''
#查看某个类的函数列表用dir()
整个思路就是通过调用virDomain.attachDevice(),virDomain.detachDevice()实现设备在Guest的热插拔。现在问题是透传给Guest前需要先将设备从Host拔出,拔出的方法就是调用virNodeDevice.dettach()方法。如何通过vid,pid获取virNodeDevice呢?
最新消息,调用:
virsh attach-device login usb-mouse.xml
失败,信息如下:
error: Failed to attach device from usb-mouse.xml
error: internal error: unable to execute QEMU command 'device_add': failed to open host usb device 1:5
什么情况?
问题终于弄清楚了,只能说HCI(host controller interface)水很深,还是有必要了解清楚Qemu的usb device passthrough的基本架构的!