Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
linux_faq:kvm_usb_hotplug [2017/09/14 11:25] – [Подключение и отключение USB устройств к виртуальной машине KVM] adminlinux_faq:kvm_usb_hotplug [2022/03/12 06:41] (current) – [Подключение всего USB-хоста к виртуалке] admin
Line 1: Line 1:
 +====== Подключение и отключение USB устройств к виртуальной машине KVM ======
 +Подключаем устрйоство к хосту с KVM и смотрим как оно определилось:
 +  $ lsusb
 +  Bus 004 Device 024: ID 11a0:eb20 Chipcon AS
 +Тут нас интересуют номер шины и номер устройства: **Bus 004 Device 024:**
 +На основании этих сведений создаем файлик *.xml:
 +<code>
 +<hostdev mode='subsystem' type='usb' managed='yes'>
 +  <source>
 +    <address bus='4' device='24'/>
 +  </source>
 +</hostdev>
 +</code>
 +Также вместо положения на шине можно указывать **VendorID** и **DeviceID**:
 +<code><hostdev mode='subsystem' type='usb'>
 +  <source>
 +    <vendor id='0x03f0'/>
 +    <product id='0x4217'/>
 +  </source>
 +</hostdev></code>
  
 +Нули из номера шины и номера девайса нужно убрать.
 +
 +Теперь запускаем машину и узнаем ее мя:
 +  $ virsh list
 +   Id    Name                           State
 +  ----------------------------------------------------
 +       Windows_7_x64_Ent_RUS          running
 +Теперь подключаем устройство:
 +  virsh attach-device <VM name> <file>
 +То есть в моем случае:
 +  $ virsh attach-device Windows_7_x64_Ent_RUS ./progr.xml 
 +  Device attached successfully
 +
 +Ну и самое интересное - оформление правил **udev** для автоматического подключения устройств.
 +<code>
 +/etc/udev/rules.d/90-libvirt-usb.rules
 +
 +ACTION=="add", \
 +    SUBSYSTEM=="usb", \
 +    ENV{ID_VENDOR_ID}=="03f0", \
 +    ENV{ID_MODEL_ID}=="4217", \
 +    RUN+="/usr/bin/virsh attach-device GUESTNAME /path/to/hostdev-03f0:4217.xml"
 +ACTION=="remove", \
 +    SUBSYSTEM=="usb", \
 +    ENV{ID_VENDOR_ID}=="03f0", \
 +    ENV{ID_MODEL_ID}=="4217", \
 +    RUN+="/usr/bin/virsh detach-device GUESTNAME /path/to/hostdev-03f0:4217.xml"
 +
 +</code>
 +
 +И перечитать правила:
 +  sudo udevadm control --reload-rules && sudo udevadm trigger
 +
 +====== Ошибки ======
 +Если при попытке проброса устройства команда выполняется без ошибок с рузультатом:
 +  Device attached successfully
 +в гостевой машине ничего не появляется, при этом в журнале хоста KVM есть ошибки типа:
 +  apparmor="DENIED" operation="open"
 +Значит на хосте KVM в файлике **/etc/apparmor.d/abstractions/libvirt-qemu** нужно сделать некторые изменения: \\
 +Строку **/dev/bus/usb/ r,** привести к виду: **/dev/bus/usb/ rw,** \\
 +И еще добавить пару строк:
 +  /dev/bus/usb/*/[0-9]* rw,
 +  /run/udev/** rw,  
 +То есть выполнить:
 +  cp /etc/apparmor.d/abstractions/libvirt-qemu ~/libvirt-qemu.backup
 +  sudo sed -i 's/\/dev\/bus\/usb\/\ r,/\/dev\/bus\/usb\/\ rw,/' /etc/apparmor.d/abstractions/libvirt-qemu
 +  sudo sed -i '\/dev\/bus\/usb\/\ rw,/ a\/dev\/bus\/usb\/\*\/\[0-9\]\* rw,' /etc/apparmor.d/abstractions/libvirt-qemu
 +  sudo sed -i '\/dev\/bus\/usb\/\ rw,/ a\/run\/udev\/\*\* rw,' /etc/apparmor.d/abstractions/libvirt-qemu
 +И перезапустить сервисы (или перезагрузить хост):
 +  sudo service apparmor restart
 +  sudo service libvirtd restart
 +  
 +====== Подключение всего USB-хоста к виртуалке ======
 +Определяем на каком хосте работает USB-устройство:
 +  lsusb
 +  ...
 +  Bus 001 Device 002: ID 0e8d:20ff MediaTek Inc. Android
 +
 +Определяем номер устройства на шине PCI:
 +<code>
 +$ readlink /sys/bus/usb/devices/usb*
 +../../../devices/pci0000:00/0000:00:08.1/0000:03:00.3/usb1
 +../../../devices/pci0000:00/0000:00:08.1/0000:03:00.3/usb2
 +../../../devices/pci0000:00/0000:00:08.1/0000:03:00.4/usb3
 +../../../devices/pci0000:00/0000:00:08.1/0000:03:00.4/usb4
 +</code>
 +Кажется в моем случае это Bus 001 -> /devices/pci0000:00/0000:00:08.1/0000:03:00.3/usb1
 +
 +Смотрим какой модуль ядра рулит этим девайсом:
 +<code>
 +$ls /sys/bus/pci/drivers/*_hcd/
 +...
 +
 +/sys/bus/pci/drivers/xhci_hcd/:
 +0000:03:00.3  0000:03:00.4  bind  module  new_id  remove_id  uevent  unbind
 +</code>
 +Отключаем и подключаем к **vfio-pci** https://01.org/linuxgraphics/gfx-docs/drm/driver-api/vfio.html
 +
 +<code>
 +sudo su
 +modprobe vfio-pci
 +lspci -n -s 0000:03:00.3
 +...
 +03:00.3 0c03: 1022:1639
 +...
 +echo 0000:03:00.3 > /sys/bus/pci/devices/0000:03:00.3/driver/unbind
 +
 +lspci -n -s 0000:03:00.3
 +...
 +03:00.3 0c03: 1022:1639
 +...
 +
 +echo 1022 1639 > /sys/bus/pci/drivers/vfio-pci/new_id
 +echo -n "0000:03:00.3" > /sys/bus/pci/drivers/vfio-pci/bind
 +</code>
 +
 +  ls -l /sys/bus/pci/devices/0000:03:00.3/iommu_group/devices
  • linux_faq/kvm_usb_hotplug.txt
  • Last modified: 2022/03/12 06:41
  • by admin