Проброс USB-устройств в виртуальную машину через SPICE

Протокол удаленного доступа SPICE позволяет не только передовать данные устройств ввода-вывода, он также может передавать по сети трафик USB устройств т.е. позволяет пробрасывать USB устройсва клиента без использования дополнительных программ USB-серверов таких как usbip.

В данной статье рассмотрены методы настройки виртуальной машины для проброса USB устройств из удаленного клиента в виртуальную машину.

В данной статье методы настройки рассматриваются от простого к сложному что позволяет понять процесс настройки.

Проброс устройств может использоваться для получения и перидачи данных на удаленные устройства из виртуальных машин например: принтеры, USB ключи, FLASH накопители и другие низкоскоростные устройства с целью обеспечения удобства работы и сохранения конфиденциальных данных от компрометации.

Также благодаря пробросу можно использовать через виртуальную машину устройства драйвера или программное обеспечение для которых еще не разработаны для Linux.

Подготовка

На сервере размещаем виртуальную машину KVM под управлением SPICE с поддержкой USB redirect.
В самой виртуальной машине установка гостевых дополнений не требуется.
На машине клиента устанавливаем Linux и SPICY и получаем права администратора.

Сохраняем файл "http://cgit.freedesktop.org/spice/qemu/plain/docs/ich9-ehci-uhci.cfg" как "/etc/qemu/ich9-ehci-uhci.cfg"

Внимание: Проброс USB устройств реализован только из SPICE клиента для Linux!

Метод 1. Консоль

В консоли набираем команду :

kvm -drive file="mint_13_amd64.img",cache=writeback,aio=native -m 1024 -spice port=5900,addr=127.0.0.1,disable-ticketing -monitor telnet:127.0.0.1:4000,server,nowait -enable-kvm -vga cirrus -readconfig /etc/qemu/ich9-ehci-uhci.cfg \
-chardev spicevmc,name=usbredir,id=usbredirchardev1 \
-device usb-redir,chardev=usbredirchardev1,id=usbredirdev1,debug=3 \
-chardev spicevmc,name=usbredir,id=usbredirchardev2 \
-device usb-redir,chardev=usbredirchardev2,id=usbredirdev2,debug=3 \
-chardev spicevmc,name=usbredir,id=usbredirchardev3 \
-device usb-redir,chardev=usbredirchardev3,id=usbredirdev3,debug=3

Метод 2. Libvirt черновик

В файле настроек виртуальной машины

<domain type="kvm">

заменяем блок на:

<domain type="kvm" xmlns:qemu="http://libvirt.org/schemas/domain/qemu/1.0">

С помощью следующего блока, размещенного перед тегом </domain> указываем дополнительные параметры вызова kvm:

<qemu:commandline>
<qemu:arg value="-readconfig"/>
<qemu:arg value="/etc/qemu/ich9-ehci-uhci.cfg"/>
<qemu:arg value="-chardev"/>
<qemu:arg value="spicevmc,name=usbredir,id=usbredirchardev1"/>
<qemu:arg value="-device"/>
<qemu:arg value="usb-redir,chardev=usbredirchardev1,id=usbredirdev1,bus=ehci.0,debug=3"/>
<qemu:arg value="-chardev"/>
<qemu:arg value="spicevmc,name=usbredir,id=usbredirchardev2"/>
<qemu:arg value="-device"/>
<qemu:arg value="usb-redir,chardev=usbredirchardev2,id=usbredirdev2,bus=ehci.0,debug=3"/>
<qemu:arg value="-chardev"/>
<qemu:arg value="spicevmc,name=usbredir,id=usbredirchardev3"/>
<qemu:arg value="-device"/>
<qemu:arg value="usb-redir,chardev=usbredirchardev3,id=usbredirdev3,bus=ehci.0,debug=3"/>
</qemu:commandline>

Для редактирования файла конфигурации виртуальной машины используем команду:

virsh edit <имя_машины>.

либо останавливаем сервис libvirt-bin на время редактирования файла расположенного в каталоге /etc/libvirt/qemu.

Внимание: По умолчанию в качестве редактора файла конфигурации используется редактор vi. Если вам нравится другой редактор установите в значении переменной окружения EDITOR имя команды вызова редактора. Например для запуска редактирования файла конфигурации через nano используйте команду следующего вида:

EDITOR=nano virsh edit <имя_машины>

Метод 3. Libvirt чистовик

В исходном файле конфигурации виртуальной машины в узле <devices> удаляем все USB контроллеры и добавляем следущий блок:

<controller type='usb' index='0' model='ich9-ehci1'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x7'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci1'>
      <master startport='0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0' multifunction='on'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci2'>
      <master startport='2'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x1'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci3'>
      <master startport='4'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x2'/>
    </controller>
    <redirdev bus='usb' type='spicevmc'> 
      <address type='usb' bus='0' port='3'/>
    </redirdev>
    <redirdev bus='usb' type='spicevmc'>
      <address type='usb' bus='0' port='4'/>
    </redirdev>
    <redirdev bus='usb' type='spicevmc'>
      <address type='usb' bus='0' port='5'/>
    </redirdev>
    <redirdev bus='usb' type='spicevmc'>
      <address type='usb' bus='0' port='6'/>
    </redirdev>

Подключение клиента

С помощью spicy осуществляем подключение и пробрасываем USB устройство через меню "Input->Select USB devices for redirection" либо с помощью комбинации клавиш Shift+F10. Отключение осуществляется аналогичным способом.

Для того чтобы небыло проблем с правами доступа к USB устройствам осуществляем запуск spicy c правами root:

sudo spicy

Также существует возможность автоматического проброса устройств через spicy. В данном режиме все устройства подключаемые к компьютеру клиента автоматически перенаправляются в виртуальную машину

Источники

  1. http://hansdegoede.livejournal.com/11686.html
  2. http://bderzhavets.wordpress.com/2011/10/16/set-up-qemuspicelibvirt-0-9-6-usb-redirection-on-ubuntu-11-10/