Проброс USB с помощью сервера usbip на Linux Ubuntu

Обновлено Обновлено: Опубликовано Опубликовано:

В инструкции описан процесс настройки бесплатного решения для редиректа USB устройства с сервера на любой другой компьютер сети. Это может пригодиться, например, для проброса USB токена на виртуальную машину или несетевого принтера. В рамках примера сервер будет на Linux Ubuntu, клиент — на Windows (проверено на 7, 10, Server 2008 и 2012).

Установка и запуск

В Ubuntu установка инструмента проброса USB выполняется следующей командой:

apt-get install linux-tools-`uname -r`

* в моем случае была выполнена установка linux-tools-4.4.0-128-generic, где 4.4.0-128-generic — версия ядра, используемого в Ubuntu.

Подгружаем модули драйверов USB:

modprobe usbip-core

modprobe usbip-host

modprobe vhci-hcd

Запускаем usbip в качестве демона:

Смотрим список подключенных USB устройств:

usbip list -l

Пример ответа:

[email protected]:/usr/src# usbip list -l
 – busid 2-1.3 (8564:1000)
   Transcend Information, Inc. : JetFlash (8564:1000)

 – busid 2-1.4 (1c4f:0026)
   SiGma Micro : Keyboard (1c4f:0026)

Теперь можно расшарить флешку:

usbip bind -b 2-1.3

Должны увидеть на подобие:

usbip: info: bind device on busid 2-1.3: complete

Настройка клиента

Выполним настройку на базе операционной системы Windows.

Скачиваем драйвер и утилиту для Windows. Распаковываем архив usbip.zip.

Открываем диспетчер устройств (команда devmgmt.msc или правой кнопкой по Этот компьютер в проводнике – Управление – Диспетчер устройств).

Кликаем по ДействиеУстановить старое устройство:

Установка старого устройства в диспетчере устройств Windows

Выбираем ручную установку устройства – показать все устройства – Установка с диска и выбираем файл USBIPEnum.inf (находится в каталоге usbip, который мы распаковали ранее).

Будет обнаружено устройство USB/IP Enumerator – кликаем Далее, чтобы его установить. Мы должны его увидеть среди системных устройств.

Теперь открываем командную строку (cmd.exe) и переходим в распакованный каталог, например:

cd C:\Users\user\Downloads\usbip

* где C:\Users\user\Downloads\usbip — полный путь до папки.

Смотрим список расшаренных USB устройств на сервере:

usbip -l 192.168.0.15

* где 192.168.0.15 — IP-адрес сервера USB.

Мы получим ответ, на подобие этого:

C:\Users\user\Downloads\usbip>usbip -l 192.168.0.15
– 192.168.0.15
   2-1.3: unknown vendor : unknown product (8564:1000)
        : /sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3
        : (Defined at Interface level) (00/00/00)

Теперь можно примонтировать устройство:

usbip.exe -a 192.168.0.15 2-1.3

* если увидим ошибку …cannot find device, переходим к решению.

Автозапуск

Данная инструкция предполагала разовый запуск как сервера, так и клиента. После перезапуска системы, работоспособность будет потеряна до повторного ввода команд. Попробуем настроить автоматический запуск сервера и клиента.

Автозапуск сервера

Добавляем модули в автозапуск:

vi /etc/modules

usbip-core
usbip-host
vhci-hcd

Создаем юнит в systemd:

vi /etc/systemd/system/usbipd.service

[Unit]
Description=USBIPd

[Service]
ExecStart=/scripts/usbipd
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Перечитываем конфигурацию systemd и разрешаем запуск созданного нами юнита:

systemctl daemon-reload

systemctl enable usbipd

Создаем каталог хранения скрипта и сам скрипт:

mkdir /scripts

vi /scripts/usbipd

#!/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin

bindID=’2-1.3′

usbipd -D
usbip bind -b $bindID

usbip attach –remote=localhost –busid=$bindID
sleep 2
usbip detach –port=00

Разрешаем запуск скрипта:

chmod +x /scripts/usbipd

Запускаем демона:

systemctl start usbipd

systemctl status usbipd

Для окончательного тестирования можно перезагрузить сервер.

Автозапуск клиента Windows

Пишем небольшой батник:

@echo off

cd C:\Users\user\Downloads\usbip
usbip.exe -a 192.168.0.15 2-1.3

C:\Users\user\Downloads\usbip — путь, где хранится распакованная утилита; 192.168.0.15 — адрес  сервера USB; 2-1.3 — идентификатор USB устройства на сервере.

Сохраняем скрипт с расширением bat или cmd. Запускаем планировщик заданий и добавляем новую задачу.

На вкладке Общие отмечаем Выполнять вне зависимости от регистрации пользователя и ставим галочку Выполнить с наивысшими правами:

Планировщик - вкладка общие

В триггерах выбираем При запуске системы:

Планировщик - вкладка триггеры

На вкладке Действия выбираем Запуск программы и прописываем путь до скрипта, который мы сохранили ранее:

Планировщик - вкладка действия

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

Планировщик - вкладка параметры

Для проверки, можно запустить вручную задачу на исполнение или перезагрузить компьютер.

Возможные проблемы

1. usbip_common_mod.ko and usbip.ko must be loaded

Ошибка появляется при попытке выполнить usbipd -D.

Причина: был установлен пакет usbip вместо linux-tools-<версия ядра>.

Решение: удаляем usbip:

apt-get remove usbip

Ставим нужный пакет:

apt-get install linux-tools-`uname -r`

2. /usr/sbin/usbipd: No such file or directory

Данная ошибка также появляется при попытке выполнить usbipd -D.

Причина: Нужный бинарник для запуска находится по другому пути — /usr/bin/usbipd.

Решение: создаем симлинк:

ln -s /usr/bin/usbipd /usr/sbin/usbipd

3. usbip: error: failed to open /usr/share/hwdata//usb.ids

Выскакивает при попытке посмотреть список устройств командой usbip list -l.

Причина: необходимый файл usb.ids находится в другой директории.

Решение: создаем каталог /usr/share/hwdata:

mkdir /usr/share/hwdata

Создаем симлинк на существующий файл:

ln -s /usr/share/misc/usb.ids /usr/share/hwdata/usb.ids

4. usbip err … recv op_common

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

usbip err: usbip_network.c: 121 (usbip_recv_op_common) recv op_common, -1
usbip err:       usbip.c: 216 (query_exported_devices) recv op_common
usbip err:       usbip.c: 288 (show_exported_devices) query

Причина: ошибка в бинарном файле для Windows.

Решение: открыть exe-файл в HEX редакторе, например, HxD. И в адресах смещения 00000CBC и 00000E0A заменить 06 на 11:

Редактирование exe — было

* было

Редактирование exe — стало

* стало

5. (attach_device) cannot find device

При попытке монтирования устройства в Windows, выскакивает ошибка с похожим текстом:

usbip err: usbip_windows.c: 829 (attach_device) cannot find device

Причина: недоработка серверного ПО — при расшаривании USB не считывается количество дескрипторов.

Решение: примонтировать устройство на сервере с последующим отмонтированием:

usbip attach –remote=localhost –busid=2-1.3

* в моем случае устройство имеет идентификатор 2-1.3.

usbip port

* смотрим номер порта, на котором висит наше примонтированное устройство. 

usbip detach –port=00

6. udev_device_new_from_subsystem_sysname failed

При попытке монтирования устройства на клиенте получаем ошибку с текстом:

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

Причина: не подключен модуль vhci-hcd.

Решение: разово выполняем команду:

modprobe vhci-hcd

и добавляем в файл /etc/modules строку vhci-hcd.