LINUX.ORG.RU

Проброс USB по сети или как собрать usbip?

 , , ,


1

2

Нужно пробросить usb девайс по сети.
Ядро 3.2.0-26-generic-pae.

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

make[3]: Entering directory `/usr/src/linux-headers-3.2.0-25-generic-pae'                       
CC [M] /usr/src/modules/usbip/src/stub_dev.o
/usr/src/modules/usbip/src/stub_dev.c: In function 'stub_probe':
/usr/src/modules/usbip/src/stub_dev.c:392:42: error: 'struct device' has no member named 'bus_id'
make[4]: *** [/usr/src/modules/usbip/src/stub_dev.o] Error 1
make[3]: *** [_module_/usr/src/modules/usbip/src] Error 2
make[3]: Leaving directory `/usr/src/linux-headers-3.2.0-25-generic-pae'
make[2]: *** [default] Error 2
make[2]: Leaving directory `/usr/src/modules/usbip/src'
make[1]: *** [binary-modules] Error 2
make[1]: Leaving directory `/usr/src/modules/usbip'
make: *** [kdist_build] Error 2

Т.е сначала я просто поставил usbip и usbip-source.

Ошибка связана с тем, что в новых ядрах (до последних) этот модуль не поддерживали и он был в staging.
Судя по этой ветке:
https://bugs.launchpad.net/ubuntu/ source/usbip/ bug/898003
В дебиане уже сделали какие то фиксы.

Как сделать, чтобы оно работало?

★★★

https://bugs.launchpad.net/ubuntu/ source/linux/ bug/900384

Судя по тому, что описано в последнем посте в настоящий момент в ядре уже все нормально, но надо пересобрать бирарник или пропатчить.
Только вот чем патчить пока не совсем ясно.

winddos ★★★
() автор топика
Ответ на: комментарий от winddos

Ядро 3.2.0-26-generic-pae.

make[3]: Entering directory `/usr/src/linux-headers-3.2.0-25-generic-pae'

Уже и спросить нельзя, у тебя же конфиг ядра на лбу не написан.

uname -a покажи, а то неясно 25 или 26. И это 3.2.0.27.29 последнее вроде

anonymous
()
Ответ на: комментарий от anonymous

Да, обновил ядро и не заметил.
Но вообще понял кое что уже.

https://bugs.launchpad.net/ubuntu/ source/linux/ bug/900384
Теперь модули usbip называются usbip-core и usbip-host.
Скриптом собрано новые модули и удачно их загрузил.

Но появилась следующая проблема: не понятно как вообще отредиректить девайс.
Т.е вывод:

$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 003: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
Bus 002 Device 006: ID 09da:000e A4 Tech Co., Ltd
Bus 002 Device 005: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)
Bus 002 Device 007: ID 1687:0165 Kingmax Digital Inc.

$usbip_bind_driver --list
List USB devices
- busid 1-1 (8087:0024)
1-1:1.0 -> hub

- busid 2-1 (8087:0024)
2-1:1.0 -> hub

- busid 2-1.5 (0424:2514)
2-1.5:1.0 -> hub

- busid 2-1.7 (09da:000e)
2-1.7:1.0 -> usbhid

- busid 2-1.5.1 (0a12:0001)
2-1.5.1:1.0 -> btusb
2-1.5.1:1.1 -> btusb


- busid 2-1.8 (1687:0165)
2-1.8:1.0 -> usb-storage


Т.е если я пробую привязать девайс, то получаю вот что:

usbip_bind_driver --usbip 1-1.8

** (process:9015): WARNING **: read config and ninf value, removed?

** (process:9015): WARNING **: unbind drivers of 1-1.8, failed

winddos ★★★
() автор топика
Ответ на: комментарий от winddos

Если попбробовать «отвязать» хаб, то получается тоже самое:

$ usbip_bind_driver --usbip 2-1
** Message: skip unbinding of hub

** (process:20335): WARNING **: unbind drivers of 2-1, failed

winddos ★★★
() автор топика
Ответ на: комментарий от anonymous

Ну я не настолько туп чтобы запускать команды не от рута.

Только что после кучи ошибок оно как минимум отрубило хаб (мышка перестала работать), хотя ошибки были те же самые.
На другой машине слушать usbip не получается:


$ usbip -l 192.168.1.40
- 192.168.1.40
usbip err: usbip_network.c: 119 (usbip_recv_op_common) recv op_common, -1
usbip err: vhci_attach.c: 202 (query_exported_devices) recv op_common
usbip err: vhci_attach.c: 417 (show_exported_devices) query


Но это я понимаю из за того, что на втором сервере тоже надо чтото пересобрать?
Если что на другой машине выполнил modprobe vhci-hcd

winddos ★★★
() автор топика
Ответ на: комментарий от winddos

у меня для сервера написано:

sudo modprobe usbip
sudo modprobe usbip_common_mod
клиент там же запускался, список показывал (-l)

anonymous
()
Ответ на: комментарий от anonymous

Эти модули устарели, в новых ядрах другие :(

winddos ★★★
() автор топика

Выспавшись все стало чуть проще и нашел решение:
1 - Модули которые надо загружать это usbip-core и usbip-host для сервера и (как и в прошлых версиях) vhci-hcd для клиента.
2 - В текущем ядре вроде как есть нужные модули, но в большинстве репозиториев протухшая юзерспейсная часть, которая со свежими модулями не работает.
3 - Её надо обновить, я это сделал из случайно наденного PPA доброго человека:
https://launchpad.net/~whoopie79/ archive/ppa

Моя ошибка была в том, что пересобрав ядро(что судя по всему не надо было делать) я начал собирать юзерспейсную часть из хрен знает какого протухшего кода.
А запускается все просто, на сервере:
$ modprobe usbip-core
$ modprobe usbip-host
$ usbipd -D
$ usbip bind -b [busID, e.g 2-1.8]
На клиенте:
$ modprobe vhci-hcd
$ usbip attach -h [server ip] -b [busID, e.g 2-1.8]
В итоге нужный usb девайс будет восприниматься удаленной машиной как если бы он был подключен в неё.

Единственное что я пока не понял, это как быстро узнать busid девайса, т.к из свежей версии юзерспейса выпилили usbip_bind_driver (и команду --list), а в манах пока каша.
Буду благодарен если кто подскажет.

winddos ★★★
() автор топика
Ответ на: комментарий от winddos

Единственное что я пока не понял, это как быстро узнать busid девайса

lsusb или hwinfo там где подключено устройство?

anonymous
()
Ответ на: комментарий от anonymous

Не получится, busid, как ни странно, не совпадают (хотя какая-то зависимость должна быть)

Kiborg ★★★
()
Ответ на: комментарий от winddos

Спасибо за решение, сам недавно развлекался с той же игрушкой.

По-моему там не usbip_bind_driver, а просто bind_driver.. Или что-то подобное. Посмотри список установленных файлов для этого пакета, там их всего штук 5 должно быть.

Kiborg ★★★
()
Ответ на: комментарий от anonymous

В lsusb нет.

Сейчас посомтрел по dmesg, там есть.
Но в hwinfo так же есть.

winddos ★★★
() автор топика
Ответ на: комментарий от winddos

Ответил в той теме, в кратце: не встречал пока чего-нибудь похожего.

Интересно, кто выпилил usbip_bind_driver, и какой версии usbip в репах Whoopie? На SF последняя линуксовая датируется 2009 годом и имеет номер 0.1.7. В убунтовских дефолтных репах ставилась как раз такая, если не путаю.

Kiborg ★★★
()
Ответ на: комментарий от anonymous

В ядре от него ядреные модули только. Юзерспейсные программы на git.kernel.org вроде никто пока не выкладывал.

Kiborg ★★★
()
Ответ на: комментарий от winddos

Здравствуйте. Очень рад, что нагуглил этот топик. Благодарен всем участникам. Разобрался во всём, но работы тестового устройства так и не удалось добиться.

Сервер на VirtualBox. Ubuntu 12.04 c ядром 3.2.0-23-generic. Пакет с юзерспейсными утилитами тянул с найденного winddos PPA. Сервер поднялся с пол-пинка. Подключил модули:

~$ lsmod | grep usbip
usbip_host             22526  0 
usbip_core             15904  1 usbip_host
Запустил демона. Забиндил нужный девайс. Вот что выводит:
~$ sudo usbip list -l
Local USB devices
=================
 - busid 1-1 (8564:1000)
         1-1:1.0 -> usbip-host

 - busid 1-2 (03f0:4717)
         1-2:1.0 -> usblp

Теперь на счёт клиентов. Первым тестировал виндовый клиент на двух компах Win7 x86 и Win7 x86-64 (это по совместительству и хост для виртуалок) после вроде бы удачной установки отказывается работать с такими ошибками:

>usbip -D -l 192.168.10.110
usbip dbg: usbip_network.c: 223 (tcp_connect ) trying 192.168.10.110 port 3240

usbip dbg: usbip_network.c: 243 (tcp_connect ) connected to 192.168.10.110:3240
- 192.168.10.110
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
Как видно ошибки те же... Не подключает примерно с такими же ошибками:
usbip dbg: usbip_network.c: 223 (tcp_connect ) trying 192.168.10.110 port 3240

usbip dbg: usbip_network.c: 243 (tcp_connect ) connected to 192.168.10.110:3240
usbip err: usbip_network.c: 121 (usbip_recv_op_common) recv op_common, -1
usbip err: usbip_windows.c: 756 (query_interface0) recv op_common
usbip err: usbip_windows.c: 829 (attach_device) cannot find device

Попробовал запустить с liveCD ubuntu 12.04. Утилиты ставил оттуда же. Модуль подключил. Список оно получает:

~$ sudo usbip --debug list -r 192.168.10.110
usbip: debug: usbip.c:134:[run_command] running command: `list'
usbip: debug: usbip_list.c:140:[list_exported_devices] connected to 192.168.10.110:3240
usbip: debug: usbip_list.c:78:[get_exported_devices] exportable devices: 1

Exportable USB devices
======================
 - 192.168.10.110
        1-1: unknown vendor : unknown product (8564:1000)
           : /sys/devices/pci0000:00/0000:00:0b.0/usb1/1-1
           : (Defined at Interface level) (00/00/00)
           :  0 - Mass Storage / SCSI / Bulk-Only (08/06/50)
Но как дело доходит до подключения:
~$ sudo usbip --debug attach -h 192.168.10.110 -b 1-1
usbip: debug: usbip.c:134:[run_command] running command: `attach'
usbip: debug: usbip_network.c:165:[usbip_net_recv_op_common] request failed at peer: 1
usbip: error: recv op_common
usbip: error: query

Даже и не знаю, что делать..

OEvgeny
()
Ответ на: комментарий от OEvgeny

Первым тестировал виндовый клиент на двух компах Win7 x86 и Win7 x86-64

Откуда ты брал клиент для винды? Сам собирал или как?

Попробовал запустить с liveCD ubuntu 12.04. Утилиты ставил оттуда же. Модуль подключил

Тут надо перепроверить, те ли юзерспейсные утилы на этом хосте или нет.
Т.к на хосте к которому ты подключаешь девайс они тоже должны быть свежие.
Я сам когда делал на это напоролся.

У меня работает так:
1 - Сервер (мой десктоп) на Ubuntu 12.04, 32 битное ядро с PAE.
2 - Клиент (аля качалка торрентов) тоже на Ubuntu 12.04 с 32 битным ядром.

winddos ★★★
() автор топика
Ответ на: комментарий от winddos

Есть прогресс.

Сам не собирал. Взял с офф. сайта. Действительно как оказалось, несовместимость версий.

Не понятно почему в ubuntu проблемы. Там даже ядра очень близких версий. А утилиты вообще из одного репозитория скачены. В конечном итоге выяснилось, что не подцепляется только первое устройство 1-1, что ещё страннее. При попытке пробросить 1-2 клиент завис, но ошибок среди прочего дебага не было. Скорее всего машина зависла из-за каких-то внутренних проблем virtualbox, так как клиент и сервер на одном хосте оба под виртуалками. Но мне нужна бы новая виндовая версия или хотя бы старая, но чтобы везде ездило. Всё, что пока нашёл, вот это: https://github.com/spurious/usbip-windows-mirror Вроде как раз нужная мне штука. Высплюсь, попробую собрать.

Немного лирики. Самое печальное, что не выйдет просто взять и так сказать купить USB over Network. Целевая платформа сервера - ARM. Вообще не уверен, что такой финт ушами пройдёт там, но других путей пока не вижу. Идея очень нравится чтобы просто её бросить. :)

OEvgeny
()
Ответ на: Есть прогресс. от OEvgeny

Целевая платформа сервера - ARM

Вот это интересно! Отпишитесь потом о результатах, пожалуйста. Мне ни к чему, у меня нет устройств, на которых подобное могло бы понадобиться, но мало ли кому пригодится.

Kiborg ★★★
()
Ответ на: Есть прогресс. от OEvgeny

внутренних проблем virtualbox, так как клиент и сервер на одном хосте оба под виртуалками

Возможно проблема действительно из за виртуалок.
Т.к сам виртуалбокс имеет функции проброса usb в виртуалку, и возможно где то сломана совместимость с usbip.

Целевая платформа сервера - ARM. Вообще не уверен, что такой финт ушами пройдёт там, но других путей пока не вижу.

Ну я тогда тоже могу потестить, т.к сам хочу заюзать её для Raspberry Pi :)

winddos ★★★
() автор топика
Ответ на: комментарий от winddos

Пока удалось собрать и установить лишь драйвера для виндов (из гит). Не могу разобраться с компиляцией usbip.exe В driver/README всё предельно просто (написано мол, запустить make в этой папке :) ), но при запуске:

$ make
make: *** Нет правила для сборки цели `usbip.c', требуемой для `output/usbip.exe'.  Останов.
При сборке юзерспейса для linux тоже не всё гладко:
$ ./autogen.sh 
+ autoreconf -i -f -v
Can't exec "libtoolize": Нет такого файла или каталога at /usr/bin/autoreconf line 196.
Use of uninitialized value in pattern match (m//) at /usr/bin/autoreconf line 196.
autoreconf: Entering directory `.'
autoreconf: configure.ac: not using Gettext
autoreconf: running: aclocal --force 
autoreconf: configure.ac: tracing
autoreconf: configure.ac: not using Libtool
autoreconf: running: /usr/bin/autoconf --force
autoreconf: running: /usr/bin/autoheader --force
autoreconf: running: automake --add-missing --copy --force-missing
libsrc/Makefile.am:5: Libtool library used but `LIBTOOL' is undefined
libsrc/Makefile.am:5:   The usual way to define `LIBTOOL' is to add `LT_INIT'
libsrc/Makefile.am:5:   to `configure.ac' and run `aclocal' and `autoconf' again.
libsrc/Makefile.am:5:   If `LT_INIT' is in `configure.ac', make sure
libsrc/Makefile.am:5:   its definition is in aclocal's search path.
autoreconf: automake failed with exit status: 1
LT_INIT конечно же есть в configure.ac. Опыт сборки у меня не большой... Опять тупичок.

OEvgeny
()
Ответ на: комментарий от OEvgeny

Под линукс утилиты оттуда не собираются, да и по видимому не должны. А вот под винду требуется собрать usbip.exe в линуксе. С этим собственно проблемы. Думается мне ошибка в GNUmakefile.

.PHONY: clean all
#CC:=i586-mingw32msvc-gcc
#LD:=i586-mingw32msvc-ld
#STRIP:=i586-mingw32msvc-strip
CC=gcc
LD=ld
STRIP=strip
ALL_TARGET:=output/usbip.exe #driver.sys
all:$(ALL_TARGET)
source:=busenum.c buspdo.c pnp.c power.c Wmi.c
usbip_source:=usbip.c usbip_network.c usbip_common.c usbip_vbus_ui.c
usbip_include:=public.h usbip_protocol.h usbip_network.h usbip_common.h usbip_vbus_ui.h win_stub.h
output/usbip.exe:$(usbip_source) $(usbip_include)
	$(CC) -Wall -o $@ $(usbip_source) -lsetupapi -lws2_32 
driver.sys:$(source) busenum.h driver.h public.h
	$(CC) -D__USE_DIRECT__ -DDBG -Wall -Wl,-subsystem,native -Wl,-entry,_DriverEntry@8 -shared -nostartfiles -nostdlib -o $@ $(source) -lntoskrnl
#	$(LD) entry.o functions.o -mdll --subsystem,native --image-base=0x10000 --file-alignment=0x1000 --section-alignment=0x1000 --entry=_DriverEntry -nostartfiles -nostdlib -L/usr/i586-mingw32msvc/lib/ -lntoskrnl -o $@
#	$(STRIP) $@
clean:
	rm -f $(ALL_TARGET)
cscope:
	cscope -b -I/usr/i586-mingw32msvc/include -I/usr/i586-mingw32msvc/include/ddk

У меня видимо какой-то другой make, нежели у автора. (Ошибка такая же как выше, «Нет правила для сборки цели»). Хотя правило-то вроде как и есть..

OEvgeny
()
Ответ на: комментарий от OEvgeny

А файлы там какие есть? Такое впечатление, что самого файла usbip.c нет, и make не знает откуда его взять, поэтому ищет правило для его создания, но такого правила тоже нет.

Kiborg ★★★
()
Ответ на: комментарий от Kiborg

Уже смотрел, но верно. Сейчас перепроверил - файла в папке нет. Вообще у меня сложилось ощущение, что эта штука уже не собирается. Но если бы удалось собрать, было бы здорово. Сейчас переместил все исходники в одну папку, теперь не может найти win_stub.h. Впрочем и я найти нигде не смог. Пишет то же самое.

Продолжаю копаться с ARM. Собрал подобие эмулятора для RPi. Работает. Вчера посмотрел на Rasperrian. Версия ядра, что-то вроде 3.1.9+. Модулей usbip-* нет. Как выдастся минутка скорее всего попробую пересобрать ему ядро.

OEvgeny
()
Ответ на: комментарий от OEvgeny

Напиши тогда здесь о результатах.
У меня руки не доходят этим заняться, но вообще информация нужна.

winddos ★★★
() автор топика
Ответ на: комментарий от winddos

Напишу если получится. Сейчас не удаётся заставить собираться ядро со своим конфигом. Дописываю в конец .config:

CONFIG_USBIP_CORE=m
CONFIG_USBIP_VHCI_HCD=m
CONFIG_USBIP_HOST=m
CONFIG_USBIP_DEBUG=n
После сборки из конфига эти строки магическим образом исечзают. Пробовал брать cutdown_defconfig
cp arch/arm/configs/bcmrpi_cutdown_defconfig .config 
И дописывать туда. Всё одно - после:
make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- menuconfig 
или непосредственно сборки:
make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- -k
Эти строчки пропадают и потом естественно собираться модули не хотят. Сборку модулей запускал вот так:
make SUBDIRS=drivers/staging/usbip

OEvgeny
()
Ответ на: lmgfy от winddos

ohshi~ Вы явно гуглите лучше меня :) Спасибо. Пока что протестировал на x86-64. Из под виртуалки на хостовую винду пробрасывается на ура. Правда скорость у меня вышла ~3 Мб/с, против ~30 если подключить в обход виртуальной машины. Да и жадная она. Из линукса под винду за бесплатно прокидывать нельзя. Ушёл пробовать под эмулятором.

OEvgeny
()
Ответ на: комментарий от Kiborg

Про USB Redirector. На эмуляторе при установке USB Redirector столкнулся с проблемой. Модули собрались, всё установилось, даже демон стартует. Но сам модуль не стартует.. Пробовал выполнить insmod получаю ошибку, мол неправильный формат модуля.

То что написано там на счёт usbip, конечно верно. Можно собрать ядро на RPi. И по-идее это точно должно сработать, но вот выполнять сборку под эмулятором мне совсем не хочется. К тому же своё ядро я уже собрал. Осталось побороть только магию с конфигами.

OEvgeny
()
Ответ на: комментарий от Jeckdigger

Есть вопрос: При просмотре проброшенных USB устройств в листинге выдается их номера. Есть способ перенаприть вывод в файл или провеости фильрацию дабы получить только номера USB устройств. Фильтры вроде grep, awk не работают, перенаправить в файл тоже не удалось.

# usbip -l 192.168.0.252
- 192.168.0.252
 2-2.1.1: Huawei Technologies Co., Ltd. : E169/E620/E800 HSDPA Modem (12d1:1001)
        : /sys/devices/pci0000:00/0000:00:1d.7/usb2/2-2/2-2.1/2-2.1.1
        : (Defined at Interface level) (00/00/00)
        :  0 - Vendor Specific Class / Vendor Specific Subclass / Vendor Specific Protocol (ff/ff/ff)
        :  1 - Vendor Specific Class / Vendor Specific Subclass / Vendor Specific Protocol (ff/ff/ff)
        :  2 - Vendor Specific Class / Vendor Specific Subclass / Vendor Specific Protocol (ff/ff/ff)
 
   2-2.2: Huawei Technologies Co., Ltd. : E169/E620/E800 HSDPA Modem (12d1:1001)
        : /sys/devices/pci0000:00/0000:00:1d.7/usb2/2-2/2-2.2
        : (Defined at Interface level) (00/00/00)
        :  0 - Vendor Specific Class / Vendor Specific Subclass / Vendor Specific Protocol (ff/ff/ff)
        :  1 - Vendor Specific Class / Vendor Specific Subclass / Vendor Specific Protocol (ff/ff/ff)
        :  2 - Vendor Specific Class / Vendor Specific Subclass / Vendor Specific Protocol (ff/ff/ff)

Jeckdigger
()
Ответ на: комментарий от Jeckdigger

Не факт, у меня хаб китайский цеплялся.

winddos ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.