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ç: com aïllar la capa que falla i un watchdog systemd que recupera la xarxa sol.

hpServer: la Wi-Fi que es caïa i com es cura sola

Fa pocs dies hpServer va desaparèixer de la xarxa. SSH no responia, Tailscale el veia a la llista però no contestava ni un ping, i els serveis que en depenien es van quedar penjats (el montatge SSHFS des de fxserver, per exemple, va congelar tot el que el tocava). Tot apuntava a una màquina morta. No ho era: Debian seguia funcionant perfectament. El que fallava era una sola capa, molt a baix de tot: l’enllaç Wi-Fi.

Aquesta nota és doble: el ressò del diagnòstic complet i una referència pràctica —per al meu jo del futur i per a qualsevol que tengui un adaptador Realtek USB semblant— de com localitzar el problema i com muntar un sistema que es recupera sol.

La part didàctica: quina capa ha fallat?

Quan un servidor “desapareix”, la pregunta clau no és què ha fallat sinó a quina capa. De dalt a baix tenim aplicacions, serveis de xarxa (DNS, VPN, túnels), IP, i finalment l’enllaç físic. La regla que vaig aplicar:

Si l’enllaç ha caigut, tot el que hi ha per sobre cau amb ell. Comença sempre per la capa més baixa que puguis comprovar.

En aquest cas, durant una caída la interfaz quedava així:

wlx6c5ab074f239: <NO-CARRIER,BROADCAST,MULTICAST,UP>
state DOWN
Not connected.

i el ping al router donava La red es inaccesible. Això va tornar irrellevants de cop Tailscale, Cloudflare, el DNS i el DHCP: tots depenen que l’enllaç funcioni abans.

Descartant sospitosos

Vaig anar tancant portes una a una:

  • UFW: als logs hi havia molts [UFW BLOCK], però eren trànsit local bloquejat per disseny. No expliquen el fallo del firmware.
  • Ahorro d’energia: ja tenia power_save off a la interfaz i disable_lps_deep=Y al mòdul rtw88_core.
  • Port USB: el problema es repetia en ports distints, i durant les caídes el dispositiu seguia present i negociant a 5000M.
  • Senyal: entre -57 i -60 dBm a 5 GHz. Raonable.
  • Firmware: firmware-realtek 20250410-2, actualitzat.
  • Kernel: vaig passar de 6.12.73 a 6.12.107 amb l’esperança que fos una regressió arreglada. El problema es va reproduir igual.

La pista que ho va lligar tot

Al journalctl del kernel, cada caída deixava el mateix rastre:

rtw_8822bu 2-2:1.0: failed to get tx report from firmware
wlx6c5ab074f239: send auth to 78:81:02:44:b3:35 (try 1/3)
wlx6c5ab074f239: authentication with 78:81:02:44:b3:35 timed out

El firmware deixa de contestar, l’associació es perd i els reintents acaben en timeout. I aquí el descobriment important: ifdown + ifup NO recuperen la connexió (es queda a waiting for carrier... timed out). Reiniciar la configuració no toca el que està trencat.

El que sí funciona és reinicialitzar el driver:

sudo modprobe -r rtw88_8822bu
sudo modprobe rtw88_8822bu

Després d’això, el Wi-Fi torna a associar-se sol i el ping al router torna en segons. Això apunta el problema al estat intern de la combinació adaptador/driver/firmware: TP-Link 2357:0138 (Realtek RTL8822BU), driver rtw88_8822bu, firmware 27.2.0.

El watchdog: que es recuperi sol

Mentre investigo la causa de fons, hpServer ara es cura sol. La lógica: fer ping al router (no a 8.8.8.8, per no reiniciar el Wi-Fi per un tall extern d’internet), confirmar amb una segona comprovació, i si de veritat ha caigut, baixar la interfaz, recarregar el mòdul i tornar-la a pujar.

/usr/local/sbin/wifi-watchdog.sh:

#!/bin/bash

IFACE="wlx6c5ab074f239"
ROUTER="192.168.0.1"
MODULE="rtw88_8822bu"
LOG_TAG="wifi-watchdog"

# Si el router responde, todo está bien.
if ping -I "$IFACE" -c 2 -W 2 "$ROUTER" >/dev/null 2>&1; then
    exit 0
fi

logger -t "$LOG_TAG" "Wi-Fi sin conexión. Esperando 10 segundos antes de confirmar..."

# Evitar actuar por un microcorte.
sleep 10

if ping -I "$IFACE" -c 2 -W 2 "$ROUTER" >/dev/null 2>&1; then
    logger -t "$LOG_TAG" "La conexión se ha recuperado sola."
    exit 0
fi

logger -t "$LOG_TAG" "Wi-Fi sigue caído. Reiniciando módulo $MODULE..."

# Limpiar el estado de la interfaz.
ifdown --force "$IFACE" >/dev/null 2>&1 || true

# Reinicializar el adaptador.
modprobe -r "$MODULE"

sleep 2

modprobe "$MODULE"

# Esperar a que vuelva a inicializarse la interfaz.
sleep 5

# Levantar la conexión.
ifup "$IFACE" >/dev/null 2>&1 || true

sleep 10

# Comprobar resultado.
if ping -I "$IFACE" -c 2 -W 2 "$ROUTER" >/dev/null 2>&1; then
    logger -t "$LOG_TAG" "Wi-Fi recuperado correctamente."
    exit 0
else
    logger -t "$LOG_TAG" "ERROR: no se ha podido recuperar el Wi-Fi."
    exit 1
fi

El servei i el timer de systemd, cada minut:

# /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

Activació:

sudo systemctl daemon-reload
sudo systemctl enable --now wifi-watchdog.timer
systemctl status wifi-watchdog.timer   # Active: active (waiting)

La prova controlada

Per confiar-hi cal veure’l treballar. Simules una caida i no toques res:

sudo ifdown --force wlx6c5ab074f239

En un minut o dos, el timer ho detecta, recarrega el mòdul i recupera la xarxa. Als logs hi ha d’aparèixer la seqüència completa:

sudo journalctl -t wifi-watchdog --since "-5 minutes"
Wi-Fi sin conexión. Esperando 10 segundos antes de confirmar...
Wi-Fi sigue caído. Reiniciando módulo rtw88_8822bu...
Wi-Fi recuperado correctamente.

Quan tot va bé, el watchdog és mut: si no diu res, és que tot va bé.

Referència ràpida per a la propera vegada

# estat de l'enllaç Wi-Fi
sudo /usr/sbin/iw dev wlx6c5ab074f239 link

# power save (ha de ser off)
sudo /usr/sbin/iw dev wlx6c5ab074f239 get power_save

# driver i firmware en ús
sudo ethtool -i wlx6c5ab074f239

# errors Wi-Fi del arranque actual
sudo journalctl -k -b --no-pager | grep -Ei 'rtw|8822|wlx|deauth|disassoc|auth|firmware|usb' | tail -100

# logs del watchdog (avui / tots)
sudo journalctl -t wifi-watchdog --since today
sudo journalctl -t wifi-watchdog

# recuperació manual comprovada
sudo ifdown --force wlx6c5ab074f239
sudo modprobe -r rtw88_8822bu
sleep 2
sudo modprobe rtw88_8822bu
sleep 5
sudo ifup wlx6c5ab074f239

Estat actual i què faré si continua

Ara mateix: connexió estable a 5 GHz amb el watchdog operatiu. Si el problema torna (el watchdog ho registrarà), els logs acumulats em diran freqüència i patró per decidir si toca investigar una regressió concreta de rtw88_8822bu, provar un kernel diferent, ajustar opcions de rtw88_usb, o directament canviar a un adaptador amb un chipset millor suportat.

La lliçó que em quedo és la mateixa de la nota sobre servidors que no responen: la xarxa és un sistema. Aquest cop la peça caiguda era l’adaptador Wi-Fi, i tot el que hi penjava —Tailscale, SSH, els meus montatges— va fer que semblés una mort clínica quan només era un desmai. Diagnosticar per capes, descartar amb proves, i deixar el sistema capaç de curar-se sol mentre continues investigant.