вторник, 30 августа 2011 г.

Установка USB/IP на Ubuntu Server 11.04

Серверная часть



Ставим пакет:
$ 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")
}
}







2 комментария:

  1. NAME=usbip
    запускает клиентскую часть программы, для запуска серверной части должно быть
    NAME=usbipd

    ОтветитьУдалить
  2. А для ubuntu 13.04 можете написать ?
    4-й день мучаюсь уже -(((

    ОтветитьУдалить