DySprozin aka xjmjk
DySprozin aka xjmjk
1403 просмотров4 комментариев

Репка и WiFi — повышаем стабильность сети

Введение
Репка, как и другие одноплатники, имеет у себя на борту множество интерфейсов. Подключив монитор, клавиатуру и мышь можно получить полноценный компьютер, пусть и сильно ограниченный в ресурсах. Для выхода в интернет (да просто в локальную сеть) у Репки предусмотрен Ethernet-разъем и wifi-модуль.

Последний «из коробки» работает весьма неустойчиво — по крайней мере, если речь идет о прошивке 1.0.14, актуальной на момент написания статьи. И если для мини-компьютера подключение по проводу может быть приемлемо, то в остальных случаях без стабильного wifi работать становится практически невозможно.

В данной статье мы не только разберём, как можно добиться бесперебойной работы wifi, но и какими путями мы пришли к этому.

1. Так в чем проблема?
Началось всё с того, что в выходные я принес Репку из мастерской домой в надежде не спеша поковырять её… Как и полагается, заранее прописал домашнюю wifi сеть, она успешно подцепилась, и всё было отлично. В первый час. А потом я решил обновиться.

По какой-то причине мне показалось, что РепкаОС версии 1.0.12 уже давно устарела (июль когда уже был-то!), а тут 1.0.14… Привычным движением залил новую прошивку, прописал в конфигах сети точку доступа, запустил, но в этот момент что-то пошло не так. Синий светодиод активно мигал, но к сети подключаться упорно отказывался. Возможно, просто инициализация затянулась? С этими мыслями я оставил репку на ночь и пошел спать.

...Проснулся около трех ночи, светодиод всё так же ядовито моргал, а роутер упорно делал вид, что нового устройства в сети не появилось. Становилось понятно, что инициализация не затянулась — она сломалась. Но почему? Заливал я на новую sd-карту, чтобы не сносить старую систему, может 64 Гб для Репки много? Вроде нет (на самом деле, в некотором смысле да, но об этом как-нибудь в другой раз)… Возможно, просто глюк.

Перезагружаю репку, проверяю сеть — завелась! С чувством выполненного долга я пошел спать, чтобы утром… обнаружить, что wifi снова пропал. «Да как так-то!», — промычал я, на что Репка флегматично мигнула синим глазом.

Может быть дома wifi не той системы? Загружаюсь со старой карточки — мгновенное подключение! Еще раз. И еще… Стабильно всё работает. Вставляю обратно sd-карту с новой осью — либо зависает, либо загружается с третьего раза на пятый, да вообще отваливается по любому чиху. Ничего не остаётся, придётся читать...

2. Читаем логи
Рис. 1. Это — Локи: «В каком же ты отчаянии…»

Первое, на что упал мой взгляд — это ошибка в скрипте запуска wpa_supplicant:

Рис. 2. А это — логи...

По какой-то причине, система не хотела видеть /dev/stderr. Следом сразу идет ошибка:

Mar 27 17:54:43 Repka-Pi sh[819]: ifup: failed to bring up wlan0

«Вот оно», — подумал я и пошел в гугл искать причину. Причиной оказался довольно древний баг wpa_supplicant и в целом, как я понял, предлагалось на него просто забить… Но это не наш метод, надо же узнать, что там такое в stderr пишется, после чего не может подняться интерфейс! Наш метод — костыли! Например, такой: в файле /etc/wpa_supplicant/functions.sh меняем строку:

echo "$WPA_SUP_PNAME: $@" >/dev/stderr
на
echo "$WPA_SUP_PNAME: $@" >> /var/log/wpa_supplicant_err.log

Сделал, перезапустил, ошибка в syslog пропала, а так же появился файл wpa_supplicant_err.log , который должен был пролить свет на нашу проблему. Чувство радости быстро улетучилось: файл содержал всего одну строчку:

wpa_supplicant: /sbin/wpa_supplicant daemon failed to start

Ну то есть файл логов с ошибками сообщил, что произошла ошибка. Мда.

По ходу дальнейшего разбора syslog несколько раз встречалось упоминание ipv6, может, в этом ключ к успеху? Как говорится, в любой непонятной ситуации выключай ipv6 :-) В sysctl.conf тут же появилась строчка

net.ipv6.conf.all.disable_ipv6 = 1

После перезагрузки ситуация как будто бы улучшилась, но соединение всё равно проходило через раз, что совершенно нас не устраивало.

Дальше пошла «охота на ведьм»: удалялось всё, что всплывало в syslog и хоть как-то отдаленно могло повлиять на работу wifi. Ругается на p2p-dev-wlan0 ? Отключим вообще! Помогали, разумаеется, и в официальной группе Репки в телеге. Ругается на «device may have limited channels available» ? По совету Максима Калиниченко в файле /etc/wpa_supplicant/wpa_supplicant.conf прописали «country=RU».

В результате файл /etc/wpa_supplicant/wpa_supplicant.conf стал выглядеть вот так:

ctrl_interface=DIR=/var/run/wpa_supplicant_wlan0_custom GROUP=netdev
update_config=1
country=RU
p2p_disabled=1
network={
	ssid="GPNR"
	psk="superpassword"
}

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

allow-hotplug wlan0
auto wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

Помогло ли это всё? Ну… Скорее да, чем нет. Соединение стало ощутимо устойчивей, а случаи отсутствия подключения к wifi при старте снизились до одного-двух из пяти, что уже терпимо, но всё равно неприятно. Продолжаем втыкать в логи, как вдруг…

Рис. 3. «И тут индеец Острый Глаз заметил, что у сарая нет одной стены»

Mar 27 17:54:42 Repka-Pi systemd[1]: ifup@wlan0.service: Failed with result 'timeout'.

Значит так… Systemd… Timeout… Systemd…

Рис. 4. И тут до него дошло...

Идем в папку /lib/systemd/system/ и обнаруживаем там кучку systemd конфигов:

/lib/systemd/system/wpa_supplicant-wired@.service
/lib/systemd/system/wpa_supplicant.service
/lib/systemd/system/wpa_supplicant-nl80211@.service
/lib/systemd/system/wpa_supplicant@.service

Нет никакого желания разбираться, кто за что отвечает, потому просто пропишем везде в [Service] секции TimeoutSec=900. Например:

...
[Service]
Type=simple
ExecStart=/sbin/wpa_supplicant -c/etc/wpa_supplicant/wpa_supplicant-%I.conf -Dnl80211,wext -i%I
TimeoutSec=900
...

Не забываем про команду daemon-reload:

systemctl daemon-reload

Перезагружаемся и… успех! Подключение к wifi происходит каждый раз! Причем, если роутер перезагрузить, соединение после этого сразу появляется.

Для полноты картины можно отключить графический режим:

systemctl set-default multi-user.target

Но это уже на вкус и цвет.

Обещалки
В следующей статье мы покажем, как автоматизировать первоначальную настройку только системы правкой конфигов на sd-карте при помощи Ansible. К самой Репке не придется цеплять ни монитора, ни клавиатуры, только карта памяти и питание!


Комментарии (4)

Для участия в обсуждении Вы должны быть авторизованным пользователем
Команда Репки
Команда Репки  

Спасибо, всё очень круто! Внесём доработки в официальную прошивку Репки!
И ждём с нетерпением обещанное продолжение про Ansible !!!!

Михаил  

Репка 1.5, 2 Гб ОЗУ, Тестовая прошивка от 01.09.2023(В данной прошивке поднята частота работы оперативной памяти на 24 МГц, максимальная частота процессора до 1.464 ГГц) с активным охлаждением.
Подключение к WiFi стабильное и не отваливается. Но вот скорость оставляет желать лучшего.
При подключении к Wi Fi проверяю скорость соединения speedtest-ом и вижу 0.1 МБ/сек или меньше, это при 100 МБитах от провайдера. Разрываю соединение и соединяюсь снова. Опять speedtest-ом проверяю: 1.2 МБита или меньше. После очередного отключения/включения WiFi скорость соединения становится 45...55 МБит/сек. Чудеса, да и только. Что это может быть? Не подскажите?

DySprozin aka xjmjk
DySprozin aka xjmjk  

Вы можете попробовать - вышла статья по автоматизированной настройке репки с нуля:

https://repka-pi.ru/blog/post/53

Если заработает нормально, то значит что-то в текущих конфигах не так. Если же не заработает, то либо дело в железе, либо в роутере

Михаил  

Спасибо.

Темы

Навигация

ВойтиРегистрация