Подключение USB концентратора Digi AnywhereUSB 24 Plus к Debian GNU/Linux 11 (Bullseye)
Возникла задача трансляции лицензионного USB-ключа Guardant, подключенного к USB концентратору Digi AnywhereUSB 24 Plus, в виртуальный сервер на базе Debian GNU/Linux 11. В силу особенностей реализации утилиты «AnywhereUSB Manager» для Linux и нашего понимания того, что полновесная графическая среда на Linux-сервере — это излишество, выполнение этой задачи оказалось немного более сложным, чем просто «потыкать мышкой».
Где найти драйвер Digi AnywhereUSB 24 Plus для Linux
Есть две лаконичные статьи Digi KB: «Does the AnywhereUSB Support Linux?» и «Are there any Linux or iOS drivers for the AnywhereUSB products?», говорящие о том, что работа USB-концентраторов Digi AnywhereUSB в Linux не поддерживается. Но это статьи 2019 года, и, вероятно, они относятся в предыдущему поколению устройств линейки AnywhereUSB G1 и G2. В более свежей статье «Digi AnywhereUSB 24 Plus Linux limitations» мы можем найти информацию о том, что Linux официально поддерживается на 2-портовых и 8-портовых устройствах современной линейки AnywhereUSB Plus. Здесь же отмечено, что, на самом деле, поддерживается и 24-портовая модель, но с учётом ограничения, что на один удалённый хост можно транслировать не более 8 USB-портов.
Как ни странно, на сайте Digi в разделе драйверов для AnywhereUSB 24 Plus мы не найдём драйвера для Linux. Но если перейдём на страницу Digi AnywhereUSB 8 Plus, то обнаружим, что там присутствует возможность загрузки «AnywhereUSB Manager» для Linux.
На данный момент времени, для загрузки доступна версия Linux Version 0.6 (August 31, 2021) / Beta Release. В архиве 40003060_B.tgz мы найдём 2 пакета — 40003060_B_amd64.deb и 40003060_B-1.x86_64.rpm.
Установка AnywhereUSB Manager на Linux Debian
В файле заметок о выпуске (93001346_B.pdf) указано, что требуется ядро Linux версии 4.13 и выше. Последний протестированный дистрибутив Debian – 10.9. Мы рассмотрим пример установки на Debian 11.7.
Чтобы установить deb-пакет, можно вручную скопировать файл пакета на наш Linux сервер и выполнить его установку через утилиту dpkg:
# dpkg -i ./40003060_B_amd64.deb
Но в нашем распоряжении имеется локальный репозиторий, и поэтому мы разместим пакет там, предварительно переименовав его в более вменяемый вид (например, awusbmanager_0.6_amd64.deb). В этом случае выполнить установку пакета на сервер мы сможем из локального репозитория через apt:
# apt-get install awusbmanager
На Debian 11 пакет установился без каких-либо проблем, и теперь давайте посмотрим какие в системе произошли изменения в результате установки пакета.
1) В системе должен быть доступен драйвер vhci_hcd, представленный в виде модуля ядра. Проверяем загрузку модуля:
# modinfo vhci_hcd filename: /lib/modules/5.10.0-22-amd64/kernel/drivers/usb/usbip/vhci-hcd.ko license: GPL description: USB/IP 'Virtual' Host Controller (VHCI) Driver author: Takahiro Hirofuchi depends: usbip-core,usbcore,usb-common retpoline: Y intree: Y name: vhci_hcd vermagic: 5.10.0-22-amd64 SMP mod_unload modversions sig_id: PKCS#7 signer: Debian Secure Boot CA sig_key: 32:A0:28:7F:84:1A:03:6F:A3:93:C1:E0:65:C4:3A:E6:B2:42:26:43 sig_hashalgo: sha256 signature: 39:8C:8D:BF:77.
2) Должен появиться файл 70-awusb.rules, описывающий правила udev:
# cat /etc/udev/rules.d/70-awusb.rules SUBSYSTEM=="platform", DRIVERS=="vhci_hcd", RUN+="/bin/chgrp awusb /sys%p/attach" SUBSYSTEM=="platform", DRIVERS=="vhci_hcd", RUN+="/bin/chmod 0220 /sys%p/attach" SUBSYSTEM=="platform", DRIVERS=="vhci_hcd", RUN+="/bin/chgrp awusb /sys%p/detach" SUBSYSTEM=="platform", DRIVERS=="vhci_hcd", RUN+="/bin/chmod 0220 /sys%p/detach"
3) При успешной загрузке драйвера в системе мы должны увидеть 8 устройств «USB/IP Virtual Host Controller» (vhci_hcd.*):
# ls -la /sys/devices/platform/ | grep vhci_hcd drwxr-xr-x 5 root root 0 May 5 12:23 vhci_hcd.0 drwxr-xr-x 5 root root 0 May 5 12:23 vhci_hcd.1 drwxr-xr-x 5 root root 0 May 5 12:23 vhci_hcd.2 drwxr-xr-x 5 root root 0 May 5 12:23 vhci_hcd.3 drwxr-xr-x 5 root root 0 May 5 12:23 vhci_hcd.4 drwxr-xr-x 5 root root 0 May 5 12:23 vhci_hcd.5 drwxr-xr-x 5 root root 0 May 5 12:23 vhci_hcd.6 drwxr-xr-x 5 root root 0 May 5 12:23 vhci_hcd.7
4) Должна появится локальная группа awusb. Предполагается, что для получения доступа к транслируемым USB-устройствам непривилегированный пользователь должен быть включен в эту группу командой вида sudo usermod -a -G awusb )
# getent group awusb awusb:x:1001:
5) Ну и, наконец, сам исполняемый файл «AnywhereUSB Manager» сможем найти по пути /usr/sbin/awusbmanager.
Подключение AnywhereUSB Manager к USB-концентратору
Ключевой проблемой в нашем случае является то, что awusbmanager — это программа, требующая наличия графической среды на базе X11. То есть попытки запуска awusbmanager в нашей ситуации будут приводить к ошибкам вызова отсутствующих библиотек, так как на нашей серверной системе полноценной графической оболочки нет и не планируется.
Вопрос, заданный на официальном форуме поддержки Digi пока остался без ответа. Но, понимая то, что текущая версия «AnywhereUSB Manager» для Linux уже 2 года находится в стадии бета-релиза, на оперативное решение вопроса рассчитывать не приходится.
Проведя ряд экспериментов и наблюдая за поведением утилиты awusbmanager на тестовом сервере с активированной графической средой Gnome, была апробирована схема с запуском в среде без полноценной графической оболочки.
Запуск программы, требующей графической среды в окружении без полноценной графической среды будем выполнять с помощью утилиты xvfb-run из пакета xvfb. Выполним установку пакетов xvfb и libgtk2.0-0 (его требует сам awusbmanager), в ходе которой подтянется около 90 дополнительных пакетов размером примерно 280 MB:
# apt-get install xvfb libgtk2.0-0
После этого с помощью xvfb-run попробуем вызвать awusbmanager в режиме справки. При этом, как минимум, мы не должны получить никаких явных ошибок.
# /usr/bin/xvfb-run /usr/sbin/awusbmanager --help
Теперь нам следует подготовить специальный каталог, в котором будет хранится настроенный нами конфигурационный файл для работы awusbmanager.
Если запускать awusbmanager в графическом режиме из под учётной записи root-пользователя и конфигурировать в этом режиме подключение к USB-концентратору, то в конфигурации по умолчанию будет создана следующая структура файлов:
/root/.AnywhereUSB/ ├── awusbcerts │ └── AW24-000000.pem ├── awusb_client_cert.pem ├── awusb.ini └── awusb.log
Наша задача – воспроизвести эту структуру, не имея доступа к графическому режиму работы awusbmanager, отвязавшись при этом от профиля root.
1) Создадим в удобном для нас месте каталог для хранения конфигурации:
2) Создадим главный конфигурационный файл:
# nano /etc/awusbmanager/awusb.ini
Содержимое файла должно иметь следующий формат:
[General] AutoFind=0 MainFrameWidth=640 MainFrameHeight=480 MainFrameX=0 MainFrameY=27 AutoMinimize=0 HideUnathorized=0 AutoRegisterHubCert=1 AutoRefreshLookupPeriod=30 BonjourLookupTimeout=4 [Settings] ClientId=vss2L!nuX ManualHubs=digi01.holding.com:18574 [Transport] KeepAlivePeriod=3 KeepAliveTimeout=10 [AutoConnect] AW24-000000.10=1
Секции [General] и [Transport] можно оставить без изменений.
В секции [Settings] изменяем ClientId (этот же ID должен быть указан на USB-концентраторе при регистрации клиента). В ManualHubs пропишем адрес и порт USB-концентратора, к которому подключается клиент.
3) Регистрируем нового клиента в веб-интерфейсе USB-концентратора в разделе System > AnywhereUSB Configuration.
4) Выполняем первый запуск awusbmanager в рабочем режиме:
# /usr/bin/xvfb-run /usr/sbin/awusbmanager --log=OSEventLog --autofind-off --config=/etc/awusbmanager/awusb.ini
Пояснения по опциям запуска:
Опцию —log мы используем для указания того, что писать лог процесса awusbmanager следует в стандартный системный лог syslog. Если этого не указать в явном виде, то файл лога awusb.log будет создан в каталоге /root/.AnywhereUSB.
Опцию —autofind-off используем для отключения ненужного нам опроса сети на предмет обнаружения концентраторов.
Опцию —config используем для указания размещения настроенного нами ранее конфигурационного файла awusb.ini . Если этого не указать в явном виде, то процесс awusbmanager будет искать файл в каталоге /root/.AnywhereUSB.
Как минимум, при запуске мы не должны получить никаких явных ошибок.
При этом первом запуске произойдёт следующее:
1) В каталоге с конфигурационным файлом автоматически сгенерируется само-подписанный сертификат клиента awusb_client_cert.pem , затем будет предпринята попытка связаться с концентратором и выполнить привязку с использованием сертификата клиента. Если процедура привязки клиента к концентратору прошла успешно, то в веб-консоли концентратора на странице управления клиентами мы увидим изменение статуса клиентского сертификата на Available:
2) В случае успешной связки клиента и концентратора в п.1, в каталоге с конфигурационным файлом появится подкаталог /awusbcerts и в него скопируется сертификат концентратора с именем в формате «.pem»
Так как мы запустили awusbmanager с опцией логирования в стандартный системный лог, можем заглянуть в syslog и увидеть информацию о генерации сертификата и успешном подключении к концентратору.
# cat /var/log/syslog | grep AnywhereUSB . AnywhereUSB Manager: AnywhereUSB Manager 3.1.20.1 starting (Compiled: Dec 22 2020 23:37:49) . AnywhereUSB Manager: Client OS is Linux 5.10.0-22-amd64 x86_64 . AnywhereUSB Manager: Using config at /etc/awusbmanager/awusb.ini . AnywhereUSB Manager: Failed to connect to session manager: SESSION_MANAGER environment variable not defined . AnywhereUSB Manager: Client certificate not found, generating self-signed cert . AnywhereUSB Manager: Using client cert /etc/awusbmanager/awusb_client_cert.pem . AnywhereUSB Manager: digi01.holding.com:18574 connected as connection 1 (secure)
Так же на стороне концентратора в разделе Status > AnywhereUSB в блоке «Groups in Use» мы должны увидеть активную клиентскую сессию с нашего Linux-сервера.
На этом базовую настройку awusbmanager можно считать завершённой, но запуск awusbmanager при этом мы выполняли только вручную и нам потребуется дополнительно решить вопрос автоматизации запуска.
Настройка службы systemd для AnywhereUSB Manager
Чтобы решить задачу автоматизации запуска процесса awusbmanager в ходе загрузки/перезагрузки сервера, создадим простой юнит systemd:
# nano /etc/systemd/system/awusbmanager.service
Содержимое конфигурации юнита:
[Unit] Description=Digi AnywhereUSB Manager Service After=network.target Requires=network.target [Service] Type=simple User=root ExecStart=/usr/bin/xvfb-run /usr/sbin/awusbmanager --log=OSEventLog --autofind-off --config=/etc/awusbmanager/awusb.ini [Install] WantedBy=multi-user.target
Включаем автоматический запуск службы и выполняем её запуск (перед запуском службы, процесс, запущенный ранее нами вручную должен быть прерван):
# systemctl enable awusbmanager.service # systemctl start awusbmanager.service
Проверяем состояние службы:
# systemctl status awusbmanager.service
Успешность подключения к концентратору при запуске службы, как и ранее, мы можем посмотреть в логе /var/log/syslog , а также на веб-консоли концентратора.
В качестве дополнительной проверки можем перезагрузить сервер, чтобы удостовериться в том, что в ходе загрузки системы наша служба успешно запускается в автоматическом режиме.
Подключение USB-ключа в порт концентратора AnywhereUSB Plus
По условиям нашей задачи, с помощью концентратора AnywhereUSB Plus нужно транслировать лицензионный USB-ключ Guardant, поэтому настало время подключить к порту концентратора этот ключ.
При подключении USB-ключа, для начала убедимся в том, что на стороне концентратора в разделе Status > AnywhereUSB в блоке «USB Devices» корректно отображается информация об этом ключе:
Проверим сообщения ядра Linux об обнаружении нового USB-устройства:
Как видим, ключ успешно обнаружен и подключен к системе, а благодаря ранее настроенной нами конфигурации awusb.ini и службе awusbmanager.service монтирование этого ключа должно будет выполняться в автоматическом режиме при каждой загрузке/перезагрузке нашего виртуального Linux-сервера.
Для корректной работы приложений с рассматриваемым в нашем случае USB-ключом Guardant, в Linux системе потребуется дополнительная конфигурация, но это, как говорится, уже совсем другая история.