Назад | Перейти на главную страницу

Передача USB-концентратора от хоста KVM гостю с помощью libvirt

У меня на сервере Linux есть следующие USB-устройства:

# lsusb -t
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ehci_hcd/2p, 480M
    |__ Port 1: Dev 2, If 0, Class=hub, Driver=hub/6p, 480M
        |__ Port 2: Dev 3, If 0, Class=HID, Driver=usbfs, 1.5M
        |__ Port 3: Dev 4, If 0, Class=hub, Driver=hub/4p, 480M
            |__ Port 1: Dev 8, If 0, Class=print, Driver=usbfs, 12M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci_hcd/2p, 480M
    |__ Port 1: Dev 2, If 0, Class=hub, Driver=hub/6p, 480M

Я хотел бы передать весь USB-концентратор (Dev 4) гостю Windows XP. В этом случае устройство, подключенное к концентратору и снятое с него, должно автоматически обрабатываться гостем (верно?).

Я пробовал следующий код с virsh attach-device:

<hostdev mode='subsystem' type='usb' managed='yes'>
 <source>
  <address type='usb' bus='0x002' port='1.3' />
 </source>
</hostdev>

но это не сработало:

error: Failed to attach device from attach_hub.xml
error: internal error usb address needs device id

Что я делаю не так?

Я знаю, что этой теме несколько лет, но я несколько дней работал над этой конкретной темой и считаю, что в вопросе можно использовать некоторые из моих ответов.

Первый, согласно Документация по формату домена libvirtв следующем фрагменте показан правильный <hostdev> синтаксис:

...
<devices>
  <hostdev mode='subsystem' type='usb'>
    <source startupPolicy='optional'>
      <vendor id='0x1234'/>
      <product id='0xbeef'/>
    </source>
    <boot order='2'/>
  </hostdev>
</devices>
...

Причина вашей ошибки связана с отсутствием <vendor> и <product> теги для вашего USB <source>

Второй, Если вы используете Ubuntu 16.04 или выше (например, я), тогда у вас будут успешные сообщения USB Passthrough с указанным выше форматом устройства XML при использовании virsh attach-device горячее подключение, но устройство никогда не будет подключаться к виртуальной машине. Это вина AppArmor. Я нашел комментарий в другой поток ссылка на эта конфигурация AppArmor Libvirt для решения проблем со сквозным подключением USB, которые, как я могу подтвердить, помогли решить мои проблемы.

Соответствующий фрагмент AppArmor:

Чтобы программа могла правильно обращаться к USB-устройству, необходимо изменить абстракцию apparmor для qemu. редактировать /etc/apparmor.d/abstractions/libvirt-qemu добавить строку:

# this lets qemu read all USB device information and might be considered a security risk
/run/udev/data/* r,

Третий"USB-концентраторы", упомянутые в других ответах, не являются концентраторами в области хост-машины, а скорее в области виртуальной машины. Из того же документа Libvirt:

Элемент концентратора имеет необязательный подэлемент с type = 'usb', который может привязать устройство к конкретному контроллеру [...]

Многие устройства имеют необязательный подэлемент для описания места размещения устройства на виртуальной шине, представленной гостю.

Надеюсь, это кому-то поможет :)

xml для концентратора: https://libvirt.org/formatdomain.html#elementsHub

Пример:

  <hub type='usb'>
     <address type='usb' bus='0' port='1'/>
  </hub>

https://www.redhat.com/archives/libvir-list/2011-August/msg00816.html

Если кто-то все еще ищет это, воспользуйтесь формой:

<address type='usb' bus='0' device='1'/>

Запись устройства соответствует записи "Dev", выводимой командой lsusb -t.