Подключение USB концентратора Digi AnywhereUSB 24 Plus к Debian GNU/Linux 11 (Bullseye)

Connecting a Digi AnywhereUSB 24 Plus USB Hub to 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.

Download Linux Driver for Digi AnywhereUSB 8 Plus

На данный момент времени, для загрузки доступна версия 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 и выше. Последний протестированный дистрибутив Debian10.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 <username>)

# 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

Running awusbmanager with xvfb-run

Теперь нам следует подготовить специальный каталог, в котором будет хранится настроенный нами конфигурационный файл для работы awusbmanager.

Если запускать awusbmanager в графическом режиме из под учётной записи root-пользователя и конфигурировать в этом режиме подключение к USB-концентратору, то в конфигурации по умолчанию будет создана следующая структура файлов:

/root/.AnywhereUSB/
├── awusbcerts
│   └── AW24-000000.pem
├── awusb_client_cert.pem
├── awusb.ini
└── awusb.log

Наша задача – воспроизвести эту структуру, не имея доступа к графическому режиму работы awusbmanager, отвязавшись при этом от профиля root.

1) Создадим в удобном для нас месте каталог для хранения конфигурации:

# mkdir /etc/awusbmanager

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-концентратора, к которому подключается клиент.

В секции [AutoConnect] указываем строку вида "{SN концентратора}.{номер группы USB портов на концентраторе}=1".

3) Регистрируем нового клиента в веб-интерфейсе USB-концентратора в разделе System > AnywhereUSB Configuration.

Adding a New Client to 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.

Running awusbmanager with xvfb-run

Как минимум, при запуске мы не должны получить никаких явных ошибок.

При этом первом запуске произойдёт следующее:

1) В каталоге с конфигурационным файлом автоматически сгенерируется само-подписанный сертификат клиента awusb_client_cert.pem, затем будет предпринята попытка связаться с концентратором и выполнить привязку с использованием сертификата клиента. Если процедура привязки клиента к концентратору прошла успешно, то в веб-консоли концентратора на странице управления клиентами мы увидим изменение статуса клиентского сертификата на Available:

Client certificate in AnywhereUSB Configuration is available

2) В случае успешной связки клиента и концентратора в п.1, в каталоге с конфигурационным файлом появится подкаталог /awusbcerts и в него скопируется сертификат концентратора с именем в формате "{SN концентратора}.pem"

File structure of AnywhereUSB Manager on Linux

Так как мы запустили 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-сервера.

View connected clients in the "Groups in Use" section on the AnywhereUSB Hub

На этом базовую настройку 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

systemd service status for awusbmanager

Успешность подключения к концентратору при запуске службы, как и ранее, мы можем посмотреть в логе /var/log/syslog, а также на веб-консоли концентратора.

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

 

Подключение USB-ключа в порт концентратора AnywhereUSB Plus

По условиям нашей задачи, с помощью концентратора AnywhereUSB Plus нужно транслировать лицензионный USB-ключ Guardant, поэтому настало время подключить к порту концентратора этот ключ.

При подключении USB-ключа, для начала убедимся в том, что на стороне концентратора в разделе Status > AnywhereUSB в блоке "USB Devices" корректно отображается информация об этом ключе:

Viewing Connected USB Devices on AnywhereUSB Hub

Проверим сообщения ядра Linux об обнаружении нового USB-устройства:

# dmesg -k

Displaying Linux kernel messages when connecting a USB device to an AnywhereUSB hub

Как видим, ключ успешно обнаружен и подключен к системе, а благодаря ранее настроенной нами конфигурации awusb.ini и службе awusbmanager.service монтирование этого ключа должно будет выполняться в автоматическом режиме при каждой загрузке/перезагрузке нашего виртуального Linux-сервера.

Для корректной работы приложений с рассматриваемым в нашем случае USB-ключом Guardant, в Linux системе потребуется дополнительная конфигурация, но это, как говорится, уже совсем другая история.

Только один комментарий Комментировать

  1. Dmitry /

    спасибо огромное за подробный гайд, все сработало)

Добавить комментарий