Canale WiFi 13 & 14 su Alpine Linux aka non posso connettermi al mio router aka configurazione crda
Riassunto
Durante lo sviluppo di un sistema di test embedded di sola lettura per una modifica della porta WLAN del Pi Zero WLAN che abbiamo fatto per un cliente, mi sono imbattuto in un problema interessante.
Il Pi Zero W ha improvvisamente smesso di connettersi al nostro router.
Dopo alcune indagini, sono riuscito a trovare la ragione e a risolvere il problema.
Il motivo: Domini normativi WLAN
In diversi paesi, diversi "canali" (= frequenze) WiFi sono disponibili per l'uso.
Wikipedia ha una buona panoramica:
https://en.wikipedia.org/wiki/List_of_WLAN_channels#2.4_GHz_(802.11b/g/n)
Per 2,4 GHz i canali 12 e 13 non sono disponibili negli Stati Uniti, ma lo sono nella maggior parte degli altri paesi.
Se lasciate i vostri dispositivi WLAN / Raspberry Pi su impostazioni predefinite, essi assumeranno che non sono autorizzati a connettersi a questi canali. Non hanno modo di sapere dove sono finché non glielo dici, e quindi scelgono l'opzione sicura "worldwide" nel tuo interesse.
Se il tuo router, d'altra parte, è configurato sul canale 12 o 13, il tuo Raspberry Pi Zero W (o qualsiasi altro Pi, incluso il Pi 3 B+) non sarà in grado di vedere il tuo router.
Ma non ho impostato il mio router per utilizzare questo canale
Nemmeno io. Tutto funzionava bene fino alle 4 del mattino circa - poi il router ha improvvisamente deciso di passare a questo canale, dato che c'è meno interferenza da parte dei vicini.
Il vostro router potrebbe cambiare improvvisamente, e vi troverete a indagare su un problema difficile.
Come posso determinare se questo è il mio problema?
Utilizzare uno strumento di scansione WLAN.
Io uso inSSIDer per la casa. Purtroppo non sembra essere più gratuito, ma ci sono alternative là fuori.
Come potete vedere in questo screenshot la nostra rete usa canali 13 e 9. (Perché è una rete 802.11 n che usa il channel bonding per due canali di 20 MHz di larghezza).
Il canale 13 non è disponibile negli Stati Uniti, e quindi non sul Raspberry Pi di default.
La soluzione: CRDA
È necessario installare alcuni pacchetti, e impostarli in modo appropriato, per impostare il paese WiFi.
Su Raspbian, questo è molto facile e diretto, poiché tutti i pacchetti necessari sono stati preinstallati per voi.
Usate sudo raspi-config come strumento per impostare il paese WiFi.
Su Alpine Linux, è necessario un po' più di lavoro. Vi guiderò passo dopo passo in questo blogpost, per condividere ciò che ho imparato, e che mi ha richiesto circa un giorno intero di lavoro per imparare. Si spera che avrete finito in 20 minuti o meno.
Ci saranno altri post sul blog su Alpine Linux su Raspberry Pi, per ora ci concentriamo su questo specifico problema di connettività WiFi per i cittadini europei.
In esecuzione come root
Nel seguente tutorial, assumo che si eseguano le operazioni come utente radice.
Se non siete root, diventate root a seconda dei casi.
Una nota sul file system solo RAM di Alpine
Alpine Linux ha il grande vantaggio di poter essere eseguito completamente in sola lettura dalla scheda SD. Questo significa, per esempio, che è possibile scollegare il Raspberry Pi durante il funzionamento senza corrompere il file system.
Naturalmente ci deve essere la possibilità di applicare le vostre modifiche al sistema di base durante lo sviluppo.
Il comando è:
lbu commit -d
Importante: lbu commit potrebbe essere necessario essere impostato per salvare sottodirectory specifiche che vengono modificati (usando lbu include - fare riferimento al link qui sotto per i dettagli).
Fate riferimento alla pagina seguente per maggiori dettagli:
Impostare i repository
nota: per default solo vi è installato su Alpine Linux. Se vuoi aggiungere nano, usa il seguente comando:
apk aggiungere nano
Modifica i repository (cambia vi con nano se lo hai installato):
vi /etc/apk/repositories
Aggiungi/sostituisci quanto segue (leggi il commento in fondo per maggiori informazioni):
/media/mmcblk0p1/apks
http://dl-3.alpinelinux.org/alpine/edge/testing
http://dl-3.alpinelinux.org/alpine/edge/main
http://dl-3.alpinelinux.org/alpine/edge/community
Tutti e tre i repository di bordo sono necessari, poiché diversi pacchetti risiedono in diversi repository.
Installare i pacchetti necessari
Eseguite il seguente comando:
apk add wireless-regdb crda iw
Spiegazione:
- wireless-regdb contiene i binari del database normativo wireless.
- crda è lo strumento dello spazio utente che aggiorna le informazioni normative per il kernel
- iw sono utilità di configurazione wireless, che userete per impostare il dominio normativo (paese)
Controllare il dominio normativo attuale
Corri:
iw reg get
Questo mostrerà il dominio corrente (molto probabilmente il paese 00: DFS-UNSET). Ecco uno screenshot di ciò a cui miriamo (nel nostro caso DE per la Germania):
Modifica delle regole di mdev
Di seguito, la posizione della nuova voce è molto importante - deve essere in cima, proprio prima di la linea $MODALIAS. Altrimenti questo non funzionerà!
vi /etc/mdev.conf
inserire la seguente nuova linea appena prima della linea $MODALIAS:
$COUNTRY=.. root:root 0660 */sbin/crda
Ecco uno screenshot del file modificato:
Riferimento:
- http://lists.alpinelinux.org/alpine-devel/5092.html
- https://blog.w1r3.net/2018/02/11/getting-crda-regdb-working-on-alpine.html
- (purtroppo non menziona la posizione della nuova linea mdev.conf - mi ha fatto fare il debug per diverse ore!)
Creare una nuova voce in modprobe.d
Corri:
toccare /etc/modprobe.d/cfg80211.conf
vi /etc/modprobe.d/cfg80211.conf
Inserite la seguente riga (se necessario adattate DE al vostro paese - codice di due lettere):
opzioni cfg80211 ieee80211_regdom=DE
Salvare il file.
Questo file assicurerà che il vostro dominio normativo sia applicato correttamente all'avvio.
Riferimento:
- https://linux.die.net/man/8/crda - dice che il codice paese è un codice paese ISO / IEC 3166 alpha2
In alternativa: iw
In alternativa puoi impostare il dominio di regolamentazione usando iw (potrebbe essere necessario in aggiunta a quanto sopra? Il mio test mostra che questo non si attacca, però).
iw reg set DE
Ecco uno screenshot:
Finalizzare
Esegui (se necessario):
lbu commit -d
Riavviare. Il tuo Pi Zero W dovrebbe ora essere in grado di connettersi al canale 12 e al canale 13!
Una nota su crda
crda è non dovrebbe essere eseguito da voi, l'utente. Viene eseguito come applicazione di aiuto da iw.
Segue un hack rozzo che "potrebbe" funzionare durante il debug. Funziona, a volte. Raramente, in realtà.
iw reg set DE ; COUNTRY=DE /sbin/crda
spesso falliva per me con il seguente output:
non è riuscito a impostare il dominio di regolamentazione -22
Anche ora, dopo che posso impostare correttamente il paese, questo comando fallisce la maggior parte delle volte ... presumo che sia dovuto a condizioni di gara.
Per quanto ne so io, iw imposta alcune variabili d'ambiente, che a loro volta fanno sì che mdev esegua /sbin/crda, per inviare questi cambiamenti al kernel.
iw non è l'unico strumento che può cambiare il dominio di regolamentazione del kernel; anche wpa-supplicant dovrebbe essere in grado di farlo.
E, come avete visto, anche cfg80211.conf è in grado di farlo.
Il regulatory.bin è installato in /usr/lib/crda.
NON avete bisogno del pacchetto crda-dev per la soluzione descritta in questo post del blog.
Una nota sul file repository
Se rimuovete / commentate le fonti del repository che sono state aggiunte all'inizio, i pacchetti "spariscono" dal vostro sistema.
Avrò bisogno di indagare ulteriormente, dato che ho appena iniziato a lavorare con Alpine Linux.
Per ora, non rimuovere le linee del repository per i pacchetti che hai installato sul tuo sistema.