Linux kvm windows usb

How To Virtualize a Windows 10 machine with a USB peripheral with KVM

I have a Canon CanoScan 4400F usb scanner and I haven’t found a way to directly use it with GNU/Linux. So I scan through a KVM Windows 10 Virtual Machine.

Configuration

Device Owner

On my system, the scanner device is mounted with root owner rights. To be able to use it on my KVM virtual machine, I need to change the owner from root to user.

[user@host ~]$ lsusb | grep "Canon" Bus 002 Device 002: ID 04a9:2228 Canon, Inc. CanoScan 4400F
[user@host ~]$ ls -l /dev/bus/usb/002/002 crw-rw-r-- 1 root root 189, 129 31 oct. 09:20 /dev/bus/usb/002/002

Temporary solution

A temporary solution is to change the owner from a root prompt. We will have to do it each time after a reboot.

root@host:~# chown user:user /dev/bus/usb/002/002

Permanent solution

To make it works permanently we will create a udev rule.

root@host:~# udevadm info --attribute-walk --path=$(udevadm info --query=path --name=/dev/bus/usb/002/002) Udevadm info starts with the device specified by the devpath and then walks up the chain of parent devices. It prints for every device found, all possible attributes in the udev rules key format. A rule to match, can be composed by the attributes of the device and the attributes from one single parent device. looking at device '/devices/pci0000:00/0000:00:14.0/usb2/2-10': KERNEL=="2-10" SUBSYSTEM=="usb" [. ] ATTR=="2228" ATTR=="04a9" [. ]

Now we have device attributes we can create our udev rule.

SUBSYSTEM= red">usb", ATTR= red">04a9", ATTR= red">2228", OWNER red">user", GROUP red">user"
root@host:~# udevadm control --reload
root@host:~# udevadm test $(udevadm info --query=path --name=/dev/bus/usb/002/002) | less [. ] Reading rules file: /etc/udev/rules.d/80-scanner.rules [. ]
[user@host ~]$ ls -l /dev/bus/usb/002/002 crw-rw-r-- 1 user user 189, 129 31 oct. 09:20 /dev/bus/usb/002/002

KVM Hypervisor Configuration

Installation

root@host:~# pacman -S qemu; modprobe virtio

Virtual Disk Creation

root@host:~# qemu-img create -f raw WIN_HDD01 20G

Grow disk size

root@host:~# qemu-img resize -f raw WIN_HDD01 +30G

Download virtio drivers

root@host:~# wget 'https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso'

Install Windows

  • Windows 10 ISO : /data/en_windows_10_enterprise_ltsc_2019_x64_dvd_74865958.iso
  • virtio drivers ISO : /tmp/virtio-win.iso
[user@host ~]$ qemu-system-x86_64 -smp 2 -net nic,model=e1000,macaddr=52:54:00:12:34:56 -net user,id=mynet0,net=192.168.76.0/24,dhcpstart=192.168.76.9,hostfwd=tcp::5555-:3389 -cpu host -vga cirrus -m 4096 -cdrom /data/en_windows_10_enterprise_ltsc_2019_x64_dvd_74865958.iso -enable-kvm -boot order=d -drive file=/data/WIN_10_LTSB_HDD01,index=0,media=disk,if=virtio,format=raw -drive file=/tmp/virtio-win.iso,media=cdrom,index=3

Load driver

  • Browse
Читайте также:  Forticlient vpn linux mint

  • viostor > w10 > amd64

  • Next

Remote Access

Start VM with RDP redirection and USB

[user@host ~]$ qemu-system-x86_64 -smp 2 -net nic,model=e1000,macaddr=52:55:01:11:34:53 -net user,id=mynet0,net=192.168.76.0/24,dhcpstart=192.168.76.9,hostfwd=tcp::5555-:3389 -cpu host -vga cirrus -m 4096 -enable-kvm -boot order=d -drive file=/vdisks/WIN_HDD01,index=0,media=disk,if=virtio,format=raw -device nec-usb-xhci -device usb-host,hostbus=1,hostaddr=3

RDP to the VM with a shared folder with xfreerdp or rdesktop

Here, two examples with rdesktop and xfreerdp.

To facilitate files transfer between our systems, we will use the redirected folders feature, so the /tmp/share folder will be usable from our Windows :

[user@host ~]$ rdesktop 127.1:5555 -r disk:docs=/tmp/share -0 -r sound:remote
[user@host ~]$ mkdir /tmp/share;xfreerdp /v:127.0.0.1:5555 /w:1900 /h:1024 /cert-ignore /drive:share,/tmp/share

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

Источник

Проброс USB в виртуалку по сети средствами UsbRedir и QEMU

На сегодняшний день существет довольно много способов пробросить USB-устройство на другой компьютер или виртуалку по сети.
Из наиболее популярных — железячные такие как AnywhereUSB и чисто програмные продукты, из тех что я попробовал сам: USB Redirector и USB/IP.
Я бы хотел рассказать вам еще об одном интересном способе, который работает непосредственно с эмулятором QEMU.
Он так же является частью проекта spice, официально поддерживаемым RedHat.

UsbRedir, это открытый протокол для проброса usb-устройств по tcp на удаленный виртуальный сервер, разработанный при поддержке RedHat в рамках проекта spice. Но как оказалось им можно вполне успешно пользоваться и без spice. В роли сервера выступает usbredirserver, который шарит usb-устройство на определенный порт, а в качестве клиента сам QEMU, который эмулирует подключение экспортированного usb-устройства в определенный usb-контроллер вашей виртуальной машины. Благодаря такому подходу в качестве гостевой системы может использоваться абсолютно любая ОС, так как она даже не знает, что устройство является проброшенным удаленно, а вся логика ложится на QEMU.

Для начала несколько слов о вышеперчисленных решениях

  • AnywhereUSB — довольно неплохое решение, но дорогое, и имеет неприятние глюки, например бывает если расшаренная флешка отваливается, то переподключить ее обратно можно только физически вынув и вставив ее.
  • USB/IP — OpenSource проект. Вроде как был заброшен. По факту глючит довольно сильно. При разрыве соединения, машина частенько уходит в полнейший freezee, а windows показывает BSOD
  • USB Redirector — Замечательная софтина. Для расшаривания устройств с linux на linux бесплатна, во всех остальных случаях уже стоит денег, не так много как AnywhereUSB, но и не бесплатно как хотелось бы 🙂
Читайте также:  Kernel timers linux example

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

Для qemu (без libvirt)

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

-device ich9-usb-ehci1,id=ehci,addr=1d.7,multifunction=on -device ich9-usb-uhci1,id=uhci-1,addr=1d.0,multifunction=on,masterbus=ehci.0,firstport=0 -device ich9-usb-uhci2,id=uhci-2,addr=1d.1,multifunction=on,masterbus=ehci.0,firstport=2 -device ich9-usb-uhci3,id=uhci-3,addr=1d.2,multifunction=on,masterbus=ehci.0,firstport=4 
Для libvirt

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

Кстати, если вы используете spice, то добавив к контроллерам еще 3 специальных девайса, станет возможен проброс usb-устройств с клиента spice на сервер.

Для qemu

Добавляем следующие опции в команду запуска виртуальной машины, помимо контроллеров определеных нами раньше:

-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 
Для libvirt

В исходном файле конфигурации виртуальной машины в узле &ltdevices&gt добавляем следующие опции, помимо контроллеров определеных нами раньше:

Теперь все готово для осуществления проброса.

Запуск сервера

Пакет usbredirserver можно найти в стандартных репозиториях практически во всех популярных дистрибутивах linux.

Вставляем флешку в компьютер, смотрим вывод usb-устройств:

$ lsusb . Bus 003 Device 011: ID 125f:c82a A-DATA Technology Co., Ltd. . 

Видим что пара vendorid:prodid равна 125f:c82a, а ядро определило флешке 003-001 usbbus-usbaddr соотвественно.

Теперь давайте расшарим ее на 4000 порт:

# Используя пару vendorid:prodid $ usbredirserver -p 4000 125f:c82a # Используя пару usbbus-usbaddr $ usbredirserver -p 4000 003-011 

Подключение устройства к виртуальной машине

Через опции при запуске ВМ

Устройство которое нужно подключить к ВМ можно указать при запуске, добавив следующие опции в команду запуска

Для qemu
-chardev socket,id=usbredirchardev1,port=4000,host=192.168.1.123 -device usb-redir,chardev=usbredirchardev1,id=usbredirdev1,bus=ehci.0,debug=4 
Для libvirt

Его так же можно исполнить командой virsh attach-device

Или через qemu-monitor

# Добавляем наше устройство chardev-add socket,id=usbredirchardev1,port=4000,host=192.168.1.123 # Подключем его в ehci контроллер (USB-2.0) device_add usb-redir,chardev=usbredirchardev1,id=usbredirdev1,bus=ehci.0,debug=4 

На этом все, после данных шагов ваша ВМ увидит вашу флешку и сможет с ней нативно работать.

Если устройств много и все они одинаковые

Вот тут появилась интересная задачка, как пробросить несколько одинаковых девайсов на разные ВМ?
При этом, стоит отметить, все устройства имеют одинаковую пару vendorid:prodid, а пара usbbus-usbaddr совсем не постоянна, стоит только вынуть и вставить устройство, так оно сразу поменяет свой usbaddr.

Я решил ее при помощи udev.
Кстати если вы не совсем понимаете как работает udev, на Debian Wiki есть классная статья о udev

Читайте также:  Linux creating admin user

И так приступим

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

$ udevadm monitor --environment --udev 

И вставим наше устройство, после этого мы сразу увидим список переменных этого устройства которые udev любезно инициализировал для нас:

. UDEV [189056.151508] add /devices/virtual/bdi/8:16 (bdi) ACTION=add DEVPATH=/devices/virtual/bdi/8:16 ID_SERIAL_SHORT=11C130317234004B SEQNUM=4352 SUBSYSTEM=bdi USEC_INITIALIZED=189056149826 . 

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

$ udevadm info -a -n /dev/bus/usb/003/011 | grep '' 

Теперь создадаим файл /etc/udev/rules.d/99-usb-serial.rules и запишем в него следующие правила:

ACTION=="add", ENV="11C130317234004B", RUN+="/usr/bin/usbredirserver -p 4000 $attr-$attr" ACTION=="remove", ENV="11C130317234004B", RUN+="/usr/bin/fuser -k 4000/tcp" 
$ udevadm control --reload-rules 

Готово, теперь при подключении нашего устройства, оно будет автоматически шарится на нужный нам порт, а при отключении usbredirserver будет прекращать свою работу.
По аналогии добавляем и остальные устройства.

На этом все. Спасибо за проявленный интерес 🙂

Источник

Динамический проброс USB-устройства в виртуальную машину на базе KVM-гипервизора

Задача: необходимо выполнить проброс Flash-накопителя в виртуальную машину на базе KVM-гипервизора, чтобы при переподключении одного и тоже же Flash-накопителя гипервизор автоматически выполнял проброс с хост-машины в гостевую.

Проблема: При переподключении Flash-накопителя через GUI virt-manager устройство автоматически не импортируется в виртуальную машину, так как при переподключении изменился индентификатор устройста.

Проброс KVM через virt-manager

Параметры lsusb

Решение: Чтобы обойти данную проблему необходимо создать файл с описанием параметров idVendor и idProduct для Flash-накопителя.

После того, как мы узнали idVendor и idProduct, создадим файд .xml формата, чтобы импортировать его в конфигурацию виртуальной машины KVM. В файле /etc/libvirt/qemu/usb_device.xml указывает полученные данные в шестнадцатиричном формате. Здесь usb_device.xml любое название файла.

Далее создадим правило в файле /etc/udev/rules.d/90-libvirt-usb.rules для устройства, которое будет подключено к хост-машине.

ACTION=="add", \ SUBSYSTEM=="usb", \ ENV=="ffff", \ ENV=="5678", \ RUN+="/usr/bin/virsh attach-device win2016 /etc/libvirt/qemu/usb_device.xml" ACTION=="remove", \ SUBSYSTEM=="usb", \ ENV=="ffff", \ ENV=="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-накопитель и проверяем работу динамического проброса устройства.

Источник

Оцените статью
Adblock
detector