пятница, 11 марта 2016 г.

Аналог AnywhereUSB на Rasberry PI или USB over IP.

Сегодняшний пост будет немного сумбурным (так как уже далеко за полночь, а над этим решением я работаю где-то с 18:00, поэтому голова уже кругом) и речь в нем пойдет о пробросе USB через IP, т.е. о создании аппаратного аналога вот такой "коробки" - AnywhereUSB /2. Принцип работы ее как вы понимаете крайне простой, это USB-хаб, который "расшаривает" USB устройства через Ethernet. Т.е. на другой стороне ПК со специальным установленным ПО, которое создает виртуальный USB-хаб и видит физически подключенные к USB на другой стороне девайсы.

Для тестовой реализации своей "коробки" мной был взят Raspberry Pi, а также дистрибутив Raspbian Jessie (2016-02-26, Kernel 4.1), в качестве реализации USB-сервера я решил попробовать решение USB Redirector от Incentives Pro. Вот тут-то и начинается самое интересное. Исходные данные, т.е. само железо и софт планируемый к использованию у нас есть, осталось все это дело только настроить. Ядро 4.1 по-умолчанию USB Redirector for Linux не поддерживается, более того, при попытке собрать версию выложенную на странице Downloads под Raspbian Jessie мы получаем ошибки при компиляции, часть из которых можно устранить, часть - нет. Поэтому сразу скажу, что если собирать под Raspbian Jessie, то надо брать не ту версию которая выложена на странице Downloads, а beta'у - usb-redirector-linux-3.4-arm.tar.gz (на понимание этого простого факта у меня ушел не один час). Ну да ладно, приступим.

Качаем дистрибутив Raspbian Jessie - 2016-02-26-raspbian-jessie.zip (по ссылке будет отдаваться последний дистрибутив) и распаковываем его. Также сразу берем Win32 Disk Imager для записи образа на SD. Далее вставляем microSD в кардридер, запускаем Win32 Disk Imager и записываем образ на microSD, здесь ничего сложного нет:


После того как все запишется, вставляем microSD в Raspberry Pi, подключаем к нему питание и Ethernet и ждем пока он загрузится:


Естественно что в вашей сети должен быть DHCP сервер, чтобы при загрузке Raspberry Pi получил адрес. Думаю что все знают где и как посмотреть DHCP Leases на своем маршрутизаторе, чтобы определить какой именно IP получил мини-ПК. В моем случае это был 172.17.111.50. Берем Putty n подключаемся к Raspberry Pi через SSH.

Логин: pi
Пароль: raspberry

Да, забыл сказать, что флешку я взял на 16 Gb и после развертывания образа с помощью Win32 Disk Imager файловая система Raspbian занимает не весь объем флешки, более того, по-умолчанию 97% ФС считается занятой. Поэтому первое что мы делаем после того как залогинились в консоль это sudo raspi-config и уже там делаем Expand Filesystem:


После чего перезагружаемся и смотрим с помощью df свободное место. для 16 Gb SD должно получиться что-то вроде этого:

pi@raspberrypi:~ $ df
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/root       15186136 3418152  11095712  24% /
devtmpfs          218416       0    218416   0% /dev
tmpfs             222688       0    222688   0% /dev/shm
tmpfs             222688    4552    218136   3% /run
tmpfs               5120       4      5116   1% /run/lock
tmpfs             222688       0    222688   0% /sys/fs/cgroup
/dev/mmcblk0p1     61384   20328     41056  34% /boot
tmpfs              44540       0     44540   0% /run/user/1000
Дальше мы смотрим версию ядра с помощью uname -vr , у меня это была 4.1.18+ #846 Thu Feb 25 14:11:56 GMT 2016 и в любом случае выполняем обновление с помощью sudo rpi-update, чтобы ядро у вас было той же версии что и на Git'е ... потому что если это будет не так - потом можно наступить на такие грабли при компиляции модулей ядра, что "с непривычки" будет просто не разобрать (это как раз то на чем я потерял кучу времени, поэтому обновляем ОС сразу):

После обновления обязательно перезагружаемся - sudo reboot . Далее делаем следующие вещи:

uname -vr - проверяем обновилось ли ядро, у меня обновилось и версия стала 4.1.19+ #853 Wed Mar 9 18:04:48 GMT 2016, т.е. как на GitHub.
sudo apt-get update - обновляем базу пакетов, естественно доступ к интернет для Raspberry Pi у нас должен быть обеспечен на маршрутизаторе, к которому он подключен.
cd ~ - перемещаемся в /home/pi
wget http://www.incentivespro.com/usb-redirector-linux-3.4-arm.tar.gz - качаем исходники USB Redirector for Linux
tar -xzvf usb-redirector-linux-3.4-arm.tar.gz - распаковываем их

Теперь готовим сырца ядра и все необходимое для сборки:

sudo apt-get install libncurses-dev - на запрос отвечаем Y, в результате установятся два пакета libncurses5-dev и libtinfo-dev
cd /usr/src
sudo git clone --depth 1 https://github.com/raspberrypi/linux.git - клонируем репу с исходниками ядра с глубиной в 1 commit
sudo ln -s linux linux-$(uname -r) - создаем символические ссылки, необходимые для того чтобы make при сборке USB Redirector for Linux знал откуда брать исходники.
sudo ln -s /usr/src/linux /lib/modules/$(uname -r)/build
cd linux
sudo wget https://raw.githubusercontent.com/raspberrypi/firmware/master/extra/Module.symvers - качаем Module.symvers из репы, без него модуль ядра tusbd.ko будет собираться криво, вернее собираться-то он будет, но вот запускаться не очень ;) На это тоже можно убить много времени, если не знать что и как. 
sudo wget https://raw.githubusercontent.com/raspberrypi/firmware/master/extra/Module7.symvers - в итоге файлы Module.symvers и Module7.symvers должны оказаться у вас в /usr/src/linux. Наверняка собрав все модули ядра через sudo make modules эти файлы сгенерируются автоматически (да поправят меня Linux'оиды, если это не так), но т.к. сборка всех модулей на Rasberry Pi идет чересчур долго, то дожидаться окончания сборки я не стал.


Теперь нам нужно сгенерировать конфиг - .config, сделать это можно как запуском sudo make menuconfig , так и sudo make bcm2709_defconfig. Я же сделал это немного по-другому:

sudo modprobe configs
sudo cp /proc/config.gz /usr/src/linux
cd /usr/src/linux
sudo gunzip config.gz
sudo mv config .config

В результате в /usr/src/linux у меня появился заветный .config. Далее делаем следующее:

sudo make prepare
sudo make modules_prepare

Процесс занимает несколько минут, так что как нам писали когда-то во время установки одной из популярных ОС, расслабьтесь и откиньтесь на спинку кресла. Необходимые приготовления к компиляции модулей ядра уже происходят. После того как завершится выполнение последней команды можно переходить непосредственно к компиляции USB Redirector for Linux:

cd ~/usb-redirector-linux-arm/ - переходим в каталог с распакованными сырцами
sudo /usr/local/usb-redirector/uninstall.sh uninstall - удаляем предыдущую версию, если вы вдруг уже ее уже компилировали, но что-то пошло не так
sudo ./installer.sh install-server - собираем ... в процессе собирается модуль ядра

И если все успешно, то мы видим примерно следующее:


Если же сборка неудачна - то изучаем buildlog.txt, если же модуль собрался, но не запускается - внимательно смотрим в /var/log/kern.log .

Перезагружаем Rasberry Pi - sudo reboot ... и смотрим запустился ли модуль с помощью lsmod :


Как видно, у меня модуль tusbd успешно запустился и присутствует в списке. Можно даже посмотреть modinfo по нему, с помощью modinfo /usr/local/usb-redirector/bin/tusbd.ko . Вообще проверить запускается ли собранный модуль можно было сразу, с помощью sudo insmod /usr/local/usb-redirector/bin/tusbd.ko , а потом lsmod, т.е. без перезагрузки, если бы не запустился, то в /var/log/kern.log мы увидели бы соответствующее сообщение, например:

[ 6234.131368] tusbd: disagrees about version of symbol module_layout
...
[   96.276453] tusbd: Unknown symbol _raw_spin_lock_irqsave (err 0)
[   96.276511] tusbd: Unknown symbol _raw_spin_lock (err 0)
[   96.276736] tusbd: Unknown symbol _raw_spin_unlock_irqrestore (err 0)


Если вы увидели такое у себя, то значит версия исходников которую вы брали не соответствует вашей версии ядра, или у вас файл Module.symvers не соответствует версии исходников. У меня подобные ошибки были на протяжении нескольких часов ;) Это в мануале все красиво и гладко получается, ну да на то он и мануал.

Теперь настало время прочитать help по самому USB Redirector Server'у. Выполняем:

/usr/local/usb-redirector/bin/usbsrv

И внимательно читаем. Теперь я вставлю в Rasberry Pi обычную USB Flash Kingston и мы попробуем посмотреть список устройств, которые можно "расшарить":

/usr/local/usb-redirector/bin/usbsrv -l

================= USB SERVER OPERATION SUCCESSFUL ===============
List of local USB devices:

   1: USB Device vendor_id 0x0424 - product_id 0xec00
      Vid: 0424   Pid: ec00   Port: 1-1.1
      Status: plugged

   2: DataTraveler 2.0 Kingston USB Mass Storage Device (s/n: 0014780************A006C)
      Vid: 0951   Pid: 1603   Port: 1-1.5
      Status: plugged

===================== ======================= ===================

Как видно флешка у нас имеет ID=2, расшарим ее:

/usr/local/usb-redirector/bin/usbsrv -s 2

В ответ мы должны получить ответ, что Operation Successful и USB device has been shared. Что же, самое время установить клиент для USB Redirector, в моем случае это будет клиент под ОС Windows XP и посмотреть как ОС увидит "расшаренное устройство":


А увидела она его без каких-либо проблем, как будто флешка непосредственно была подключена к этому ПК.

p.s. Ну а теперь давайте рассмотрим стоимость полученного решения. Я буду исходить из того что Rasberry Pi у нас был приобретен заранее (поэтому его стоимость я не учитываю, хотя это и можно было бы сделать). Изначально решение [ Rasberry Pi + USB Redirector for Linux ] предлагалось как альтернатива AnywhereUSB/2, стоимость которого сейчас составляет 23 219 pуб. (~330 USD), стоимость же лицензии на USB Redirector Client v6 Single License (for 1 Linux USB server) и те же 2 USB устройства составляет 69.99 USD. Rasberry Pi же стоит в районе 4000 руб. Итого получаем - 23219 руб., против ~9000 руб. А на выходе примерно такая же "коробочка". Правда вот стабильность работы того или иного решения еще предстоит проверить, а в случае с AnywhereUSB/2, к сожалению, я этого сделать не могу по причине его отсутствия.

Плюс, в связке Rasberry Pi + USB Redirector for Linux есть некоторые подводные камни. Так, например, USB-флешка, USB-модем Huawei успешно увиделись у меня на другом конце. А вот такое специфическое устройство как ридер смарткарт - EMV Smartcard Reader Generic USB Chip/SmartCard Device (Alcor Micro USB Smart Card Reader) к сожалению не захотело. Вернее само устройство определилось "на другом конце" и даже в диспетчере устройств в разделе Смарт-карты появилась смарт-карта, но вот ПО, которое общается с ней, сам ридер видело, а установленную в нем карту - нет. Из других устройств, которые я пробовал подключать к Rasberry Pi с установленным на нем USB Redirector for Linux был Android смартфон, здесь все было нормально:



Полезные ссылки

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

  1. http://www.virtualhere.com/home
    Вот это решение по-моему гораздо проще и цены гуманнее.
    Пробовал на Wheezy. Работает отлично

    ОтветитьУдалить
    Ответы
    1. А вы пробовали пробрасывать через него какой-нибудь Smart Card Reader? Т.е. не USB кардридер, а именно ридер смарт карт? Удаленный ПК видит смарт-карту в ридере проброшенном через USB?

      Удалить
    2. Нет, такой задачи не стояло. Пробрасывал ключи лицензий и флэшка. Заработало всё сразу на ура. Одно устройство работает бесплатно. Так что можно проверить как будет работать то, что вам нужно.
      Вообще разработчик заявляет о полноценной поддержке USB. То есть типа должно работать вообще любое устройство.

      Удалить
    3. Сегодня получилось проверить самому, вообщем, в отличие от USB Redirector, сервер VirtualHere USB Server отлично работает с ридером смарт карт. Все запустилось и опозналось. Единственно, что мне показалось (это субъективное мнение), на одном и том же Rasberry PI работа с флешкой почему-то быстрее в USB Redirector. Т.е. если "расшарить" флешку средствами USB Redirector, то чтение / запись на нее происходит быстрее, чем когда мы делаем аналогичное через VirtualHere USB Server. Хотя опять же, повторюсь, это все субъективно. Важно то, что поддержка различных устройств в VirtualHere USB Server по-видимому реализована лучше.

      Удалить