Из QEMU в libvirt(virsh) - добавить USB-порт

Я хотел бы, чтобы следующая строка была переведена из опций qemu в libvirt xml.

-qemu-system-x86_64
-...
-usb -device usb-host,bus=usb-bus.0,hostbus=<bus>,hostport=<port> 

Это добавляет физический USB-плагин к виртуальной машине. Большинство примеров показаны и хорошо документированы для usb-bus / deviceID, но не для этого решения.

Редактировать: инструмент virsh domxml-from-native qemu-argv MyArgV.sh имеет следующее решение:

<qemu:commandline>
  <qemu:arg value='-device'/>
  <qemu:arg value='usb-host,bus=usb-bus.0,hostbus=1,hostport=10'/>
</qemu:commandline>

Но это не совсем то, что я хотел, потому что это обход системы libvirt. Так что, если нативный инструмент не может найти решение, есть ли общее решение libvirt для передачи USB-портов?

Я также попробовал графический интерфейс virt-manager для добавления USB-порта, но не смог найти для этого никакой возможности.

Может быть, есть возможность сделать снимок работающей машины qemu и скопировать его с помощью libvirt на лету?

Я нашел эту веб-страницу. Но этот описывает, как собрать иерархию usb-портов в виртуальной машине, а не перенаправлять порт хоста в vm.

3 ответа

Решение

К сожалению, это не задокументировано, но вы можете назначить USB-устройство на основе шины + номер устройства с помощью следующего синтаксиса:

<hostdev mode='subsystem' type='usb' managed='no'>
  <source>
    <address bus='1' device='NNN'/>
  </source>
</hostdev>

к сожалению, номер устройства здесь - это номер /dev/usb/bus/NNN, который меняется каждый раз, когда вы подключаете его. Пока нет никакой поддержки выбора устройства на основе стабильного хост-порта.

lsusb покажет все ваши устройства. Найдите несколько фрагментов ниже, как я решил подключить несколько устройств одного и того же поставщика, не зная, какому устройству оно будет назначено (из-за перезагрузки или повторного подключения устройства)

      # Discover relevant USB devices and write xml files

# How many numbers are returned per lsusb device listing
POINTS_PER_DEVICE=6
# Command to grep for USB devices from vendor Cygnal
DEVICES=$(lsusb | grep Cygnal)
# Trimming all numbers out
NUMBERS=$( echo "$DEVICES" | sed -e 's/[^0-9]/ /g' | tr -s ' ')

ARRAY=()
NUMBER=0
for num in $NUMBERS; do
   NUMBER=$((NUMBER + 1));
   #echo "number: $NUMBER value: $((10#$num))"
   ARRAY[$NUMBER]=$((10#$num));
done

NUM_DEVICES=$(( NUMBER / POINTS_PER_DEVICE ));
echo "Found $NUM_DEVICES devices matching."

for (( devices=1; devices <= $NUM_DEVICES; devices++ )); do
   INDEX=$(( devices * POINTS_PER_DEVICE - POINTS_PER_DEVICE + 1));
   echo "<hostdev mode='subsystem' type='usb'>
         <source startupPolicy='optional'>
         <address bus='${ARRAY[$INDEX]}' device='${ARRAY[$INDEX + 1]}'/>
         </source>
         </hostdev>" > $DIR/Automount_${devices}_usb.xml
   echo "Created Automount_${devices}_usb.xml file."
   # Then mount USB
   /QVS/usr/bin/virsh attach-device <your-uuid> $DIR/Automount_${devices}_usb.xml
done

Вы также можете узнать идентификаторы поставщика и продукта со своего USB-устройства (используя lsusb), а затем используйте эту информацию для подключения USB-устройства к KVM:

$ lsusb
...
Bus 002 Device 018: ID 03f0:4217 Hewlett-Packard EWS CM1015
...
<hostdev mode='subsystem' type='usb'>
  <source>
    <vendor id='0x03f0'/>
    <product id='0x4217'/>
  </source>
</hostdev>

Найдено на https://rolandtapken.de/blog/2011-04/how-auto-hotplug-usb-devices-libvirt-vms-update-1.

Однако это не сработает, если к хосту подключено несколько таких USB-устройств.

Другие вопросы по тегам