Проброс USB устройств по сети при помощи USBIP

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

Как оказалось, уже давно созданы как программы, так и отдельные железки, позволяющие пробросить любое USB устройство по сети, но цена коммерческого решения оказалась несколько великоватой - в магазине нам озвучили цену за мультихостовый девайс 1000 долларов, и жать его поставки Украину нужно будет три недели. Поэтому было решено попробовать решить задачу, используя бесплатное ршение USBIP, процедуру установки и настройки которого я и рассмотрю в данном материале.

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

Итак, давайте рассмотрим по порядку процесс настройки и проброса USB устройств по сети при помощи USBIP.

Установка Linux

Для настройки серверной части USBIP, понадобится установить Linux. Разработчики проекта ограничились написанием серверной части только для Linux. Клиентская часть есть как для Linux, так и для Windows.

В даной статье я буду устанавливать Debian 7.9, так как после долгих разбирательств удалось получить рабочее решение на базе Дебиана, а дальше тратить время не было возможности, потому остановился на том что есть. Рассказывать как устанавливать Linux не буду, есели вы интересуетесь вопросом проброса USB устройств по сети на базе USBIP, процедура установки Linux должна быть для вас также прозрачна. В случае, если ищете решение, устанавливаемое нажатием пары кнопок мыши, следует повернуть свой взор в сторону платных продуктов, но там уже нужно платить денежки.

Установка сервера USBIP

Обновляем систему, устанавливаем пакет USBIP и загружаем модули ядра, необходимые для работы программы:

sudo apt-get update && sudo apt-get dist-upgrade -y

sudo apt-get install usbip -y

sudo modprobe usbip-core
sudo modprobe usbip-host

Теперь, нужно сделать так, чтоб эти модули загружаилсь при старте системы. В файл /etc/modules и добавьте две строчки, по одной для каждого загружаемого модуля:

sudo echo "usbip-core" >> /etc/modules
sudo echo "usbip-host" >> /etc/modules

Для того, чтоб после запуска системы сервер USBIP стартовал автоматом, нужно добавить init.d скрипт. Для этого скопируйте файл /etc/init.d/skeleton:

sudo cp /etc/init.d/skeleton /etc/init.d/usbipd

Далее отредактируйте файл /etc/init.d/usbipd, поменяйте параметры описание, имя демона и аргументы, как приведено ниже:

DESC="usbip service"
NAME=usbipd
DAEMON_ARGS="-D"

Сделайте файл исполняемым:

sudo chmod 755 /etc/init.d/usbipd

Ну и на последок запустите команду update-rc.d, после чего usbip готов для атоматического запуска. Запускаем программу:

sudo update-rc.d usbipd defaults
sudo /etc/init.d/usbipd start

Если нет ошибок, то все настроено правильно и сервер готов расшаривать USB девайсы

Список доступных к расшариванию устройств можно посмотреть выполнив команду usbip list -l. Параметр -l говорит программе, что нужно вывести локальные устройства. Программа должна вернуть список устройтв следующего вида:

okovtun@debian:~$ sudo usbip list -l
Local USB devices
=================
 - busid 1-4 (8564:1000)
         1-4:1.0 -> usb-storage

Если устройств перечислено несколько, определите какое именно устройство вам нужно проброить по сети и запомите его идентификатор, в моем случае, мне нужно пробросить устройство с идентификатором 1-4. Далее, выполняем команду:

okovtun@debian:~$ sudo usbip bind -b 1-4
bind device on busid 1-4: complete

Если в результате программа в конце написала : complete, и не вернула вам никаких сообщений об ошибках - устройство успешно расшарено и теперь к нему можно получить доступ с любого компьютера, на котором установлен USBIP клиент.

Если на вашем компьютере настроена фильтрация пакетов, то добавьте порт 3240 в разрешенные для подключения извне:

iptables -I INPUT -p tcp -m tcp --dport 3240 -j ACCEPT

Вот и все. Серверная часть настроена. Теперь будет самое интересное - подключить к серверу клиента и увидеть флешку, воткнутую в удаленном компьютер, но отображаемую, как будто она подключена непосредственно к вашему компьютеру.

Установка USBIP клиента под Windows

Откройте странцу USBIP на  сайте Sourceforge, и загрузите клиент USBIP последней версии. Распакуйте содержимое архива, например в папку c:\usbip

Установка драйвера.

Откройте диспетчер устройств, выберите корневой элемент дерева, нажмите правой кнопкой мыши и в контекстном меню выберите пункт Установить старое устройство.

Первый шаг пропускаем

На втором шаге устанавливаем радио переключатель в положение Установка оборудования, выбранного из списка вручную

Следующий шаг пропускаем, просто нажимаем Далее

На следующем шаге нажимаем кнопку Установить с диска, выбираем файл драйвера устройства USBIPEnum.inf.

В итоге видим драйвер USB/IP Enumerator, выбираем его и нажимаем кнопку Далее

Соглашаемся с предложением установить новое оборудование и нажимаем кнопку Далее.

На вопрос об установке программного обеспечения отвечаем утвердительно, дожидаемся завершения работы мастера, и нажимем кнопку Готово.

В Диспетчере устройств появилось новое системное устройство USB/IP Enumerator.

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

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

Открываем командную строку, устанавливаем текущей директорию, c:\usbip. Если выполнить команду без параметров, будет выведена справка.

PS C:\> cd C:\usbip\

PS C:\usbip> .\usbip.exe
usbip for windows ($Id$)

Usage: C:\usbip\usbip.exe [options]
        -a, --attach [host] [bus_id]
                Attach a remote USB device.

        -x, --attachall [host]
                Attach all remote USB devices on the specific host.

        -d, --detach [ports]
                Detach an imported USB device.

        -l, --list [hosts]
                List exported USB devices.

        -p, --port
                List virtual USB port status.

        -D, --debug
                Print debugging information.

        -v, --version
                Show version.

        -h, --help
                Print this help.

Запрашиваем список расшаренных USB устройств на удаленном компьютере. Для этого нужно запустить usbip.exe с параметром -l, --list [адрес-хоста]:

PS C:\usbip> .\usbip.exe -l 10.125.2.28
usbip for windows ($Id$)

- 10.125.2.28
     1-4: unknown vendor : unknown product (8564:1000)
        : /sys/devices/pci0000:00/0000:00:1a.7/usb1/1-4
        : (Defined at Interface level) (00/00/00)
        :  0 - unknown class / unknown subclass / unknown protocol (08/06/50)

PS C:\usbip>

Видим устройство 1-4, расшаенное ранее. Теперь, чтоб его подключить нужно запустить usbip.exe с параметром -a, --attach [адрес-хоста] [id устройства]

PS C:\usbip> .\usbip.exe -a 10.125.2.28 1-4
usbip for windows ($Id$)

new usb device attached to usbvbus port 1

Receive sequence:    8100

После непродолжительного ожидания (все-таки подключение производится не к локальному девайсу, а проброшенному через сеть), система запустит мастер установки драйверов оборудования. В конце сообщит вам об успешной установке устройства.

В результате устройство будет отображено у вас в системе и с ним можно работать как с обычным локальным устройством.

Если у вас есть замечания, или дополнения к материалу - буду рад, если поделитесь ими в комметариях.

There are 4 Comments

Крутяк. попробую. спасибо за

Крутяк. попробую. спасибо за статью

Смарт карты

Был ли опыт использования считывателей смарт-карт таким образом?

смарт карт небыло, но не вижу

смарт карт небыло, но не вижу никакой разницы в том, какое устройство - проброс осуществляется на самом низком уровне ,так что системе все равно смарт карта, флешка, или веб камера

Делись своим опытом и знаниями, ибо в могиле они тебе вряд-ли пригодятся.

Всё сделал как здесь написано

Всё сделал как здесь написано. Всё заработало, кроме последнего пункта - не может найти девайс, хотя usbip -l всё видит:

C:\Users\ааа\Desktop\usbip>usbip -l 192.168.0.101
usbip for windows ($Id$)

- 192.168.0.101
     5-1: unknown vendor : unknown product (1005:b113)
        : /sys/devices/platform/soc/1c1d000.usb/usb5/5-1
        : (Defined at Interface level) (00/00/00)

----------------------------------------------------------------------------------------------------------------------
C:\Users\ааа\Desktop\usbip>usbip -a 192.168.0.101 5-1 -D
usbip for windows ($Id$)

usbip dbg: usbip_network.c: 268 (tcp_connect ) trying 192.168.0.101 port 3240

usbip dbg: usbip_network.c: 288 (tcp_connect ) connected to 192.168.0.101:3240
usbip dbg:       usbip.c: 139 (query_interface0) exportable 1 devices
usbip dbg:       usbip.c: 156 (query_interface0)      5-1: unknown vendor : unkn
own product (1005:b113)
usbip dbg:       usbip.c: 157 (query_interface0)         : /sys/devices/platform
/soc/1c1d000.usb/usb5/5-1
usbip dbg:       usbip.c: 158 (query_interface0)         : (Defined at Interface
 level) (00/00/00)
usbip dbg:       usbip.c: 181 (query_interface0)
*** ERROR: cannot find device

Добавить комментарий

Filtered HTML

  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешённые HTML-теги: <a> <s> <u> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <hr> <dd> <sub> <sup>
  • Строки и параграфы переносятся автоматически.

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Строки и параграфы переносятся автоматически.
CAPTCHA
Защита от СПАМ ботов. Подтвердите, пожалуйста, что вы человек.
18 + 0 =
Решите эту простую математическую задачу и введите результат. Например, для 1+3, введите 4.