Canal WiFi 13 & 14 sur Alpine Linux aka Je ne peux pas me connecter à mon routeur aka configuration crda
Résumé
En développant un système de test embarqué en lecture seule pour une modification du port WLAN d'un Pi Zero W que nous avons réalisée pour un client, j'ai rencontré un problème intéressant.
Le Pi Zero W a soudainement cessé de se connecter à notre routeur.
Après quelques recherches, j'ai réussi à trouver la raison et la solution.
La raison : Domaines réglementaires des WLAN
Dans différents pays, différents "canaux" (= fréquences) WiFi sont disponibles pour l'utilisation.
Wikipedia offre un bon aperçu :
https://en.wikipedia.org/wiki/List_of_WLAN_channels#2.4_GHz_(802.11b/g/n)
Pour les 2,4 GHz, les canaux 12 et 13 ne sont pas disponibles aux Etats-Unis, mais ils le sont dans la plupart des autres pays.
Si vous laissez vos périphériques WLAN / Raspberry Pi sur les paramètres par défaut, ils supposeront qu'ils ne sont pas autorisés à se connecter à ces canaux. Ils n'ont aucun moyen de savoir où ils se trouvent tant que vous ne leur dites pas, et choisissent donc l'option sûre "monde entier" dans votre intérêt.
Si votre routeur, en revanche, est configuré sur le canal 12 ou 13, votre Raspberry Pi Zero W (ou tout autre Pi d'ailleurs, y compris le Pi 3 B+) ne pourra pas voir votre routeur.
Mais je n'ai pas configuré mon routeur pour utiliser ce canal.
Tout fonctionnait bien jusqu'à environ 4 heures du matin, puis le routeur a soudainement décidé de passer sur ce canal, car il y a moins d'interférences avec les voisins.
Il se peut que votre routeur s'éteigne soudainement et que vous vous retrouviez à enquêter sur un problème difficile.
Comment puis-je déterminer si c'est mon problème ?
Utilisez un outil d'analyse du réseau local sans fil.
J'utilise inSSIDer pour la maison. Malheureusement, il ne semble plus être gratuit, mais il existe des alternatives.
Comme vous pouvez le voir dans cette capture d'écran, notre réseau utilise des canaux 13 et 9. (Parce qu'il s'agit d'un réseau 802.11 n qui utilise la liaison de canaux pour deux canaux de 20 MHz de large).
Le canal 13 n'est pas disponible aux États-Unis, et donc pas sur le Raspberry Pi par défaut.
La solution : CRDA
Vous devez installer certains paquets, et les configurer de manière appropriée, afin de définir le pays WiFi.
Sur Raspbian, c'est très facile et direct, puisque tous les paquets nécessaires ont été préinstallés pour vous.
Utilisez sudo raspi-config comme outil pour définir le pays WiFi.
Sur Alpine Linux, un peu plus de travail est nécessaire. Je vais vous guider pas à pas dans ce billet, pour partager ce que j'ai appris, et ce qui m'a pris environ une journée entière de travail pour apprendre. Avec un peu de chance, vous aurez terminé en 20 minutes ou moins.
Il y aura d'autres articles de blog sur Alpine Linux sur le Raspberry Pi, pour l'instant nous nous concentrons sur ce problème spécifique de connectivité WiFi pour les citoyens européens.
Exécution en tant que root
Dans le tutoriel suivant, je suppose que vous exécutez les opérations en tant qu'utilisateur racine.
Si vous n'êtes pas root, devenez root le cas échéant.
Une note sur le système de fichiers en RAM seulement d'Alpine
Alpine Linux a le grand avantage de pouvoir fonctionner complètement en lecture seule à partir de votre carte SD. Cela signifie, par exemple, que vous pouvez débrancher le Raspberry Pi en cours de fonctionnement sans corrompre le système de fichiers.
Bien sûr, il doit y avoir une possibilité d'appliquer vos changements au système de base pendant le développement.
La commande est :
lbu commit -d
Important : lbu commit pourrait avoir besoin à mettre en place pour économiser des sous-répertoires spécifiques qui sont modifiés (en utilisant lbu include - voir le lien ci-dessous pour plus de détails).
Consultez la page suivante pour plus de détails :
Configurer les référentiels
note : par défaut, seul vi est installé sur Alpine Linux. Si vous voulez ajouter nano, utilisez la commande suivante :
apk add nano
Editez les dépôts (remplacez vi par nano si vous l'avez installé) :
vi /etc/apk/repositories
Ajoutez / remplacez les éléments suivants (lisez le commentaire en bas de page pour plus d'informations) :
/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
Les trois dépôts de bord sont nécessaires, car les différents paquets résident dans des dépôts différents.
Installer les paquets nécessaires
Exécutez la commande suivante :
apk add wireless-regdb crda iw
Explication :
- wireless-regdb contient les binaires de la base de données réglementaire sans fil.
- crda est l'outil en espace utilisateur qui met à jour les informations réglementaires pour le noyau
- iw sont des utilitaires de configuration sans fil, que vous utiliserez pour définir le domaine réglementaire (pays)
Vérifier le domaine réglementaire actuel
Cours :
iw reg get
Cela montrera le domaine actuel (très probablement le pays 00 : DFS-UNSET). Voici une capture d'écran de ce que nous visons (dans notre cas DE pour l'Allemagne) :
Modifier les règles mdev
Dans ce qui suit, la position de la nouvelle entrée est très importante - elle doit se trouver tout en haut, juste à côté de l'entrée. avant la ligne $MODALIAS. Sinon, cela ne fonctionnera pas !
vi /etc/mdev.conf
insérer la nouvelle ligne suivante juste avant la ligne $MODALIAS :
$COUNTRY=.. root:root 0660 */sbin/crda
Voici une capture d'écran du fichier modifié :
Référence :
- http://lists.alpinelinux.org/alpine-devel/5092.html
- https://blog.w1r3.net/2018/02/11/getting-crda-regdb-working-on-alpine.html
- (malheureusement, il ne mentionne pas l'emplacement de la nouvelle ligne mdev.conf - j'ai dû déboguer pendant plusieurs heures !)
Créer une nouvelle entrée dans modprobe.d
Cours :
touch /etc/modprobe.d/cfg80211.conf
vi /etc/modprobe.d/cfg80211.conf
Insérez la ligne suivante (si nécessaire, adaptez le DE à votre pays - code à deux lettres) :
options cfg80211 ieee80211_regdom=DE
Enregistrez le fichier.
Ce fichier garantira que votre domaine réglementaire est appliqué correctement au démarrage.
Référence :
- https://linux.die.net/man/8/crda - indique que le code pays est un code pays ISO / IEC 3166 alpha2
Alternativement : iw
Vous pouvez également définir le domaine réglementaire en utilisant iw (cela pourrait être nécessaire en plus de ce qui précède ? Mon test montre que cela ne colle pas, cependant).
iw reg set DE
Voici une capture d'écran :
Finalisez
Exécuter (si nécessaire) :
lbu commit -d
Redémarrez. Votre Pi Zero W devrait maintenant être capable de se connecter aux canaux 12 et 13 !
Une note sur le crda
crda est pas est censé être exécuté par vous, l'utilisateur. Il est exécuté comme une application d'aide par iw.
Une astuce grossière qui "pourrait" fonctionner lors du débogage qui suit. Cela fonctionne, parfois. Rarement, en fait.
iw reg set DE ; COUNTRY=DE /sbin/crda
souvent, il échoue pour moi avec le résultat suivant :
échec de l'établissement du domaine réglementaire -22
Même maintenant, après avoir pu définir le pays correctement, cette commande échoue la plupart du temps... Je suppose que cela est dû à des conditions de course.
D'après ce que je comprends, iw définit certaines variables d'environnement, qui à leur tour déclenchent l'exécution de /sbin/crda par mdev, pour envoyer ces changements au noyau.
iw n'est pas le seul outil qui peut changer le domaine réglementaire pour le noyau ; wpa-supplicant est aussi censé pouvoir le faire.
Et, comme vous l'avez vu, cfg80211.conf est également capable de le faire.
Le regulatory.bin est installé dans /usr/lib/crda.
Vous n'avez PAS besoin du paquet crda-dev pour la solution décrite dans cet article de blog.
Une note sur le fichier de dépôt
Si vous supprimez / commentez les sources du référentiel qui ont été ajoutées au début, les paquets "disparaissent" de votre système.
Je vais devoir approfondir cette question, car je viens de commencer à travailler avec Alpine Linux.
Pour l'instant, ne supprimez pas les lignes de dépôt pour les paquets que vous avez installés sur votre système.