項目需要埠忘,將host os的usb設(shè)備透傳給guest os啤月,同時實現(xiàn)usb設(shè)備的過濾功能财异。
首先,將這個功能分解為幾個小功能:
- usb設(shè)備拔插事件的偵測癌蚁。
用pyudev偵測linux系統(tǒng)中的設(shè)備插入幻梯,拔出事件。 - usb設(shè)備類型的判斷努释。參考一
用pyusb獲取usb設(shè)備interface類型信息碘梢。 - libvirt usb設(shè)備透傳的實現(xiàn)。
這里用到了libvirt的python api伐蒂。順便說一下我怎么學(xué)習(xí)python的煞躬?
我怎么學(xué)習(xí)Python
Python學(xué)起來真的是太舒服了,你可以通過寫代碼來學(xué)習(xí)逸邦。怎么說恩沛,就比如說libvirt的python api,怎么學(xué)習(xí)缕减,上網(wǎng)查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
'''
#查看某個類的函數(shù)列表用dir()
整個思路就是通過調(diào)用virDomain.attachDevice()呈宇,virDomain.detachDevice()實現(xiàn)設(shè)備在Guest的熱插拔『门溃現(xiàn)在問題是透傳給Guest前需要先將設(shè)備從Host拔出,拔出的方法就是調(diào)用virNodeDevice.dettach()方法甥啄。如何通過vid存炮,pid獲取virNodeDevice呢?
最新消息蜈漓,調(diào)用:
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的基本架構(gòu)的!