Устанавливаем USB/IP

Written by on . Posted in KVM, Linux

Данный проект позволяет пробросить usb устройства через сеть ethernet. Установку USB/IP производил на ubuntu-server 16.04(14.04) lts. Данной темой пришлось озадачиться т.к приходится пробрасывать usb ключи (eToken) и другие устройства в виртуальные машины у которых нет физических подключений. Можно пробросить usb устройство используя средства виртуализации, в kvm проброс USB это можно сделать так, но тогда возникает вопрос. Как делать живую миграцию виртуальной машины между серверами? Установив USB/IP решил все эти задачи.

Установка usbp/ip на сервере

Все бинарные файлы и модули входят в пакет linux-tools, вот его и поставим.
Сначала посмотрим информацию о нашем установленном ядре uname -r, а потом ставим linux-tools-X.XX

для ubuntu-server 14.04 lts

sudo uname -r
3.19.0-59-generic
sudo apt-get install linux-tools-3.19.0-59-generic

Все необходимые бинарные файлы для запуска будут находится в /usr/lib/linux-tools/3.19.0-59-generic/ usbip и usbipd

После установки необходимо подгрузить модули и запустить сервер командой:
usbipd -D

sudo modprobe usbip-core
sudo modprobe usbip-host

Не забудьте добавить загрузку модулей в файл /etc/modules
Запускаем сервер usbipd

sudo usbipd -D

Если при запуске usbipd -D получили ошибку:

$ sudo usbipd -D
usbip err: stub_driver.c:  33 (open_sysfs_stub_driver)
usbip_common_mod.ko and usbip.ko must be loaded

** (process:11490): ERROR **: driver open failed

Скорее всего вы по ошибке инсталировали пакет apt-get install usbip. Удалите его и поставьте linux-tools…

С установкой и запуском серверной части все. Теперь необходимо раздать в доступ usb устройства подключенные к данному серверу (192.168.10.200).

Посмотреть список usb устройств:

usbip list -l, --local (Список локальных USB устройств)
usbip list -r, --remote=<host> (Список расшариных USB устройств на удаленном хосте)

Подключить usb устройство для раздачи по сети
usbip bind -b, --busid=<busid>

Обратное действие для bind — unbind отключить устройство.
usbip unbind -b, --busid=<busid>

Пример:

admin@srv1404:~#sudo usbip list -l
usbip: error: failed to open /usr/share/hwdata//usb.ids
 - busid 4-1 (0529:0620)
   unknown vendor : unknown product (0529:0620)

 - busid 5-1 (046b:ff10)
   unknown vendor : unknown product (046b:ff10)

admin@srv1404:~# sudo usbip bind --busid=4-1
usbip: info: bind device on busid 4-1: complete

usbip bind — необходимо выполнять для каждого устройства
Посмотреть расшариные usb устройства можно следующей командой:

admin@srv1404:~#sudo usbip list -r localhost
usbip: error: failed to open /usr/share/hwdata//usb.ids
Exportable USB devices
======================
 - localhost
        4-1: unknown vendor : unknown product (0529:0620)
           : /sys/devices/pci0000:00/0000:00:1a.1/usb4/4-1
           : (Defined at Interface level) (00/00/00)
           :  0 - unknown class / unknown subclass / unknown protocol (0b/00/00)

Настраиваем клиентскую часть usb/ip

Установка ни чем не отличается от серверной части. Устанавливаем тот же пакет linux-tools.X-XX-….
Подгружаем модули: usbip-core и usbip-host

Смотрим доступные usb устройства на удаленном сервере:

sudo usbip list -r 192.168.10.200
usbip: error: failed to open /usr/share/hwdata//usb.ids
Exportable USB devices
======================
 - 192.168.10.200
        4-1: unknown vendor : unknown product (0529:0620)
           : /sys/devices/pci0000:00/0000:00:1a.1/usb4/4-1
           : (Defined at Interface level) (00/00/00)
           :  0 - unknown class / unknown subclass / unknown protocol (0b/00/00)

Подключаем устройство:

admin@client1404:~#sudo usbip attach -r  192.168.10.200 --busid=4-1
admin@client1404:~#

Если получили ошибку:

libusbip: error: udev_device_new_from_subsystem_sysname failed
usbip: error: open vhci_driver
usbip: error: query

Мы забыли подключить модуль vhci-hcd

sudo modprobe vhci-hcd

Вот теперь все должно сработать без ошибок. Не забудьте подгрузить все необходимые модули на клиенте в /etc/modules
usbip-core
usbip-host
vhci-hcd

Нюансы при работе с usb/ip

В процессе эксплуатации выяснились следующе моменты. Если клиентскую машину перегрузить или выключить, то подключение usb устройства командой usbip attach -r 192.168.10.200 —busid=4-1 может завершится ошибкой:

usbip: error: recv op_common
usbip: error: query

Но при этом если посмотреть с клиентской машины доступные usb устройства на сервере, то все usb видятся прекрасно. Видимо серверная часть хранит информацию о подключенных клиентах.
В качестве решения этой проблемы необходимо на сервере отключить usb устройство и заново расшарить. Делается примерно так.

sudo usbip list -r localhost
usbip: error: failed to open /usr/share/hwdata//usb.ids
Exportable USB devices
======================
 - localhost
        4-1: unknown vendor : unknown product (0529:0620)
           : /sys/devices/pci0000:00/0000:00:1a.1/usb4/4-1
           : (Defined at Interface level) (00/00/00)
           :  0 - unknown class / unknown subclass / unknown protocol (0b/00/00)

sudo usbip unbind --busid=4-1
usbip: info: unbind device on busid 4-1: complete
sudo usbip bind -b 4-1
usbip: info: bind device on busid 4-1: complete

Поэтому преждем чем перегружать или выключать клиентскую машину необходимо сначала отключать usb.
1. Смотрим на каком порту подключен usb

admin@client1404:~# /usr/lib/linux-tools/3.19.0-64-generic/usbip port
Imported USB devices
====================
Port 00:  at Full Speed(12Mbps)
       unknown vendor : unknown product (0529:0620)
       2-1 -> usbip://192.168.10.200:3240/4-1
           -> remote bus/dev 004/003

2. Отключаем устройство

sudo usbip detach -p 00

Все теперь можно перегружать, выключать и т. д. это все можно автоматизировать создав исполняемый файл положив в /etc/init.d/. update-rc.d — в помощь.

В моей сети нет необходимости пробрасывать usb на клиентскую машину с windows. Но судя по отзывам пользователей в интернете тоже все работает.

Leave a comment