Sistemes
hpServer: la Wi-Fi que es caïa i com es cura sola
Diagnòstic complet d''un adaptador Realtek RTL8822BU que perdia l''enllaç:
5 min de lectura
Fa pocs dies el meu servidor es quedava sol. De cop, i sense cap motiu aparent, deixava de respondre: no hi podia entrar des del meu ordinador, els serveis que en depenien es penjaven i durant una estona va semblar que la màquina havia mort.
No era morta. Seguia encesa i funcionant. L'únic que fallava era la seva connexió a la xarxa: un petit adaptador Wi-Fi connectat per USB. Aquesta és la història de com ho vaig descobrir i de com li vaig muntar un sistema que es repara sol.
Què és hpServer i per què m'importa
hpServer és un ordinador vell reconvertit en servidor domèstic. Hi corren serveis interns de casa —emmagatzematge, proves, automatitzacions— i hi accedeixo des de qualsevol lloc: per SSH (la manera d'entrar a un ordinador remot com si hi fossis davant) i per Tailscale (una xarxa privada que connecta tots els meus equips com si estiguessin a la mateixa habitació). Aclariment per si algú se'l pregunta: aquesta web que estàs llegint no viu aquí, sinó a fxserver, un altre dels meus servidors. Quan hpServer cau, diverses coses de casa deixen de funcionar alhora, i sempre sembla pitjor del que és.
Com saber què ha fallat: pensar per capes
Quan internet falla, la culpa pot ser de molts llocs: l'ordinador, el seu adaptador, el router, el proveïdor... Una connexió és com una cadena: si un eslabó es trenca, tot el que ve després deixa de funcionar. El truc és trobar el primer eslabó trencat, perquè és l'únic que cal arreglar.
Durant una caiguda vaig mirar l'estat del Wi-Fi i vaig veure això:
wlx6c5ab074f239: <NO-CARRIER,BROADCAST,MULTICAST,UP>
state DOWN
Not connected.
Traduït: el sistema demanava a l'adaptador "connecta't" i l'adaptador no podia. El ping al router (un "hi ets?" que serveix per comprovar si una màquina contesta) tampoc rebia resposta. Amb això vaig descartar de cop tot el que venia després: el router, el proveïdor, la meva xarxa privada... El problema era el primer eslabó: l'adaptador.
Descartant sospitosos
Tot i així, vaig anar tancant portes una a una:
- Estalvi d'energia: ja el tenia desactivat (de vegades el sistema "adorm" els adaptadors per gastar menys).
- El port USB: el problema es repetia a ports diferents.
- La senyal: bona, amb força de sobra.
- El programari del sistema: actualitzat. Fins i tot vaig provar una versió més nova del sistema sencer. El problema va seguir igual.
La pista definitiva
El sistema guarda un diari de tot el que passa (els famosos "logs"). En aquell diari, cada caiguda deixava el mateix missatge: l'adaptador demana una confirmació a un mini-programa que viu dins seu (el "firmware") i no rep resposta. És com parlar amb algú que s'ha adormit.
I aquí el descobriment important: reiniciar la connexió no servia de res. El que funcionava era apagar i encendre el programari de l'adaptador (el "driver": el programa que fa de traductor entre el sistema i l'aparell). Com apagar i encendre el router de casa, però només de l'adaptador.
La solució: un vigilant automàtic
Com que el problema tornaria a passar, volia que el servidor es curés sol. Per això vaig muntar un "watchdog", literalment un gos guardià: un programa petit que cada minut es fa una pregunta molt senzilla —hi ha xarxa?— i si la resposta és no dues vegades seguides, apaga i encén l'adaptador. En un minut o dos, la connexió torna.
Aquest és el guió que segueix (la idea és al paràgraf anterior; els detalls, al codi):
#!/bin/bash
IFACE="wlx6c5ab074f239"
ROUTER="192.168.0.1"
MODULE="rtw88_8822bu"
LOG_TAG="wifi-watchdog"
# Si el router respon, tot va bé.
if ping -I "$IFACE" -c 2 -W 2 "$ROUTER" >/dev/null 2>&1; then
exit 0
fi
logger -t "$LOG_TAG" "Wi-Fi sense connexió. Esperant 10 segons abans de confirmar..."
# Evitar actuar per un microtall.
sleep 10
if ping -I "$IFACE" -c 2 -W 2 "$ROUTER" >/dev/null 2>&1; then
logger -t "$LOG_TAG" "La connexió s'ha recuperat sola."
exit 0
fi
logger -t "$LOG_TAG" "El Wi-Fi continua caigut. Reiniciant el mòdul $MODULE..."
ifdown --force "$IFACE" >/dev/null 2>&1 || true
modprobe -r "$MODULE"
sleep 2
modprobe "$MODULE"
sleep 5
ifup "$IFACE" >/dev/null 2>&1 || true
sleep 10
if ping -I "$IFACE" -c 2 -W 2 "$ROUTER" >/dev/null 2>&1; then
logger -t "$LOG_TAG" "Wi-Fi recuperat correctament."
exit 0
else
logger -t "$LOG_TAG" "ERROR: no s'ha pogut recuperar el Wi-Fi."
exit 1
fi
Fixa't en un detall: el ping va al router, no a internet. Si un dia cau internet de tota la casa, el vigilant no toca res: només actua quan el problema és intern, que és l'únic que pot arreglar.
Perquè s'executi sol cada minut faig servir el planificador de tasques del sistema (systemd), amb dos fitxers molt curts:
# /etc/systemd/system/wifi-watchdog.service
[Unit]
Description=HPServer Wi-Fi watchdog
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/wifi-watchdog.sh
# /etc/systemd/system/wifi-watchdog.timer
[Unit]
Description=Comprobar Wi-Fi de HPServer cada minuto
[Timer]
OnBootSec=2min
OnUnitActiveSec=1min
AccuracySec=5s
Persistent=true
[Install]
WantedBy=timers.target
sudo systemctl daemon-reload
sudo systemctl enable --now wifi-watchdog.timer
La prova
Muntar un sistema que s'auto-repara i confiar-hi a cegues és mala idea. Així que vaig fer una prova: vaig apagar la connexió a propòsit i vaig esperar sense tocar res.
sudo ifdown --force wlx6c5ab074f239
En poc més d'un minut, el vigilant ho va detectar, va recarregar l'adaptador i la xarxa va tornar. Al diari del sistema hi va quedar la seqüència completa:
Wi-Fi sense connexió. Esperant 10 segons abans de confirmar...
El Wi-Fi continua caigut. Reiniciant el mòdul rtw88_8822bu...
Wi-Fi recuperat correctament.
Quan tot va bé, el vigilant calla: si no diu res, és que tot va bé.
Per a la propera vegada
# està connectat el Wi-Fi i amb quina força?
sudo /usr/sbin/iw dev wlx6c5ab074f239 link
# els errors de xarxa del dia (el "diari" del sistema)
sudo journalctl -k -b --no-pager | grep -Ei 'rtw|8822|wlx|firmware' | tail -100
# què ha fet el vigilant
sudo journalctl -t wifi-watchdog --since today
# recuperar el Wi-Fi a mà (el mateix que fa el vigilant)
sudo modprobe -r rtw88_8822bu && sleep 2 && sudo modprobe rtw88_8822bu && sleep 5 && sudo ifup wlx6c5ab074f239
Què m'enduc
Quan alguna cosa "es mor" a casa, quasi mai és l'aparell sencer: és un sol eslabó de la cadena. I moltes vegades pots construir alguna cosa que l'arregli mentre dorms. Aquesta vegada l'eslabó era un adaptador Wi-Fi de vint euros; el vigilant, mitja hora de feina.
I la saga va continuar: a la nota següent, un router vell d'un calaix va acabar treballant al revés perquè el servidor deixés de dependre del Wi-Fi en el dia a dia.