Устанавливаем USB/IP
Данный проект позволяет пробросить 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. Но судя по отзывам пользователей в интернете тоже все работает.