Raspberry Pi 3B + Trixie で Wi-Fi が突然認識されなくなった話
環境
- ボード: Raspberry Pi 3B
- OS: Raspberry Pi OS Trixie (Debian 13ベース)
症状
新規インストールして apt upgrade 後に Wi-Fi が接続されなくなった。
経緯: sudo apt upgradeしたらハングした
新規セットアップし、Wi-Fiも繋いで sudo apt update && sudo apt upgrade をした。時間がかかったので放置して置いたらセッションが切れてしまい、再ログインしようとするとWi-Fiに割り当てたはずの固定IPでログインできない。
取り急ぎ有線でログインして様子を見ようとしたものの、sudoできなくなっている。プロセスを見ると前日実行した sudo apt updgrade がそのまま残っていたので、まずこれを kill
$ ps aux | grep apt
root 2067 0.0 0.6 20580 6336 ? S Apr01 0:00 sudo apt upgrade
root 2069 0.0 0.2 20580 2300 ? Ss Apr01 0:00 sudo apt upgrade
root 2070 0.1 11.5 126508 107308 ? S Apr01 0:44 apt upgrade
$ sudo kill -9 2067 2069 2070
終わったらロックファイルを削除:
dpkbの状態を修復してから:
$ sudo dpkg --configure -a
Setting up rpi-chromium-mods (20260211) ... Configuration file '/etc/chromium/master_preferences' ==> Modified (by you or by a script) since installation. ==> Package distributor has shipped an updated version. What would you like to do about it ? Your options are: Y or I : install the package maintainer's version N or O : keep your currently-installed version D : show the differences between the versions Z : start a shell to examine the situation The default action is to keep your current version. *** master_preferences (Y/I/N/O/D/Z) [default=N] ?
# Yで続行
改めてアップグレード:
Wi-Fiが繋がらなくなった
ここでWi-Fiの様子を見る
nmcli connection show では接続プロファイル(netplan-wlan0-homewifi)は存在しているのに、デバイス自体が見えていない。なんでや
調査の経緯
1. nmcli で状態確認
接続プロファイルは存在しているが、wlan0 デバイスは --(未接続)。
2. ip link show でデバイス確認
lo、eth0、docker0 のみ表示され、wlan0 が存在しない。
3. dmesg でドライバ確認
ここからはClaudeちゃんに相談。
Linuxカーネルは起動時からずっと、ハードウェアの検出・ドライバのロード・デバイスの初期化などのログを内部バッファに記録し続けています。
dmesgはそのバッファの内容を表示します。
とのことで、 dmesg をチェック。
このラズパイのWi-FiドライバはBroadcom製だそうで、 brcm で検索。
Bluetoothドライバはロードされているが、Wi-Fiドライバがロードされていない。
Wi-Fi ドライバ brcmfmac が USB ドライバとしてのみ登録されており、本来あるべき SDIO ドライバとして認識されていない。
4. mmc ログ確認
Claude曰く、
MMC は MultiMediaCard の略で、SDカードなどのストレージ規格のことです。
ただしLinuxカーネルでは意味が少し広く、SDカード・eMMC・SDIOデバイスをまとめてMMCサブシステムとして管理しています。
Pi 3Bの場合:
| デバイス | 用途 |
|---|---|
mmc0 |
SDカードスロット(OSが入っているやつ) |
mmc1 |
Wi-Fi/BluetoothチップへのSDIOバス |
SDIO(Secure Digital Input/Output)はSDカードの規格を拡張したもので、ストレージだけでなくWi-FiやBluetoothなどの通信チップを接続するためにも使われています。Pi 3BのWi-Fiチップ(BCM43430)はSDカードと同じバスに繋がっていて、カーネルからは
mmc1として見えています。
というわけでこれを探してみる。
[ 2.672012] mmc-bcm2835 3f300000.mmcnr: mmc_debug:0 mmc_debug2:0
[ 2.672035] mmc-bcm2835 3f300000.mmcnr: DMA channel allocated
mmc1: Failed to initialize a non-removable card
Wi-Fi チップが接続されている mmc1(SDIOスロット)の初期化に失敗していたことがわかる。このFailedは起動時の一回だけ出る。
5. デバイスツリーで status 確認
ここで mmc@7e202000 と mmcnr@7e300000 の両方が見えており
mmcnr@7e300000の7e300000はBCM2835(Pi 3Bのチップ)のメモリマップでmmcnr(MMC Non-Removable)に割り当てられた番地です。dmesgでも同じアドレスが出ていました:mmc-bcm2835 3f300000.mmcnr: ...
(
3fと7eは同じ物理アドレスを別の視点から見たもの)
また、mmcnrのnrは Non-Removable の略です。取り外せないMMCデバイス=Wi-Fiチップのことだと推測できます。SDカードスロットは取り外し可能なのでmmc@7e202000の方です。
mmcnr@7e300000 がWi-Fi用のSDIOスロットのはず、ということで
を見ると中に wifi@1 が見えて、デバイスツリー上はWi-Fiノードが存在しているということがわかる。
を見ると返るのが
デバイスツリー上で Wi-Fi が disabled になっていた。 なんでや
ここで更にClaudeからDTBを見るよう言われる:
DTB は Device Tree Blob の略で、ハードウェアの構成情報をバイナリ形式で記述したファイルです。
Linuxカーネルは起動時に「このボードにはどんなハードウェアが繋がっているか」を知る必要があります。x86 PC はその情報を BIOS/UEFI から得ますが、Raspberry Pi のような組み込みボードには BIOS がないので、代わりに DTB をカーネルに渡して教えています。
関連する用語を整理するとこうなります:
| 用語 | 意味 |
|---|---|
| DTS | Device Tree Source。人間が読めるテキスト形式 |
| DTB | Device Tree Blob。DTSをコンパイルしたバイナリ形式 |
| dtc | DTSとDTBを相互変換するコンパイラ |
| dtoverlay | 起動時にDTBの一部を上書きするパッチ |
# dtc -I dtb -O dts /boot/firmware/bcm2710-rpi-3-b.dtb
# ^^^^^^^ ^^^^^^
# 入力DTB 出力DTS(人間が読めるテキストに変換)
dtc -I dtb -O dts /boot/firmware/bcm2710-rpi-3-b.dtb 2>/dev/null \
| grep -A20 "mmcnr@7e300000 {" | grep status
# → status = "okay";
ベースの DTB ファイルでは okay になっているにもかかわらず、 実際に起動時に適用されたデバイスツリー /proc/device-tree/ では disabled ...起動時に何かが書き換えている?
6. Bluetooth との競合が原因と判明
もうさっぱり分らんのでClaudeちゃんに推測してもらう。
Raspberry Pi 3B は Bluetooth と Wi-Fi が同じ SDIO バスを共有している。
apt upgradeによって Bluetooth 関連パッケージが更新され、リソース割り当てが変わったことで Wi-Fi の SDIO 初期化が失敗するようになったと考えられる。
わかるか、そんなもの!
解決方法
結局Bluetoothを無効にするしかないっぽいので、そのようにする。いずれ修正されるであろう。。。
/boot/firmware/config.txt の [all] セクションに以下を追加:
保存して再起動:
再起動後、wlan0 が正常に認識され、Wi-Fi に接続できた。
原因まとめ
| 項目 | 内容 |
|---|---|
| 直接原因 | mmcnr@7e300000(Wi-Fi の SDIO スロット)が起動時に disabled になる |
| 根本原因 | Bluetooth と Wi-Fi の SDIO バス競合 |
| トリガー | apt upgrade による Bluetooth 関連パッケージの更新 |
| 解決策 | dtoverlay=disable-bt で Bluetooth を無効化し競合を解消 |
補足
disable-bt を追加した場合、enable_uart=1 はそのまま残して問題ない。むしろこの2つはセットで使われることが多い組み合わせ。
ヘッドレスサーバー用途で不要だったので今回はBluetoothを潰して対応したが、どっちも必要な場合の対策は不明。
この記事はかなりClaudeにお世話になりました。直面した課題に適した未知のコマンドや結果の読み方を教えてくれるので、実に助かっています。