Инструменты пользователя

Инструменты сайта


wine_serialport

Настройка и проброс COM-портов под Wine в ОС Astra Linux

1. Общие сведения

Документ описывает порядок настройки последовательных портов (COM) в ОС Astra Linux и их проброса в Windows-приложения, запускаемые через Wine. Рассмотрены два типа источников портов:

  • Штатные / встроенные COM-порты — порты, реализованные на материнской плате или на плате расширения (PCI/PCIe-картах последовательных портов, мультипортовых адаптерах), которым в Linux соответствуют устройства /dev/ttyS* (а также /dev/ttyMI*, /dev/ttyAP*, /dev/ttyXR* и др. — в зависимости от драйвера платы расширения).
  • USB-to-COM (USB2COM) адаптеры — преобразователи интерфейсов USB ↔ RS-232/485, которым в Linux соответствуют устройства /dev/ttyUSB* (драйверы ftdi_sio, pl2303, ch341, cp210x и др.) или /dev/ttyACM* (устройства класса CDC-ACM).

Принцип проброса в обоих случаях одинаков: устройство Linux (/dev/tty*) связывается символьной ссылкой с именем COM-порта в каталоге dosdevices нужного Wine-префикса, после чего Windows-приложение видит его как COM1, COM2 и т. д.

Рисунок 1 — Общая схема проброса последовательного порта из ОС Astra Linux в Windows-приложение под Wine

Общая схема проброса COM-порта в Wine

2. Предварительные требования

Параметр Значение
Операционная системаAstra Linux Special Edition / Common Edition
Wine установлен и настроен Wine-префикс целевого приложения
Права пользователь должен входить в группу доступа к COM-устройствам (dialout)
Оборудование подключённая плата расширения COM либо адаптер USB-to-COM

3. Определение устройства в системе

3.1 Штатные COM-порты и платы расширения

Просмотр доступных последовательных портов, зарегистрированных ядром:

ls -l /dev/ttyS*
dmesg | grep -i ttyS

Уточнение реально присутствующих (а не зарезервированных) портов с помощью утилиты setserial:

setserial -g /dev/ttyS*

Порты с типом unknown физически отсутствуют; рабочему порту соответствует тип UART (например 16550A) и ненулевой адрес ввода-вывода.

Для плат расширения (PCI/PCIe) проверяется, что плата определена системой и для неё загружен драйвер:

lspci | grep -i serial
dmesg | grep -iE 'tty|serial|uart'

В зависимости от платы порты могут именоваться /dev/ttyS4, /dev/ttyS5… либо иметь собственный префикс (например /dev/ttyAP0, /dev/ttyXR0). При отсутствии портов после установки платы устанавливается соответствующий драйвер (модуль ядра) от производителя.

3.2 USB-to-COM адаптеры

Подключить адаптер и определить присвоенное ему устройство:

dmesg | grep -i tty
ls -l /dev/ttyUSB* /dev/ttyACM*

Определить параметры адаптера (производитель, модель, серийный номер) — они понадобятся для закрепления имени устройства через udev:

lsusb
udevadm info -a -n /dev/ttyUSB0 | grep -E 'idVendor|idProduct|serial'

4. Настройка прав доступа

Доступ к последовательным устройствам в Astra Linux предоставляется членам группы dialout.

Проверка членства пользователя в группе:

groups $USER

Добавление пользователя в группу (при отсутствии):

sudo usermod -aG dialout $USER

Изменение вступает в силу после повторного входа в сессию (logout/login) либо после перезагрузки.

Проверка прав на конкретное устройство:

ls -l /dev/ttyS0
ls -l /dev/ttyUSB0

Устройство должно принадлежать группе dialout с правами crw-rw----.

Замечание по мандатному контролю целостности (МКЦ) Astra Linux. В защищённых режимах Astra Linux доступ к устройству может дополнительно ограничиваться мандатными атрибутами. При недоступности порта из-под Wine, несмотря на корректное членство в dialout, следует проверить мандатные метки устройства и при необходимости согласовать уровень целостности процесса Wine и устройства.

5. Закрепление имени устройства (udev)

Имена /dev/ttyUSB* назначаются по порядку подключения и могут изменяться при переподключении адаптера или перезагрузке. Для предсказуемого именования создаётся правило udev, привязывающее устройство к стабильной символьной ссылке по уникальным признакам (idVendor, idProduct, серийный номер).

Создать файл правила, например /etc/udev/rules.d/99-com-chromos.rules:

SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", \
  ATTRS{serial}=="A12B3C4D", SYMLINK+="com_chromos", GROUP="dialout", MODE="0660"

Значения idVendor/idProduct/serial берутся из вывода udevadm (п. 3.2).

Применить правила без перезагрузки:

sudo udevadm control --reload-rules
sudo udevadm trigger

Проверить появление стабильной ссылки:

ls -l /dev/com_chromos

После этого вместо изменчивого /dev/ttyUSB0 в пробросе используется постоянный путь /dev/com_chromos. Для штатных портов плат расширения путь обычно стабилен, и отдельное правило не требуется.

Рисунок 2 — Привязка USB-to-COM адаптера к стабильному имени устройства правилом udev

 Привязка устройства правилом udev

6. Проброс порта в Wine-префикс

Проброс выполняется созданием символьной ссылки в каталоге dosdevices целевого Wine-префикса. Имя ссылки (com1, com2, …) задаёт номер COM-порта, под которым устройство будет видно Windows-приложению.

Перейти к каталогу dosdevices нужного префикса (пример для префикса win32):

WINEPREFIX=/home/user/.local/share/wineprefixes/win32
ls -l "$WINEPREFIX/dosdevices"

Создать ссылку на устройство:

# для USB-to-COM, закреплённого через udev:
ln -s /dev/com_chromos "$WINEPREFIX/dosdevices/com1"

# или напрямую на устройство:
ln -s /dev/ttyUSB0 "$WINEPREFIX/dosdevices/com1"

# для штатного порта / платы расширения:
ln -s /dev/ttyS0   "$WINEPREFIX/dosdevices/com2"

Проверить созданные ссылки:

ls -l "$WINEPREFIX/dosdevices/" | grep -i com

Рисунок 3 — Сопоставление устройств Linux именам COM-портов Windows-приложения через каталог dosdevices

 Сопоставление устройств именам COM-портов

7. Проверка и настройка портов в Wine

Запустить конфигуратор Wine для нужного префикса:

WINEPREFIX=/home/user/.local/share/wineprefixes/win32 winecfg

Сопоставление портов хранится в реестре префикса в разделе [Software\\Wine\\Ports]. При необходимости его можно задать напрямую, создав файл ports.reg и импортировав его:

REGEDIT4

[HKEY_LOCAL_MACHINE\Software\Wine\Ports]
"COM1"="/dev/com_chromos"
"COM2"="/dev/ttyS0"
WINEPREFIX=/home/user/.local/share/wineprefixes/win32 wine regedit ports.reg

После изменения реестра перезапустить службу Wine, чтобы порты были перечитаны:

WINEPREFIX=/home/user/.local/share/wineprefixes/win32 wineserver -k

8. Проверка работоспособности порта

На стороне Linux — базовая проверка параметров и доступности порта:

stty -F /dev/ttyUSB0 -a

На стороне Linux — контроль обмена (например, чтение «сырых» данных):

cat /dev/ttyUSB0

На стороне Windows-приложения — выбор соответствующего COM-порта (COM1, COM2, …) в настройках подключения к устройству и проверка связи (опрос, чтение статуса/данных). Параметры обмена (скорость, биты данных, чётность, стоп-биты) задаются средствами приложения и должны соответствовать настройкам подключаемого устройства.

9. Типовые неисправности и их устранение

Признак Возможная причина Действие
Приложение не видит COM-порт Не создана ссылка в dosdevices Выполнить п. 6 для нужного префикса
«Доступ запрещён» при открытии порта Пользователь не в группе dialoutВыполнить п. 4, перезайти в сессию
Порт «пропадает» после переподключения Изменилось имя /dev/ttyUSB* Закрепить имя через udev (п. 5)
Порт платы расширения отсутствует в /devНе загружен драйвер платы Установить модуль ядра производителя (п. 3.1)
Нет обмена при корректном порту Несовпадение скорости/параметров Согласовать параметры порта с устройством (п. 8)
Порт недоступен, права корректны Ограничения МКЦ Astra Linux Проверить мандатные метки устройства и процесса

10. Краткая последовательность действий (чек-лист)

  1. Подключить устройство (плату расширения или USB-to-COM).
  2. Определить путь устройства /dev/ttyS* или /dev/ttyUSB* (раздел 3).
  3. Убедиться в членстве пользователя в группе dialout (раздел 4).
  4. При необходимости закрепить имя устройства через udev (раздел 5).
  5. Создать символьную ссылку comN в dosdevices Wine-префикса (раздел 6).
  6. Проверить/задать сопоставление портов в реестре Wine (раздел 7).
  7. Проверить связь с устройством из Windows-приложения (раздел 8).
wine_serialport.txt · Последнее изменение: stramnov