это перепост заметки, оригинал находится на моем сайте: http://lleo.me/dnevnik/2016/06/04.htmlСкучный пост для айтишников, сразу предупреждаю. Пару месяцев назад я рассказывал, что в качестве роутера у меня работает системная платка Banana BPI-R1, и только глючок у нее с WiFi - иногда виснет. К сожалению, колдовство и компиляция драйверов не помогли - вайфай как вис, так и виснет, иногда раз в сутки, иногда раз в несколько дней.
Питание платы было заменено на прекрасное - по питанию нареканий нет. Возможно, портят дело какие-то другие устройства на USB-шинах, у меня их, увы, много висит. Почему-то контроллер WiFi интегрирован на плате, но видится как USB-устройство. Контроллер называется 0bda:8178 Realtek Semiconductor Corp. RTL8192CU 802.11n WLAN Adapter. В интернете встречаются упоминания о плохой работе RTL8192CU с hostapd, но я пока не нашел эффективного средства, кроме как перегрузить сервер.
Потом по совету Кирилла я стал просто делать такие махинации:
/sbin/ifconfig wlan0 down
/sbin/ifconfig wlan0 up
/usr/sbin/service hostapd restart
Этого оказалось достаточно, чтобы снова поднять WiFi без полной перезагрузки. Поизучав логи, я понял, что во-первых, ничего в логах не смыслю. Во-вторых, когда WiFi зависает, а устройства (мобильник, например) пытается раз за разом соединиться, чтобы получить адрес, в /var/log/daemon.log сыплются такие строки:
May 29 12:29:46 banana hostapd: wlan0: STA 3c:40:8e:75:b9:c3 IEEE 802.11: associated
May 29 12:29:50 banana hostapd: wlan0: STA 3c:40:8e:75:b9:c3 IEEE 802.11: disassociated
May 29 12:29:51 banana hostapd: wlan0: STA 3c:40:8e:75:b9:c3 IEEE 802.11: associated
May 29 12:29:55 banana hostapd: wlan0: STA 3c:40:8e:75:b9:c3 IEEE 802.11: disassociated
May 29 12:29:56 banana hostapd: wlan0: STA 3c:40:8e:75:b9:c3 IEEE 802.11: associated
May 29 12:30:00 banana hostapd: wlan0: STA 3c:40:8e:75:b9:c3 IEEE 802.11: disassociated
May 29 12:30:01 banana hostapd: wlan0: STA 3c:40:8e:75:b9:c3 IEEE 802.11: associated
May 29 12:30:05 banana hostapd: wlan0: STA 3c:40:8e:75:b9:c3 IEEE 802.11: disassociated
May 29 12:30:06 banana hostapd: wlan0: STA 3c:40:8e:75:b9:c3 IEEE 802.11: associated
May 29 12:30:11 banana hostapd: wlan0: STA 3c:40:8e:75:b9:c3 IEEE 802.11: disassociated
May 29 12:30:11 banana hostapd: wlan0: STA 3c:40:8e:75:b9:c3 IEEE 802.11: associated
May 29 12:30:15 banana hostapd: wlan0: STA 3c:40:8e:75:b9:c3 IEEE 802.11: disassociated
May 29 12:30:17 banana hostapd: wlan0: STA 3c:40:8e:75:b9:c3 IEEE 802.11: associated
Поскольку зависания сетки задолбали всех (меня, домочадцев, гостей дома, а также погодную станцию, висящую за окном), а решения проблемы не видно, то я принял решение построить костыли и просто выполнять перезапуск wlan0 при появлении в логе признаков зависания. К сожалению, shell-скрипты на основе tail -f | grep -q мне соорудить не удалось в силу нетривиальности задачи. Поэтому пришлось взять ненавистный мною язык C и написать демон-костыль. Выкладываю, может кому-то пригодится. Запускается от рута при старте системы:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>#define BUFLEN 2048
#define REREAD 50
#define REREADC 5000
void LLOG(char* s) { printf("%s\n",s); }
int main(int argc, char* argv[]) {
int i,kel=0,cn=-1,cn2=-1;
char openflag=0, *result, *msg = malloc (BUFLEN+1);
const char *str1="IEEE 802.11: associated";
const char *str2="IEEE 802.11: disassociated";
const char *logfile="/var/log/daemon.log";
const time_t timer = time(NULL); sprintf(msg,"+++ Start: %s",ctime(&timer)); LLOG(msg);
FILE *fp;
while(1) {
if(cn<0||cn2<0) { LLOG("+++ Reload");
if(openflag) { fclose(fp); openflag=0; LLOG("+++ Close file"); }
if((fp=fopen(logfile,"r"))==NULL) { sprintf(msg,"+++ %s+++ error open: %s",ctime(&timer),logfile); LLOG(msg); sleep(2); continue; } // открыть не удалось
openflag=1; // открыть удалось
fseek(fp,0L,SEEK_END); // в конец файла
cn=REREAD; cn2=REREADC;
}
cn2--;
if(!openflag || NULL==fgets(msg,BUFLEN,fp)) { sleep(1); continue; } // прочесть не удалось - и ладно
LLOG(msg); // что прочли
cn--;
for(i=0;i<BUFLEN;i++) { if(!msg[i] ||msg[i]==0x0d||msg[i]==0x0a) break; printf("%c",msg[i]); } printf("\n");
if(NULL!=strstr(msg,str1)) { kel=1; continue; } // найдена первая строка
if(NULL!=strstr(msg,str2)) { if(kel==1) { LLOG("*** CATCH ***");
system("/sbin/ifconfig wlan0 down"); sleep(1); // опустить wlan0
system("/sbin/ifconfig wlan0 up"); sleep(1); // поднять wlan0
system("/usr/sbin/service hostapd restart"); // перестартовать hostapd
system("mpg123 /home/audio/samples/jitie-moe.mp3"); // ну и сыграть звук в колонки
} kel=2; cn=-1; }
else kel=0;
}
}
Второй день зависаний нет. Один раз тихо вздохнуло в коридоре "Житие-мое" (сэмпл из "Иван Васильевич меняет професссию") - значит, отработало. В остальном Banana BPI-R1 показала прекрасные результаты, поскольку основная работа сего квартирного сервера (помимо чисто серверных и архивных задач) - быть шлюзом и хабом на 5 портов Ethernet. Это лучший сервер, что был у меня - надежный, компактный, малопотребляющий и абсолютно бесшумный. В ближайших планах - привесить к нему двухстрочный дисплей и кучу электроники к GPIO.
это перепост заметки, оригинал находится на моем сайте: http://lleo.me/dnevnik/2016/06/04.html