Коллеги, начиная с сегодняшней ревизии r2486 прошивка rtn поддерживает работу USB/IP, что позволяет, к примеру, печатать на принтерах у которых нет в природе портированных на Linux драйверов.
В сегодняшней стадии проект USB/IP имеет ряд ограничений на работу с некоторыми составными USB-устройствами. Кроме того, для Windows клиентская часть существует в исключительно 32-разрядной версии. Протестированы ряд USB-устройств. Успешно:
- USB-HDD. Скорость чтения и записи составила ~5,5МБ/с при загрузке CPU ~60%,
- Принтер Canon с драйверами CARPS,
- Bluetooth dongle D-Link DBT-122,
- Мышка.
Не завелись:
Для того, чтобы использовать USB/IP необходимо настроить серверную часть на роутере и клиентскую на том ПК, где интересна работа подключенного к роутеру USB-устройства.
1. Настройка серверной части.
Серверная часть состоит из двух модулей ядра и userspace демона.
1.1. Модули ядра USB/IP находятся в архиве модулей прошивки modules-1.9.2.7-rtn-rХХХХ.tgz. Необходимо их извлечь на роутер и подгрузить:
Code:
$ cd /opt
$ wget ftp://core.dumped.ru/rt-n/2486/modules-1.9.2.7-rtn-r2486.tar.gz
$ tar -xzvf ./modules-1.9.2.7-rtn-r2486.tar.gz
$ modprobe usbip
1.2. Userspace демон собран в виде пакета. Можно подключить соответствующий репозиторий и больше не заботиться о его ручном обновлении. Для этого необходимо добавить следующие строчки в файл /opt/etc/ipkg.conf
Code:
src/gz wl500g-d http://wl500g.googlecode.com/svn/ipkg/optware-d
src/gz wl500g-optware http://wl500g.googlecode.com/svn/ipkg/optware
и выполнить установку демона:
Code:
$ ipkg install usbip
Запуск серверной части:
Далее необходимо посмотреть список подключенных устройств. В целях предосторожности рекомендую нужное устройство пока не подключать, а посмотреть перечень устройств, которые можно экспортировать:
Code:
$ usbip_bind_driver --list
List USB devices
- busid 1-1 (04fc:0c25)
1-1:1.0 -> usb-storage
Единственное устройство 1-1 - это жёсткий диск роутера. Теперь подключаем нужное USB-устройство:
Code:
$ usbip_bind_driver --list
List USB devices
- busid 2-2 (2001:f111)
2-2:1.0 -> none
2-2:1.1 -> none
2-2:1.2 -> none
- busid 1-1 (04fc:0c25)
1-1:1.0 -> usb-storage
Видно, что теперь подключено устройство 2-2. Теперь необходимо сделать это устройство доступным на клиенте:
Code:
$ usbip_bind_driver --usbip 2-2
2. Настройка клиента.
Клиент для Linux есть в пакетах большинства популярных дистрибутивов. Для использования на Windows есть только 32-битный клиент. Далее на примере Windows.
2.1. Устанавливаем необходимый драйвер-перечислитель из файла bus.inf. При успешной установке в диспетчере устройств должно появиться устройство "Virtual USB Bus Enumerator" в разделе "Системные устройства".
2.2. Работаем с userspace-частью.
Смотрим какие устройства экспортированы сервером:
Code:
C:\usbip>usbip.exe -l 192.168.0.1
usbip dbg: usbip_network.c: 229 (tcp_connect ) trying 192.168.0.1 port 3240
usbip dbg: usbip_network.c: 249 (tcp_connect ) connected to 192.168.0.1:3240
- RTRouter
usbip dbg: usbip.c: 423 (query_exported_devices) exportable 1 devices
2-2: unknown vendor : unknown product (2001:f111)
: /sys/devices/pci0000:00/0000:00:04.0/usb2/2-2
: unknown class / unknown subclass / unknown protocol (e0/01/01)
: 0 - unknown class / unknown subclass / unknown protocol (e0/01/01)
: 1 - unknown class / unknown subclass / unknown protocol (e0/01/01)
: 2 - unknown class / unknown subclass / unknown protocol (ff/ff/ff)
Видим ранее экспортированное устройство 2-2. Теперь подключаем его:
Code:
C:\usbip>usbip.exe -a 192.168.0.1 2-2
usbip dbg: usbip_network.c: 229 (tcp_connect ) trying 192.168.0.1 port 3240
usbip dbg: usbip_network.c: 249 (tcp_connect ) connected to 192.168.0.1:3240
usbip dbg: usbip.c: 147 (query_interface0) exportable 1 devices
usbip dbg: usbip.c: 164 (query_interface0) 2-2: unknown vendor : unknown product (2001:f111)
usbip dbg: usbip.c: 165 (query_interface0) : /sys/devices/pci0000:00/0000:00:04.0/usb2/2-2
usbip dbg: usbip.c: 166 (query_interface0) : unknown class / unknown subclass / unknown protocol (e0/01/01)
usbip dbg: usbip.c: 186 (query_interface0) : 0 - unknown class /unknown subclass / unknown protocol (e0/01/01)
usbip dbg: usbip.c: 186 (query_interface0) : 1 - unknown class /unknown subclass / unknown protocol (e0/01/01)
usbip dbg: usbip.c: 186 (query_interface0) : 2 - unknown class /unknown subclass / unknown protocol (ff/ff/ff)
usbip dbg: usbip.c: 189 (query_interface0)
usbip dbg: usbip_network.c: 229 (tcp_connect ) trying 192.168.0.1 port 3240
usbip dbg: usbip_network.c: 249 (tcp_connect ) connected to 192.168.0.1:3240
call from attch here
return from attch here
devfd:0022FF0C
new usb device attached to usbvbus port 1
После чего должен появиться диалог установки драйвера устройства, подключенного к роутеру. Устройство будет видно в диспетчере оборудования, будто оно подключено не к роутеру, а к windows-ПК
. Запущенный процесс usbip.exe является маршрутизатором. Он необходим на всём протяжении использования USB-устройства. Не закрывайте окошко с запущенным usbip.exe!
3. Завершение работы.
Чтобы завершить работу gracefully, необходимо перечисленные выше действия выполнить в обратном порядке.
3.1. На стороне клиента отключаем устройство, для чего в новом окне выполняем:
Code:
C:\usbip>usbip.exe -d 2-2
3.2. На стороне сервера (роутера) сначала отключаем драйвер USB/IP от USB устройства:
Code:
$ usbip_bind_driver --other 2-2
** (process:385): DEBUG: write "del 2-2" to /sys/bus/usb/drivers/usbip/match_busid
** Message: bind 2-2 to other drivers than usbip, complete!
Затем останавливаем демона:
4. Примечания.
Можно сразу подключить нужное USB-устройство и сделать один раз usbip_bind_driver --list. Я это делаю дважды для того, чтобы не "отпилить сук, на котором сидишь". Один раз я случайно экспортировал свой USB-HDD роутера, тем самым моментально подменив модуль usb-storage модулем usbip при выполнении команды usbip_bind_driver --usbip 1-1. Нетрудно догадаться, что диск тут же стал недоступен.
64-битного драйвера под Windows пока лучше не ждать. 32-битные исходники доступны, но их тупая перекомпиляция ведёт к BSOD!
Работа по допиливанию USB/IP всецело велась тов. theMIROn и lly, за что им низкий поклон.