Замена NetworkManager и wpa_supplicant на iwd в Void Linux: решение проблемы с USB Wi-Fi адаптером на чипе RTL8187
Пользователи Void Linux иногда заменяют стандартные средства управления Wi-Fi, такие как NetworkManager
и wpa_supplicant
, на iwd
(iNet wireless daemon) для упрощения настройки и повышения стабильности подключения к беспроводным сетям. Несмотря на положительный опыт работы с iwd
, некоторые сталкиваются с проблемами при использовании определённых Wi-Fi устройств, особенно USB адаптеров на базе чипа RTL8187. В этой статье разберём, с чем связана подобная ошибка и как её решить.
Описание проблемы с USB Wi-Fi адаптером на базе RTL8187
Проблема особенно заметна при использовании USB Wi-Fi адаптера Trendnet с чипом RTL8187. Когда адаптер подключается после запуска сервиса iwd
, он не отображается в утилите iwctl
, хотя операционная система фиксирует устройство, и адаптер виден в выводе команды iwconfig
.
Основной практической проблемой становится ситуация после выхода из режима сна (suspend/wake). После пробуждения адаптер исчезает из списка устройств iwctl devices
, и для его повторного использования необходимо перезапустить сервис iwd
.
Анализ ошибок и системных логов
В выводе системного лога dmesg
можно заметить сообщение об ошибке:
ieee80211 phy0: eeprom reset timeout!
Кроме того, происходит переименование устройства для сохранения стабильных имён, например:
rtl8187 1-1:1.0 wlp0s[snip]u1: renamed from wlan0
При ручном запуске демона iwd
также можно увидеть ошибки и таймауты, связанные с поднятием интерфейса. В частности, при попытке инициализации интерфейса возникает:
Error bringing interface 8 up: Connection timed out
Такие сообщения указывают, что устройство не успевает полностью инициализироваться к моменту, когда iwd
пытается с ним работать.
Причина проблемы — недостаток времени для инициализации устройства
Изучение исходного кода драйвера RTL8187 показывает, что функция rtl8187_cmd_reset
вызывается демоном iwd
сразу после обнаружения адаптера. Если адаптер не успел завершить процесс инициализации, функция сбрасывает ошибку с таймаутом EEPROM — по сути, это аппаратный сбой, связанный с программным обращением к неподготовленному устройству.
Решение: задержка запуска iwd
для обеспечения инициализации
Практическое и элегантное решение — дать устройству 5 секунд на инициализацию до старта iwd
. Это можно реализовать с помощью правила udev
, которое добавляет задержку для устройств с драйвером rtl8187
:
bash
ACTION=="add", ENV{ID_NET_DRIVER}=="rtl8187", RUN+="/bin/sleep 5"
Важный момент: udev
отправляет событие о завершении обработки правил только после выхода из всех связанных обработчиков, поэтому если iwd
реагирует на сигнал udev
(а не на сигналы ядра напрямую), то он увидит устройство только после задержки в 5 секунд.
Возможные улучшения и обходные пути
Кроме задержки, можно попытаться автоматизировать перезапуск iwd
через скрипты, которые будут реагировать на подключение или пробуждение устройства. Например, при помощи отправки D-Bus сообщений из udev
для уведомления iwd
о появлении новых Wi-Fi интерфейсов.
Однако задержка в 5 секунд — самый простой и проверенный способ избежать ошибок EEPROM и таймаутов.
Итоги
- Проблема связана с тем, что
iwd
начинает работу с USB адаптером RTL8187 до завершения его инициализации. - В результате появляется ошибка
eeprom reset timeout
, а устройство не отображается вiwctl
. - Задержка в 5 секунд через
udev
позволяет избежать этой проблемы, обеспечив стабильно работающий Wi-Fi адаптер без необходимости перезапуска демона. - Этот подход применим для пользователей Void Linux и других дистрибутивов, использующих
iwd
в управлении беспроводными сетями.
Если у вас есть подобный USB Wi-Fi адаптер RTL8187 и вы используете iwd
, внедрение такой задержки значительно повысит стабильность работы сети и избавит от необходимости ручного перезапуска сервиса.