Raspberry PI内蔵のWiFiモジュールはとても重宝はモジュールですが、特に何かした訳では無いのにルータにつながらなくなる事が有ります。
ケース1 Raspberry PI Zero 2Wの場合
背景
PI Zero 2Wには有線LANコネクタが無いのでWiFiを使ってSSH接続してプログラムを書いていました。昨日までは問題無くつながっていたのに今日急にダメになりました。sshでつなごうとすると
~$ ssh xxx@rasp.local
ssh: Could not resolve hostname rasp.local: Name or service not known
エラーメッセージ つながらない。PI Zero 2WでWiFiがつながらないのは致命的。何も変えていない。かなりショック。
状況
キーボードをつないでLong inしWi-Fiアクセスポイントのを確認。
~$ nmcli device wifi
IN-USE BSSID SSID MODE CHAN RATE SIGNAL BARS SECURITY
0A:10:86:B0:02:66 aterm-193b5c-g Infra 3 270 Mbit/s 100 ▂▄▆█ WPA1 WPA2
1C:7C:98:8D:21:26 xg100n-8d2125-1 Infra 11 260 Mbit/s 55 ▂▄__ WPA2
つなぎたいSSID”aterm-193b5c-g”を2Wは認識しています。そこで接続に行くと
~$ sudo nmcli device wifi connect "aterm-193b5c-g" password "xxxxxx"
Error: Connection activation failed: (default) The Wi-Fi network could not be found
やっぱり繋がりません。試しに別のSSIに接続してみたら問題無く繋がりました。つながらない”aterm-193b5c-g”へも他のPCからは繋がります。まるで”aterm-193b5c-g”が2wを拒否しているみたいです。とりあえずルータを立ち上げ直したら今度は繋がりました。
結論
ルータに問題が有ったみたいですがどうも原因は2w(実は私)のようです。終了時にコマンドを使用せずいきなり電源を落としていました。これが原因の様です。コマンドを使用するとルータに切断信号が送られルータは接続を遮断します。急に電源を落とすと信号がルータに送られず2wが落ちてもルータは引き続き接続していると判断する事がある様です。この状態で2wから接続依頼がルータ来るとルータは”あなたは既に接続しているのでつなげません。”と拒否するみたいです。なのでルータの電源を落として立ち上げ直すとリセットされ問題無くつながったもよう。
対策
終了時にはコマンドを使う。当たり前のことでした。コマンドを使う様になって問題無くつながています。
ケース2 Raspberry PI 3Bの場合
じつは以前にRaspberry PI3BもWiFiが繋がらなくなっていました。こちらは有線LANがるのでよしとしていたのですがこんかい2Wが治ったのでもしかしてと思い3Bで確認してみました。
状況
3Bの状況は、アクセスポイントは認識出来る。認識出来るアクセスポイント全てに接続出来ない。つまり3BのWiFiモジュール送信部が壊れた様です。2Wの様には行きませんでした。
結論
内蔵のWiFiモジュールを諦めてUSBのドングルで代用する事にしました。でもこれだと3Bのセットアップ時に不自由になります。現在はOSインストール後の作業を全てSSHを通してやっています。追加のUSBドングルはインストール完了後にルータにつながるとは思えす、直後のSSH接続は期待出来ない。3BにキーボードをつなぎLoginしてWiFiをつなぐ事になるのでは。この作業が面倒でSSHを有効にしてます。
関係の資料を調べていると、OS Imageをインストールする時点で内蔵のWiFiを無効にしかつ、追加したUSBドングルをwlan0として取り扱う方法を見つけました。これでInageがもっている標準のドライバーで追加のドングルが動けば本来と同じ様にインストール完了後にSSHが使える可能性が有ります。
Raspberry Pi ImagerでOSのImageをSDカードに書き込むと、bootfsとrootfsの2つのファルダで出来ます。bootfsフォルダの中にある”config.txt”の最後に、”dtoverlay=disable-wifi”を追加すると内蔵WiFiを無効にできます。OSがUSBドングルを探しに行ってwlan0と登録する事を願います。USBドングルですがこれを使いましたー>TL-WN725Nを使う
ここまでの手順を簡単にまとめると以下の通り
- Raspberry Pi ImagerでOSのImageをSDカードに書き込む
ImageはLegacy,32-bit Lite(Bookwormでno desktop)
オプションでSSHが起動する用セットアップ - bootfsフォルダの中にある”config.txt”の最後に、”dtoverlay=disable-wifi”を追加
- SDカードとUSBドングル(TL-WN725N)を3Bに挿入して電源ON
インストールが終わるまで待ってPCからSSHを実行したらなんと繋がりました。
動いているのでこれでよさそうですが、念の為ドングルのドライバを純正に変えます。
sudo apt update
sudo apt install -y build-essential raspberrypi-kernel-headers bc dkms git
# 既存のディレクトリがあれば削除
rm -rf rtl8188eus
# 最新の安定版ソースを取得
git clone https://github.com/aircrack-ng/rtl8188eus.git
cd rtl8188eus
# コンパイル(数分かかります)
make
# インストール
sudo make install
echo "blacklist r8188eu" | sudo tee /etc/modprobe.d/realtek.conf
echo "blacklist rtl8xxxu" | sudo tee -a /etc/modprobe.d/realtek.conf
sudo depmod -a
sudo reboot
リブート後モニタで nmcli device, lsmod | grep 8188 を実行して下さい
~ $ nmcli device
DEVICE TYPE STATE CONNECTION
wlan0 wifi connected preconfigured
lo loopback connected (externally) lo
p2p-dev-wlan0 wifi-p2p disconnected --
eth0 ethernet unavailable --
~ $ lsmod | grep 8188
8188eu 1150976 0
cfg80211 888832 1 8188eu
しっかりインストール出来ています。
ちなみに内蔵のWiFiを有効に戻したければ
1. 内蔵Wi-Fiのハードウェア無効化を解除
/boot/firmware/config.txtを開き、追記した行をコメントアウト。
2. ドライバーのブラックリストを解除
作成した設定ファイルを削除すれば、OS標準のドライバーが再び読み込まれるようになります。
sudo rm /etc/modprobe.d/realtek.conf
3. 設定を反映して再起動
sudo depmod -a
sudo reboot
正確には一度電源を落としてUSBドングルを抜いて起動した方が良いです。これで内蔵WiFiが確実にwlan0になります。