У меня на сервере 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.