Ubuntu

將 USB 加密狗連接到 KVM 虛擬機

  • April 25, 2016

我正在努力將主機正確檢測到的 USB 設備連接到 kvm vm。

我有一個新安裝的 Ubuntu Server 14.10 作為 KVM/QEMU 主機。我使用以下命令設置了一個 Ubuntu vm:

virt-install --connect qemu:///system \
           -n test01 \
           -r 1024 \
           --vcpus=2 \
           --disk path=/vmstorage/01/test01.img,size=5 \
           --vnc \
           --noautoconsole \
           --os-variant=ubuntuutopic \
           --hvm \
           --cdrom /path/to/ubuntu-14.10-server-i386.iso

安裝成功後avirsh dumpxml test01返回

<domain type='kvm' id='16'>
 <name>test01</name>
 <uuid>f58ca825-c999-4168-9f5a-616057d9955d</uuid>
 <memory unit='KiB'>1048576</memory>
 <currentMemory unit='KiB'>1048576</currentMemory>
 <vcpu placement='static'>2</vcpu>
 <resource>
   <partition>/machine</partition>
 </resource>
 <os>
   <type arch='x86_64' machine='pc-i440fx-utopic'>hvm</type>
   <boot dev='hd'/>
 </os>
 <features>
   <acpi/>
   <apic/>
   <pae/>
 </features>
 <cpu mode='custom' match='exact'>
   <model fallback='allow'>SandyBridge</model>
 </cpu>
 <clock offset='utc'>
   <timer name='rtc' tickpolicy='catchup'/>
   <timer name='pit' tickpolicy='delay'/>
   <timer name='hpet' present='no'/>
 </clock>
 <on_poweroff>destroy</on_poweroff>
 <on_reboot>restart</on_reboot>
 <on_crash>restart</on_crash>
 <devices>
   <emulator>/usr/bin/kvm-spice</emulator>
   <disk type='file' device='disk'>
     <driver name='qemu' type='raw'/>
     <source file='/vmstorage/01/test01.img'/>
     <backingStore/>
     <target dev='vda' bus='virtio'/>
     <alias name='virtio-disk0'/>
     <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
   </disk>
   <disk type='block' device='cdrom'>
     <driver name='qemu' type='raw'/>
     <backingStore/>
     <target dev='hda' bus='ide'/>
     <readonly/>
     <alias name='ide0-0-0'/>
     <address type='drive' controller='0' bus='0' target='0' unit='0'/>
   </disk>
   <controller type='usb' index='0' model='ich9-ehci1'>
     <alias name='usb0'/>
     <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/>
   </controller>
   <controller type='usb' index='0' model='ich9-uhci1'>
     <alias name='usb0'/>
     <master startport='0'/>
     <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>
   </controller>
   <controller type='usb' index='0' model='ich9-uhci2'>
     <alias name='usb0'/>
     <master startport='2'/>
     <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>
   </controller>
   <controller type='usb' index='0' model='ich9-uhci3'>
     <alias name='usb0'/>
     <master startport='4'/>
     <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>
   </controller>
   <controller type='pci' index='0' model='pci-root'>
     <alias name='pci.0'/>
   </controller>
   <controller type='ide' index='0'>
     <alias name='ide0'/>
     <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
   </controller>
   <interface type='bridge'>
     <mac address='52:54:00:11:b2:c1'/>
     <source bridge='br0'/>
     <target dev='vnet0'/>
     <model type='virtio'/>
     <alias name='net0'/>
     <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
   </interface>
   <serial type='pty'>
     <source path='/dev/pts/0'/>
     <target port='0'/>
     <alias name='serial0'/>
   </serial>
   <console type='pty' tty='/dev/pts/0'>
     <source path='/dev/pts/0'/>
     <target type='serial' port='0'/>
     <alias name='serial0'/>
   </console>
   <input type='mouse' bus='ps2'/>
   <input type='keyboard' bus='ps2'/>
   <graphics type='vnc' port='5900' autoport='yes' listen='0.0.0.0'>
     <listen type='address' address='0.0.0.0'/>
   </graphics>
   <video>
     <model type='cirrus' vram='9216' heads='1'/>
     <alias name='video0'/>
     <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
   </video>
   <memballoon model='virtio'>
     <alias name='balloon0'/>
     <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
   </memballoon>
 </devices>
 <seclabel type='dynamic' model='apparmor' relabel='yes'>
   <label>libvirt-f58ca825-c999-4168-9f5a-616057d9955d</label>
   <imagelabel>libvirt-f58ca825-c999-4168-9f5a-616057d9955d</imagelabel>
 </seclabel>
</domain>

我現在想連接 U 盤。經過一番Google搜尋後,我發現 了一些 基本上都建議採用以下方法的來源:

  1. 將棍子連接到主機
  2. 獲取供應商和產品 ID
root@host01:~# lsusb
Bus 002 Device 004: ID 13fe:5100 Kingston Technology Company Inc. Flash Drive
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 004: ID 0624:0249 Avocent Corp.
Bus 001 Device 003: ID 0624:0248 Avocent Corp.
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
  1. 通過將新的配置片段添加到 vmvirsh edit test01
<devices>
 <!- ... ->
 <hostdev mode='subsystem' type='usb' managed='yes'>
   <source>
     <vendor id='0x13fe'/>
     <product id='0x5100'/>
   </source>
 </hostdev>
</devices/>
  1. 重啟虛擬機

之後,虛擬機應該通過 看到棒lsusb,但沒有任何變化。如果我嘗試將設備連接到第二個虛擬機,但virsh start <othervm>失敗error: Requested operation is not valid: USB device 002:003 is in use by driver QEMU, domain test01 我仍然可以安裝並訪問主機上的棒。我嘗試了不同的棒和不同的 vm 作業系統(ubuntu 和 windows),但沒有成功。

一些說明建議關閉 apparmor,但/etc/init.d/apparmor stop並沒有改變任何東西。

這讓我發瘋,因為我沒有收到任何錯誤或日誌消息,而且我不知道如何找出問題所在。關於如何將 USB 連接到虛擬機的任何想法,或者至少,如何進一步分析它?

這可能是訪問權限的問題。不允許您的 QEMU 守護程序訪問 USB 設備。嘗試:

chown libvirt-qemu /dev/bus/usb/ -R

或您的 KVM 以哪個使用者身份執行。這應該可以解決問題。

要向執行管理程序的使用者授予對原始 USB 設備節點的永久訪問權限,您需要創建一個 udev 規則;基於 chown 的答案僅在下次重新啟動之前有效。

/lib/udev/rules.d中,創建一個文件,如51-usb_passthrough.rules

SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{busnum}=="2" ATTRS{devpath}=="1" GROUP="kvm"

在這裡,我使用物理匯流排和埠號來定位設備(因為無論插入什麼設備,我都更喜歡通過物理埠,而不是每次連接新設備時都重新配置我的虛擬機),但當然你可以使用任何屬性你要; 該GROUP參數確定將擁有設備節點的組,這應該是執行虛擬機的任何使用者。

執行udevadm control --reload-rules以使新規則立即生效(您仍然需要斷開/重新連接 USB 設備)或簡單地重新啟動主機。

引用自:https://serverfault.com/questions/666210