WiFi kanaal 13 & 14 op Alpine Linux aka ik kan geen verbinding maken met mijn router aka crda configuratie
Samenvatting
Tijdens het ontwikkelen van een embedded, alleen-lezen testsysteem voor een Pi Zero W WLAN poort modificatie die we voor een klant hebben gedaan, stuitte ik op een interessant probleem.
De Pi Zero W maakte plotseling geen verbinding meer met onze router.
Na wat onderzoek, ben ik er in geslaagd om de reden te vinden, en te repareren.
De reden: WLAN regelgevende domeinen
In verschillende landen zijn verschillende WiFi "kanalen" (= frequenties) beschikbaar voor gebruik.
Wikipedia heeft een goed overzicht:
https://en.wikipedia.org/wiki/List_of_WLAN_channels#2.4_GHz_(802.11b/g/n)
Voor 2,4 GHz zijn kanaal 12 en 13 niet beschikbaar in de VS, maar wel in de meeste andere landen.
Als u uw WLAN-apparaten / Raspberry Pi's op de standaardinstellingen laat staan, zullen ze aannemen dat ze geen verbinding mogen maken met deze kanalen. Ze hebben geen enkele manier om te weten waar ze zijn totdat u het hen vertelt, en kiezen dus de veilige "wereldwijd" optie in uw belang.
Als uw router daarentegen op kanaal 12 of 13 is geconfigureerd, kan uw Raspberry Pi Zero W (of elke andere Pi, inclusief de Pi 3 B+) uw router niet zien.
Maar ik heb mijn router niet ingesteld om dit kanaal te gebruiken
Ik ook niet. Alles werkte prima tot ongeveer 4 uur 's nachts - toen besloot de router plotseling dat hij naar dit kanaal wilde overschakelen, omdat er minder storing is van buren.
Uw router kan plotseling overschakelen, en u zult een moeilijk probleem moeten onderzoeken.
Hoe kan ik bepalen of dit mijn probleem is?
Gebruik een WLAN scantool.
Ik gebruik inSSIDer voor Home. Helaas schijnt het niet meer gratis te zijn, maar er zijn alternatieven.
Zoals je in deze schermafbeelding kunt zien gebruikt ons netwerk kanalen 13 en 9. (Omdat het een 802.11 n netwerk is dat channel bonding gebruikt voor twee 20 MHz brede kanalen).
Kanaal 13 is niet beschikbaar in de VS, en dus ook niet standaard op de Raspberry Pi.
De oplossing: CRDA
U moet enkele pakketten installeren, en ze op de juiste manier instellen, om het WiFi land in te stellen.
Op Raspbian is dit zeer eenvoudig en rechttoe rechtaan, aangezien alle noodzakelijke pakketten reeds voorgeïnstalleerd zijn.
Gebruik sudo raspi-config als een hulpmiddel om het WiFi land in te stellen.
Op Alpine Linux, is wat meer werk nodig. Ik zal je er in deze blogpost stap voor stap doorheen leiden, om te delen wat ik geleerd heb, en wat me ongeveer een hele dag werk kostte om te leren. Hopelijk ben je in 20 minuten of minder klaar.
Er zullen nog meer blog posts volgen over Alpine Linux op de Raspberry Pi, voor nu richten we ons op dit specifieke WiFi connectiviteitsprobleem voor Europese burgers.
Draaien als root
In de volgende handleiding ga ik ervan uit dat je de bewerkingen uitvoert als gebruiker root.
Als je geen root bent, word dan root als dat nodig is.
Een opmerking over het RAM-only bestandssysteem van Alpine
Alpine Linux heeft het grote voordeel dat het volledig read-only kan draaien vanaf je SD-kaart. Dit betekent bijvoorbeeld dat u de Raspberry Pi tijdens het gebruik kunt loskoppelen zonder het bestandssysteem te beschadigen.
Natuurlijk moet er een mogelijkheid zijn om uw wijzigingen tijdens de ontwikkeling op het basissysteem toe te passen.
Het commando is:
lbu commit -d
Belangrijk: lbu commit nodig kunnen hebben om te worden ingesteld om specifieke subdirectories die worden gewijzigd (met behulp van lbu include - zie de onderstaande link voor details).
Zie de volgende bladzijde voor meer details:
Repositories opzetten
opmerking: standaard is alleen vi geïnstalleerd op Alpine Linux. Als u nano wilt toevoegen, gebruikt u het volgende commando:
apk add nano
Bewerk de repositories (schakel vi over met nano als je dat geïnstalleerd hebt):
vi /etc/apk/repositories
Voeg het volgende toe / vervang het volgende (lees de opmerking onderaan voor meer info):
/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
Alle drie de edge repositories zijn nodig, omdat verschillende pakketten in verschillende repositories staan.
Installeer de nodige pakketten
Voer het volgende commando uit:
apk add wireless-regdb crda iw
Uitleg:
- wireless-regdb bevat de binaire bestanden van de database voor draadloze regelgeving.
- crda is het gebruikersruimtehulpmiddel dat regelgevingsinformatie voor de kernel bijwerkt
- iw zijn hulpprogramma's voor draadloze configuratie, die u zult gebruiken om het regelgevingsdomein (land) in te stellen
Controleer de huidige regelgeving
Rennen:
iw reg get
Dit zal het huidige domein tonen (hoogstwaarschijnlijk land 00: DFS-UNSET). Hier is een screenshot van wat we beogen (in ons geval DE voor Duitsland):
Bewerk mdev regels
In het volgende is de positie van het nieuwe item zeer belangrijk - het moet helemaal bovenaan staan, net voor de $MODALIAS lijn. Anders zal dit niet werken!!!
vi /etc/mdev.conf
voeg de volgende nieuwe regel in, net voor de regel $MODALIAS:
$COUNTRY=.. root:root 0660 */sbin/crda
Hier is een screenshot van het bewerkte bestand:
Referentie:
- http://lists.alpinelinux.org/alpine-devel/5092.html
- https://blog.w1r3.net/2018/02/11/getting-crda-regdb-working-on-alpine.html
- (helaas wordt de locatie van de nieuwe mdev.conf regel niet vermeld - ik heb er enkele uren aan zitten debuggen!)
Maak een nieuw modprobe.d item
Rennen:
touch /etc/modprobe.d/cfg80211.conf
vi /etc/modprobe.d/cfg80211.conf
De volgende regel invoegen (indien nodig DE aanpassen aan uw land - tweelettercode):
options cfg80211 ieee80211_regdom=DE
Sla het bestand op.
Dit bestand zal ervoor zorgen dat uw regelgevend domein correct wordt toegepast bij het opstarten.
Referentie:
- https://linux.die.net/man/8/crda - zegt dat de landcode een ISO/IEC 3166 alpha2 landcode is
Alternatief: iw
Als alternatief kunt u het reglementaire domein instellen met iw (misschien nodig als aanvulling op het bovenstaande? Mijn test toont echter aan dat dit niet blijft hangen).
iw reg set DE
Hier is een screenshot:
Afronden
Uitvoeren (indien nodig):
lbu commit -d
Herstart. Uw Pi Zero W zou nu ook verbinding moeten kunnen maken met kanaal 12 en kanaal 13!
Een opmerking over crda
crda is niet wordt verondersteld door u, de gebruiker, te worden uitgevoerd. Het wordt uitgevoerd als een hulptoepassing door iw.
Een ruwe hack die "misschien" werkt bij het debuggen volgt. Het werkt, soms. Zelden, eigenlijk.
iw reg set DE ; COUNTRY=DE /sbin/crda
vaak mislukte het bij mij met de volgende uitvoer:
niet gelukt om regelgevend domein in te stellen -22
Zelfs nu, nadat ik het land goed kan instellen, zal dit commando meestal falen ... Ik neem aan dat het te wijten is aan race conditions.
Voor zover ik het begrijp, iw stelt bepaalde omgevingsvariabelen in, die op hun beurt mdev triggeren om /sbin/crda uit te voeren, om deze veranderingen naar de kernel te sturen.
iw is niet het enige gereedschap dat het reguleringsdomein voor de kernel kan veranderen; wpa-supplicant wordt ook verondersteld dit te kunnen doen.
En, zoals je hebt gezien, is cfg80211.conf ook in staat om het te doen.
De regelgevende.bin is geïnstalleerd in /usr/lib/crda.
U hebt het pakket crda-dev NIET nodig voor de oplossing die in deze blogpost wordt beschreven.
Een opmerking over het archiefbestand
Als je de archiefbronnen die in het begin zijn toegevoegd verwijdert / becommentarieert, "verdwijnen" de pakketten van je systeem.
Ik zal dit verder moeten onderzoeken, aangezien ik net met Alpine Linux ben begonnen te werken.
Verwijder voorlopig geen regels uit de repository voor pakketten die je op je systeem hebt geïnstalleerd.