Коллеги, начиная с сегодняшней ревизии r2486 прошивка rtn поддерживает работу USB/IP, что позволяет, к примеру, печатать на принтерах, у которых нет в природе портированных на Linux драйверов.
В сегодняшней стадии проект USB/IP имеет ряд ограничений на работу с некоторыми составными USB-устройствами. Протестированы ряд USB-устройств. Успешно:
- USB-HDD. Скорость чтения и записи составила ~5,5МБ/с при загрузке CPU ~60%,
- Принтер Canon с драйверами CARPS,
- Bluetooth dongle D-Link DBT-122,
- Мышка.
Не завелись:
- USB-звуковая карта,
- 3G-модем ZTE MF626
Для того, чтобы использовать 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 демон собран в виде пакета.Code:insmod /lib/modules/2.6.22.19/usbip-core.ko insmod /lib/modules/2.6.22.19/usbip-host.ko usbip bind -b 2-1 usbipd -D
Можно подключить соответствующий репозиторий и больше не заботиться о его ручном обновлении.
Для этого необходимо добавить следующие строчки в файл /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:$ usbipd -D
нужное устройство пока не подключать, а посмотреть перечень устройств, которые можно экспортировать:
Единственное устройство 1-1 - это жёсткий диск роутера. Теперь подключаем нужное USB-устройство:Code:$ usbip_bind_driver --list List USB devices - busid 1-1 (04fc:0c25) 1-1:1.0 -> usb-storage
Видно, что теперь подключено устройство 2-2. Теперь необходимо сделать это устройство доступным на клиенте: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. Настройка клиента.Code:$ usbip_bind_driver --usbip 2-2
Клиент для Linux есть в пакетах большинства популярных дистрибутивов.
Клиента для Windows можно взять здесь. Далее на примере Windows.
2.1. Устанавливаем необходимый драйвер-перечислитель из файла USBIPEnum.inf. При успешной установке в диспетчере устройств должно появиться устройство "Virtual USB Bus Enumerator" в разделе "Системные устройства".
2.2. Работаем с userspace-частью. Любой запуск usbip.exe необходимо выполнять от имени пользователя с правами локального администратора.
Смотрим какие устройства экспортированы сервером:
Видим ранее экспортированное устройство 2-2. Теперь подключаем его: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)
После чего должен появиться диалог установки драйвера устройства, подключенного к роутеру. Устройство будет видно в диспетчере оборудования, будто оно подключено не к роутеру, а к windows-ПК. Запущенный процесс usbip.exe является маршрутизатором. Он необходим на всём протяжении использования USB-устройства. Не закрывайте окошко с запущенным usbip.exe!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
3. Завершение работы.
Чтобы завершить работу gracefully, необходимо перечисленные выше действия выполнить в обратном порядке.
3.1. На стороне клиента отключаем устройство, для чего в новом окне выполняем:
3.2. На стороне сервера (роутера) сначала отключаем драйвер USB/IP от USB устройства:Code:C:\usbip>usbip.exe -d 2-2
Затем останавливаем демона: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. Примечания.Code:$ killall usbipd
Можно сразу подключить нужное USB-устройство и сделать один раз usbip_bind_driver --list. Я это делаю дважды для того, чтобы не "отпилить сук, на котором сидишь". Один раз я случайно экспортировал свой USB-HDD роутера, тем самым моментально подменив модуль usb-storage модулем usbip при выполнении команды usbip_bind_driver --usbip 1-1. Нетрудно догадаться, что диск тут же стал недоступен.
Работа по допиливанию USB/IP всецело велась тов. theMIROn и lly, за что им низкий поклон.