Введение
Репка, как и другие одноплатники, имеет у себя на борту множество интерфейсов. Подключив монитор, клавиатуру и мышь можно получить полноценный компьютер, пусть и сильно ограниченный в ресурсах. Для выхода в интернет (да просто в локальную сеть) у Репки предусмотрен 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. К самой Репке не придется цеплять ни монитора, ни клавиатуры, только карта памяти и питание!
Спасибо, всё очень круто! Внесём доработки в официальную прошивку Репки!
И ждём с нетерпением обещанное продолжение про Ansible !!!!
Репка 1.5, 2 Гб ОЗУ, Тестовая прошивка от 01.09.2023(В данной прошивке поднята частота работы оперативной памяти на 24 МГц, максимальная частота процессора до 1.464 ГГц) с активным охлаждением.
Подключение к WiFi стабильное и не отваливается. Но вот скорость оставляет желать лучшего.
При подключении к Wi Fi проверяю скорость соединения speedtest-ом и вижу 0.1 МБ/сек или меньше, это при 100 МБитах от провайдера. Разрываю соединение и соединяюсь снова. Опять speedtest-ом проверяю: 1.2 МБита или меньше. После очередного отключения/включения WiFi скорость соединения становится 45...55 МБит/сек. Чудеса, да и только. Что это может быть? Не подскажите?
Вы можете попробовать - вышла статья по автоматизированной настройке репки с нуля:
https://repka-pi.ru/blog/post/53
Если заработает нормально, то значит что-то в текущих конфигах не так. Если же не заработает, то либо дело в железе, либо в роутере
Спасибо.