Задача: необходимо выполнить проброс Flash-накопителя в виртуальную машину на базе KVM-гипервизора, чтобы при переподключении одного и тоже же Flash-накопителя гипервизор автоматически выполнял проброс с хост-машины в гостевую.
Проблема: При переподключении Flash-накопителя через GUI virt-manager устройство автоматически не импортируется в виртуальную машину, так как при переподключении изменился индентификатор устройста.
Решение: Чтобы обойти данную проблему необходимо создать файл с описанием параметров idVendor и idProduct для Flash-накопителя.
После того, как мы узнали idVendor и idProduct, создадим файд .xml формата, чтобы импортировать его в конфигурацию виртуальной машины KVM. В файле /etc/libvirt/qemu/usb_device.xml
указывает полученные данные в шестнадцатиричном формате. Здесь usb_device.xml
любое название файла.
<hostdev mode='subsystem' type='usb'>
<source>
<vendor id='0xffff'/>
<product id='0x5678'/>
</source>
</hostdev>
Далее создадим правило в файле /etc/udev/rules.d/90-libvirt-usb.rules
для устройства, которое будет подключено к хост-машине.
ACTION=="add", \
SUBSYSTEM=="usb", \
ENV{ID_VENDOR_ID}=="ffff", \
ENV{ID_MODEL_ID}=="5678", \
RUN+="/usr/bin/virsh attach-device win2016 /etc/libvirt/qemu/usb_device.xml"
ACTION=="remove", \
SUBSYSTEM=="usb", \
ENV{ID_VENDOR_ID}=="ffff", \
ENV{ID_MODEL_ID}=="5678", \
RUN+="/usr/bin/virsh detach-device win2016 /etc/libvirt/qemu/usb_device.xml"
Здесь /usr/bin/virsh
путь до бинарного файла virsh, win2016
– имя виртуальной машины, на которую выполняем проброс Flash-накопителя, /etc/libvirt/qemu/usb_device.xml
– путь до .xml файла с описание устройства. Так же в файле правила указывает идентификаторы Flash-накопителя ID_VENDOR_ID
= idVendor
и ID_MODEL_ID
= idProduct
.
Перезагружаем правила udev командой udevadm control --reload-rules && udevadm trigger
или перезагружаем хост-машину. После этого переподключаем Flash-накопитель и проверяем работу динамического проброса устройства.