Серверная часть
Ставим пакет:
$ sudo apt-get install usbip
Добавляем необходимые модули ядра в автозапуск:
$ sudo nano /etc/modules
...
usbip
usbip_common_mod
...
Добавляем демона в автозапуск:
$ sudo cp /etc/init.d/skeleton /etc/init.d/usbipd
$ sudo nano /etc/init.d/usbipd
...
DESC="USBIP daemon"
NAME=usbipd
...
DAEMON_ARGS="-D"
...
$ sudo chmod 755 /etc/init.d/usbipd
$ sudo update-rc.d usbipd defaults
Перезагрузимся (хотя это и не обязательно, т.к. можно вручную запустить модули и демона)
$ sudo shutdown -r now
Чтобы посмотреть какие модули загружены в системе:
$ lsmod
Чтобы посмотреть текущие процессы:
$ ps aux
Подсоединяем наше устройство и смотрим какой у него Vendor/Device ID:
$ lsusb
Теперь по этому Vendor/Device ID выясняем позицию на шине:
$ sudo usbip_bind_driver --list
Даем доступ к устройству:
$ sudo usbip_bind_driver --usbip 3-1
Клиентская часть (Windows)
Качаем клиента -
http://sourceforge.net/projects/usbip/files/usbip_windows/Распаковываем в удобное место. Устанавливаем вручную драйвер.
Смотрим какие устройства доступны на нашем сервере:
C:\usbip\usbip.exe -l <server_ip>
Подключаем нужное устройство:
C:\usbip\usbip.exe -a <server_ip> <USB-ID>
Можно сделать этого службу. Качаем - http://runasservice.com/Download/. Кладем в определенную папку, где программа будет теперь жить. После чего создаем сервис:
C:\>C:\RunAsService\runasservice.exe install "USBIPKey" "C:\USBIP\usbip.exe" "-a <server_ip> <USB-ID>"
Та реализация была "неочень". Появилась идейка получше:Для автоматизации подключения устройств в "Планировщике заданий" каждые 5 минут запускается скрипт, который проверяет запущены ли нужные соединения.
Для отправки команд на сервер понадобится
plink.exe из состава
PuTTY.
На сервере, чтобы
sudo
не спрашивал пароль, нужно поправить файл
sudoers
:
$ sudo visudo
...
usbadmin ALL=NOPASSWD:/usr/sbin/usbip_bind_driver
Запись лучше добавлять в самый конец, т.к. приоритет у правил по порядку следования.
Сам скрипт на PowerShell:
#usbip client autoconnect script
#v 0.2.1
$usbipExePath = "C:\usbip\usbip.exe"
$plinkExePath = "C:\usbip\plink.exe"
$usbServerIp = "192.168.16.61"
$usbDevices = @("3-1")
$processes = Get-WmiObject Win32_Process -Filter "Name like '%usbip%'" | select-Object CommandLine
foreach ($device in $usbDevices) {
$deviceIsConnected = $false
foreach ($process in $processes) {
if ($process -match " -a $usbServerIp $device") {
$deviceIsConnected = $true
}
}
if ($deviceIsConnected -eq $false) {
#reexport device on USBIP-host
[Diagnostics.Process]::Start("$plinkExePath","-ssh -pw pa$$w0rd usbadmin@$usbServerIp sudo usbip_bind_driver --other $device;sudo usbip_bind_driver --usbip $device")
Start-Sleep -Seconds 10
#reconnect device on USBIP-client
[Diagnostics.Process]::Start("$usbipExePath","-a $usbServerIp $device")
}
}