Железкой по сети. Пробрасываем USB-устройства, видеокарту, звуковуху и диски на удаленную машину

Особенность Unix-подобной системы — относиться к любому из своих компонентов как к файлу — давно уже стала общим местом в разговорах о ее внутреннем устройстве. И бесчисленное количество статей о том же Linux тому свидетельство. Оборудование — не исключение. Видеокарта, аудиокарта, внешний девайс, подключенный через USB, в понимании Linux не что иное, как файл.
Оттого удивительно, что из всех операционных систем только Plan 9 (если не считать пары отпочковавшихся проектов со схожей судьбой), в котором подобный подход доведен до логического конца, способен без лишних телодвижений распознавать оборудование удаленного компьютера и управлять им, как своим собственным.
В Plan 9 за проброс оборудования отвечает RPC-протокол 9P. Он обеспечивает доступ вообще к любым файлам и устройствам, как локальным, так и сетевым. К сожалению, Linux похвастать таким универсальным инструментом не может. Зато здесь есть несколько инструментов (если не сказать — костылей), обеспечивающих доступ к оборудованию удаленной машины.
Когда речь заходит о пробросе оборудования на другой компьютер, возможно, первое, что приходит на ум, — это веб-камера на домашнем ноутбуке или подключенный к нему смартфон, доступ к которым нужно обеспечить с удаленного десктопа. Например, из офиса на другом конце города (в другом городе, в другой стране).
В подобном случае выручить может утилита USB/IP. Развитием утилиты уже давненько никто не занимался, но на ее работоспособности это пока не сказалось — в репозиториях большинства популярных дистрибутивов такой пакет присутствует.
Первым делом пакет USB/IP следует установить на ту машину, доступ к устройствам которой необходимо получить извне. Далее загружаем необходимые модули:
Проверяем, все ли корректно загрузилось:
И запускаем сервер:
Поскольку USB/IP имеет собственную, независимую от встроенной систему адресации, поиск устройств выполняется командой
Она покажет список всех устройств, подключенных в данный момент в USB-шине.

Настройка утилиты USB/IP
Теперь можно приступить непосредственно к расшариванию девайса (допустим, это будет веб-камера с индексом 2-3 из полученного списка):
Очередная проверка правильности выполненных действий:
С исходным компьютером покончено. Далее следует настроить тот, на котором будет использоваться периферия первого.
Итак, перейдя на клиентскую машину, устанавливаем на нее USB/IP и запускаем:
Проверяем доступность расшаренного оборудования на сервере по списку:
И присоединяем нашу камеру:
Теперь удаленное USB-устройство должно появиться в списке локальных, и с ним можно будет работать, как с любым другим. Для проверки корректности подключения выполняем команду lsusb:
Существует клиентская часть USB/IP для Windows. Однако из-за ошибки в версии протокола в ее исполняемом файле из коробки она работает некорректно. Требуются дополнительные телодвижения с подменой констант в исходниках.
RS232
Самым лаконичным решением взаимного расшаривания в Линуксе могут похвастаться COM-порты. Никакие дополнительные драйверы для этого не нужны. За все отвечает одна маленькая утилита remserial, доступная в исходниках. Подходит как для доступа из Линукса к оборудованию, подключенному через RS232 на удаленном компьютере, так и для связки двух девайсов с COM-портами, подключенных к разным машинам, связанным по сети.
Расшарить RS232, указав сетевой порт (-p), скорость, режим stty (-s) и имя порта (здесь /dev/ttyS0), можно так:
Подключиться к COM-девайсу, расположенному на удаленной машине (сервере), — так:
Допустимо запускать несколько экземпляров программы с разными портами и адресами подключенных девайсов.

Компиляция и запуск remserial
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Доступ к USB диску (флешке) через роутер TP-Link по сети
Большинство моделей маршрутизаторов TP-Link имеют USB порт. Он используется для подключения USB-накопителей, принтеров, и USB-модемов (в некоторых моделях) . Сегодня я покажу как подключить флешку, или внешний жесткий диск к роутеру, и без сложных настроек получить доступ к USB диску по сети практически с любого устройства. Проще говоря, с компьютера, или даже мобильного устройства (Android) мы сможем заходить на флешку, которая подключена к роутеру TP-Link. Доступ к накопителю смогут получить устройства, которые подключены как по Wi-Fi, так и по сетевому кабелю. Можно будет не только просматривать файлы на накопителе, но и записывать и удалять.
Раньше я уже писал статью по настройке FTP на роутерах TP-Link. Это тоже хороший способ получить доступ к накопителю, который подключен к роутеру, но там боле сложные настройки. А мы настроим обычный сетевой доступ, и подключим сетевой диск в Windows, чтобы был удобный доступ к флешке.
Если вы хотите на телевизоре смотреть файлы, которые находятся на USB-накопителе подключенному к роутеру, то лучше настроить DLNA сервер. Как это сделать на роутере TP-Link я писал в отдельной статье: https://help-wifi.com/raznye-sovety-po-tv/media-server-dlna-na-wi-fi-routere-asus-i-tp-link/.
А еще, подключенную к роутер флешку можно использовать для автономной загрузки файлов. Если в вашей модели маршрутизатора есть такая функция.
Настройка сетевого доступа к флешке через роутер TP-Link
Скорее всего, никаких настроек на роутере делать вообще не придется. Если там настройки заводские, вы не меняли настройки USB, то общий доступ включен по умолчанию.
На данный момент, на рынке есть роутеры со старой панелью управления (которая зеленая) , и с новой (голубая) . Насколько я понял, на более старых моделях нет доступа к накопителю через «Сетевое окружение». Это значит, что накопитель подключенный к роутеру не будет автоматически отображаться на вкладке «Сеть» в проводнике Windows. Его нужно будет добавить вручную.
Мы начнем настройку с самого простого, и рассмотрим разные нюансы.
Подключаем USB диск к маршрутизатору
Для начала, в USB порт вашего роутера подключите накопитель. Это может быть обычная флешка, или внешний жесткий диск.
Я все проверял на роутере Tp-Link Archer C20i. У вас конечно же может быть другая модель, это не страшно.

Думаю, с подключением проблем возникнуть не должно.
Доступ к USB накопителю с компьютера (Windows 10) через роутер TP-Link
Я покажу на примере Windows 10. Но в Windows 8, и Windows 7 все будет точно так же.
Компьютер подключен к роутеру, к которому в свою очередь подключен накопитель. Первым делом давайте проверим, может наш накопитель уже отображается на вкладке «Сеть» в проводнике.
Откройте проводник, и перейдите на вкладку Сеть. Если сверху выскочит сообщение, что «Сетевое обнаружение и общий доступ к файлам отключен», то нажмите на него, и выберите «Включить обнаружение и общий доступ к файлам». Если появится еще одно окно, то я советую открыть доступ к той сети, к которой вы подключены на данный момент. Если сообщение не появится, то ничего страшного, значит там все Ok.

Смотрим что там есть в этом окне. Если повезет, то там будет отображаться сетевой доступ к нашему роутеру. У меня он называется «TP-SHARE». Открываем его, там будет папка, в которой уже находится содержимое нашего накопителя.
Скриншот уже с Windows 7, лень было обратно в Windows 10 загружаться:) Но там все одинаково.

Вот собственно и все. Вы можете закидывать туда файлы, и считывать их. Но такой способ у меня сработал только с новым роутером TP-Link Archer C1200. А вот накопитель подключенный к Tp-Link Archer C20i на вкладке сеть не отображался. Но его можно без проблем подключить как сетевой диск.
Если сетевой накопитель не отображается на вкладке «Сеть»
В таком случае, просто открываем проводник, и переходим по адресу \\192.168.0.1, или \\192.168.1.1 (все зависит от роутера). Сразу должна открыться наша флешка, или HDD.

Чтобы каждый раз не вводить этот адрес в проводнике, достаточно нажать на папку с накопителем правой кнопкой мыши, и выбрать «Подключить сетевой диск. «.

В следующем окне достаточно нажать «Готово».

Вот и все, теперь наш диск будет всегда доступен из проводника (Этот компьютер) .

После отключения флешки от роутера TP-Link, и повторного подключения, даже роутер перезагружать не нужно. Доступ будет восстанавливаться автоматически.
Настройка совместного доступа к USB на роутерах TP-Link
Как видите, все работает без каких либо настроек роутера. Нам даже не понадобилось входить в панель управления. Но я все таки решил показать настройки общего доступа. Там можно отключить анонимный доступ. Это когда для доступа к накопителю нужно будет вводить имя пользователя и пароль учетной записи. Можно создавать учетные записи с разными правами доступа. Например, только с правами на чтение (просмотр файлов) .
Я выше уже писал, что роутеры TP-Link бывают с двумя панелями управления: зеленой и голубой. Рассмотрим оба варианта.
Нужно зайти в настройки роутера. Достаточно в браузере перейти по адресу 192.168.0.1, или 192.168.1.1 и указать данные для входа. Заводские: admin и admin. Можете посмотреть подробную инструкцию: https://help-wifi.com/tp-link/kak-zajti-v-nastrojki-routera-tp-link/.
Если у вас зеленая панель управления, то нужно открыть вкладку «Настройки USB» – «Совместный доступ».

Как видите, сервер по умолчанию включен. Чтобы задать настройки доступа, создать новые учетные записи, нужно убрать галочку «Анонимный доступ ко всем томам». Так же можно отключить доступ, нажав на соответствующую кнопку.
На новых роутерах, с новой панелью управления нужно в разделе «Дополнительные настройки» открыть вкладку «Настройки USB» – «Общий доступ». Мы получали доступ через «Сетевое окружение». Как видите, его можно отключить, просто убрав галочку возле него.

Вот собственно и все. Если вас интересует доступ к файлам, которые находятся на накопителе подключенному к маршрутизатору с телефона, или планшета на Android, то я советую использовать приложение ES Проводник. В нем есть вкладка сеть, где будет отображаться сетевой накопитель. Если же автоматически он не появится, то там есть возможность подключить сетевой диск по адресу \\192.168.0.1, или \\192.168.1.1.
Если не получится зайти с мобильного устройства, то напишите в комментариях. Покажу более подробно.
Проброс USB-портов из Windows 10 для удалённой работы
Когда человек много лет рыл бункер и запасал там продукты, он должен испытывать глубокое моральное удовлетворение, если бункер понадобился. Он будет довольный заявлять: «А я говори-и-и-ил!» То же касается и того, кто делал запасы продуктов в кладовой, когда все закупались в магазинах только на сегодня. А вот с нашим комплексом для удалённой работы Redd как-то и не хочется злорадствовать. Он проектировался для удалёнки в мирное время. И использовался задолго до первых новостей из Китая.
Давно я про него ничего не писал. Другие проекты отвлекают, да и интерес, судя по рейтингу последней из опубликованных статей, уже упал. Сил на подготовку статьи отнимают много, и это имеет смысл делать только если оно нужно достаточному числу читателей.
Но так как сейчас удалёнка у всех на устах, возникло желание поделиться одной наработкой, которая может кому-то помочь. Это не наша разработка, я проводил исследования в рамках работы над сервисом удаленной работы с отладочными платами All-Hardware. Вот их результаты сейчас и опишу. Проект USB/IP известен многим. Но он давно свёрнут авторами. Самые свежие драйверы были под WIN7. Сегодня я опишу, где скачать вариант для WIN10, и покажу, как я его проверял. Кроме того, разработчики современного аналога уверяют, что у них сделан не только Windows-клиент, но и Windows-сервер (правда, в этом режиме я тестирование не вёл: задача того не требовала). Но кому-то это тоже может оказаться полезным.
Введение
Сначала краткий рассказ, что такое USB/IP. Это комплекс программ, которые позволяют пробросить USB-устройство через сеть. Само устройство подключено к серверу. Клиент располагается на другой машине. При этом на клиентской машине имеется приложение, совершенно не рассчитанное на работу с сетью. Оно хочет настоящее USB-устройство. И оно получает информацию, что это устройство подключено. На это устройство встаёт штатный драйвер. В общем, клиент считает, что он работает с локальным USB-устройством.
Кто-то так пробрасывает ключи защиты. Мы же проверяли возможность удалённого доступа к JTAG-адаптеру.
Проект USB/IP активно развивался до 2013 года. Затем Windows-ветка остановилась. В целом, был выпущен даже двоичный подписанный драйвер. Но он был под Windows 7. Linux-ветка же продолжила развитие, и этот сервис оказался встроенным в саму операционную систему. По крайней мере, в сборку Debian он точно встроен. Причём для Linux имеется и клиент, и сервер, а для Windows исходно был сделан только клиент. Сервер под Windows сделан не был.
Существует очень хорошая статья на Хабре, которую можно использовать и как справочник по работе с данным сервисом, и как отзыв о работе с ним.
Вариант под актуальную версию Windows
Но как бы ни была хороша Windows 7, а она уже мертва. В рамках работ над All-Hardware мы рассматривали разные варианты решения одной из проблем, и надо было просто проверить ряд альтернатив по принципу «подойдёт — не подойдёт». Тратить много человеко-часов на проверку было невозможно. А переделка драйвера под Windows 10 могла затянуть в себя. Поэтому был проведён поиск в сети, который вывел на проект usbip-win. На момент его обнаружения свежий вариант был датирован 23 февраля 2020 года, то есть проект живой. Он может быть собран и под WIN7, и под WIN10. К тому же, в отличие от оригинального проекта, может быть собран не только Windows-клиент, но и Windows-сервер.
Я проверил, проект прекрасно собирается и устанавливается, поэтому дальнейшая работа велась с ним. В файле readme есть ссылка на готовый двоичный код для тех, кто не хочет самостоятельно производить сборку.
Грустная часть проверки: серверная часть
Сначала я расскажу, как проводилась проверка в рамках нашего проекта. Там всё кончилось не очень хорошо. Проверяли адаптер ST-LINK, установленный в корпус комплекса Redd, благо я уже отмечал, что в комплексе используется ОС Linux сборки Debian, а эта сборка содержит встроенный сервис USB/IP.
Согласно статье, устанавливаем сервис:
Дальше в статье подробно рассказано, как автоматизировать процесс загрузки сервиса. Как я разбираюсь в Линуксе, я уже многократно писал. Плохо разбираюсь. У меня нет привычки с умным лицом цитировать чужие тексты, слабо понимая суть. Поэтому я ещё раз напомню ссылку на замечательную статью, где всё рассказано, а сам покажу, что делал я при каждом старте ОС (благо всё было нужно только для проверки):
Назначение первых двух из вышеприведённых заклинаний мне неизвестно, но без них не создаются какие-то каталоги, а без этих каталогов потом не будет экспорта USB-порта. Каталоги создаются только до перезапуска системы. Так что создавать их надо каждый раз. Третья строка — с нею всё понятней, она запускает сервис.
Теперь смотрим, как зовут устройство:
Получается, что нам нужно устройство и busid, равным 1-5.4.1.3.
Всё, сервер готов к работе.
Грустная часть проверки: клиентская часть
В Windows устанавливаем драйвер (делаем это только один раз, дальше он будет всегда установлен). Для этого запускаем от имени администратора файл usbip.exe с аргументом install:
usbip.exe install
Теперь смотрим, доступно ли нам устройство:
Убеждаемся, что оно присутствует в списке. Ну, и подключаем его:
В менеджере устройств появляется новое USB-устройство, Keil его прекрасно видит…
Но на этом всё приятное кончается. Небольшая программа заливается во флэшку около минуты. Попытки шагать по строкам идут от 5 до 20 секунд на каждую строку. Это неприемлемо. Во время паузы в обе стороны идёт трафик примерно 50 килобит в секунду. Долго и вдумчиво идёт.
Честно говоря, ограничение по времени привело к тому, что я только предполагаю, почему всё было так плохо. Подозреваю, что там по сети бегает JTAG-трафик. А он бегает небольшими пакетами в обе стороны, отсюда и проблемы. Так было завершено исследование с результатом: «Для проекта не подходит».
Более весёлая часть: подготовка
Ещё тогда мне запало в голову, что я краем глаза видел, что в JTAG-адаптере CMSIS DAP по USB ходит не чистый JTAG-трафик, а команды. Сам JTAG-трафик формируется уже внутри адаптера. Давно хотел проверить это, да всё руки не доходили. Массовый перевод на удалёнку заставил это сделать (возникла задачка). Что такое CMSIS DAP? Это JTAG-адаптер, рекомендованный самой компанией ARM для контроллеров Cortex-M. Исходные коды для разных контроллеров выложены на GitHub, можно спаять адаптер на базе любого из них. Я сейчас дам ссылку на клон проекта, адаптированный под макетную плату «Голубая пилюля»: https://github.com/x893/CMSIS-DAP, но поисковые системы могут вывести и на официальный аккаунт ARM.
Чтобы не тратить на сервер целую PC, для проверки, я сделал этакий комплекс Yelloww (чисто по цвету пластика, из которого сделан корпус):

Роль сервера выполняет Raspberry Pi с установленной ОС Raspbian (это тот же Debian, а значит, там имеется требуемый сервер). Одна из «голубых пилюль» выступает в роли адаптера CMSIS DAP, вторая — в роли отлаживаемого устройства.
Точно так же ставим и настраиваем сервис. Разве что здесь список устройств, допустимых к экспорту, намного скромнее:
Понятно, что здесь экспортируем и импортируем устройство busid=1-1.4.
И вот тут конкретно с CMSIS DAP у меня периодически возникает небольшая проблемка. В менеджере устройств я вижу такую неприятность:

Напомню, что статья пишется по принципу «Лучше неплохая, но сегодня, чем идеальная, но завтра». Проблемы удалённой работы возникают прямо сейчас. Надеюсь, в обозримом будущем они уже будут не актуальны. А пока актуальны — показываю, как я обхожу данную проблему вручную. Сначала я отключаю устройство:

Затем сразу же включаю:

И оно начинает работать без проблем. В Keil меняем отладчик на CMSIS DAP:


При работе по локальной сети всё просто летает. Но понятно, что локальная сеть никому не интересна. Я попробовал пробросить порт устройства у себя дома, а затем удалённо зайти на машину на работе и потрассировать «прошивку» оттуда. Связь у моего домашнего провайдера весьма и весьма тормозная, особенно — от меня наружу. Прошивается контроллер примерно втрое медленнее, чем при прямом подключении к USB. Трассировка… Ну около секунды на строку, точно не больше. В общем, терпимо. С хорошими провайдерами, надеюсь, будет лучше.
Заключение
Проект usbip-win является современной заменой для проекта USB/IP. Он живёт и развивается. При этом он предоставляет для ОС Windows не только функцию клиента, но и функцию сервера. Совместимость с Linux-версией сохранена.
Устойчивость работы удалённого USB-устройства неожиданно поразила. Я был уверен, что возникнут таймауты. Возможно, где-то они и возникнут, но для JTAG-адаптеров не было замечено ни одного сбоя. К сожалению, не все USB-устройства могут быть проброшены через сеть по причине низкого быстродействия получившейся системы. Но в случае с JTAG-адаптерами можно рассмотреть альтернативные вещи. В частности, CMSIS-DAP вместо ST-LINK.
Оба рассмотренных проекта (usbip-win и CMSIS-DAP) могут быть скачаны с GitHub в виде исходных кодов.
Если это поможет кому-то организовать удалённый доступ к оборудованию, я буду рад. Использование Raspberry Pi позволит бросить оборудование в произвольных местах.