コンテンツにスキップ

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

終わったらロックファイルを削除:

sudo rm /var/lib/dpkg/lock-frontend
sudo rm /var/lib/dpkg/lock
sudo rm /var/cache/apt/archives/lock

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で続行

改めてアップグレード:

sudo apt upgrade

Wi-Fiが繋がらなくなった

ここでWi-Fiの様子を見る

$ ip a show wlan0
Device "wlan0" does not exist.

nmcli connection show では接続プロファイル(netplan-wlan0-homewifi)は存在しているのに、デバイス自体が見えていない。なんでや


調査の経緯

1. nmcli で状態確認

nmcli connection show
nmcli device status

接続プロファイルは存在しているが、wlan0 デバイスは --(未接続)。

ip link show

loeth0docker0 のみ表示され、wlan0 が存在しない。

3. dmesg でドライバ確認

ここからはClaudeちゃんに相談。

Linuxカーネルは起動時からずっと、ハードウェアの検出・ドライバのロード・デバイスの初期化などのログを内部バッファに記録し続けています。dmesg はそのバッファの内容を表示します。

とのことで、 dmesg をチェック。

このラズパイのWi-FiドライバはBroadcom製だそうで、 brcm で検索。

dmesg | grep -i brcm
dmesg | grep -i firmware

Bluetoothドライバはロードされているが、Wi-Fiドライバがロードされていない。

dmesg | grep -i brcmfmac
usbcore: registered new interface driver brcmfmac

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 として見えています。

というわけでこれを探してみる。

dmesg | grep -i mmc
[ 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 確認

cat /proc/device-tree/model
ls /proc/device-tree/soc/

ここで mmc@7e202000mmcnr@7e300000 の両方が見えており

mmcnr@7e3000007e300000 はBCM2835(Pi 3Bのチップ)のメモリマップで mmcnr(MMC Non-Removable)に割り当てられた番地です。dmesg でも同じアドレスが出ていました:

mmc-bcm2835 3f300000.mmcnr: ...

3f7eは同じ物理アドレスを別の視点から見たもの)
また、 mmcnrnrNon-Removable の略です。取り外せないMMCデバイス=Wi-Fiチップのことだと推測できます。SDカードスロットは取り外し可能なので mmc@7e202000 の方です。

mmcnr@7e300000 がWi-Fi用のSDIOスロットのはず、ということで

ls /proc/device-tree/soc/mmcnr@7e300000/

を見ると中に wifi@1 が見えて、デバイスツリー上はWi-Fiノードが存在しているということがわかる。

cat /proc/device-tree/soc/mmcnr@7e300000/status

を見ると返るのが

disabled

デバイスツリー上で 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] セクションに以下を追加:

dtoverlay=disable-bt
sudo nano /boot/firmware/config.txt
[all]
enable_uart=1
dtoverlay=disable-bt   # ← これを追加

保存して再起動:

sudo reboot

再起動後、wlan0 が正常に認識され、Wi-Fi に接続できた。

$ ip a show wlan0
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 ...
    inet 192.168.1.95/24 ...

原因まとめ

項目 内容
直接原因 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にお世話になりました。直面した課題に適した未知のコマンドや結果の読み方を教えてくれるので、実に助かっています。