- ボード: Raspberry Pi 3B
- OS: Raspberry Pi OS Trixie (Debian 13ベース)
新規インストールして apt upgrade 後に Wi-Fi が接続されなくなった。
新規セットアップし、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で続行
改めてアップグレード:
ここでWi-Fiの様子を見る
$ ip a show wlan0
Device "wlan0" does not exist.
nmcli connection show では接続プロファイル(netplan-wlan0-homewifi)は存在しているのに、デバイス自体が見えていない。なんでや
nmcli connection show
nmcli device status
接続プロファイルは存在しているが、wlan0 デバイスは --(未接続)。
lo、eth0、docker0 のみ表示され、wlan0 が存在しない。
ここからはClaudeちゃんに相談。
Linuxカーネルは起動時からずっと、ハードウェアの検出・ドライバのロード・デバイスの初期化などのログを内部バッファに記録し続けています。dmesg はそのバッファの内容を表示します。
とのことで、 dmesg をチェック。
このラズパイのWi-FiドライバはBroadcom製だそうで、 brcm で検索。
dmesg | grep -i brcm
dmesg | grep -i firmware
Bluetoothドライバはロードされているが、Wi-Fiドライバがロードされていない。
usbcore: registered new interface driver brcmfmac
Wi-Fi ドライバ brcmfmac が USB ドライバとしてのみ登録されており、本来あるべき SDIO ドライバとして認識されていない。
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は起動時の一回だけ出る。
cat /proc/device-tree/model
ls /proc/device-tree/soc/
ここで 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スロットのはず、ということで
ls /proc/device-tree/soc/mmcnr@7e300000/
を見ると中に wifi@1 が見えて、デバイスツリー上はWi-Fiノードが存在しているということがわかる。
cat /proc/device-tree/soc/mmcnr@7e300000/status
を見ると返るのが
デバイスツリー上で 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 ...起動時に何かが書き換えている?
もうさっぱり分らんのでClaudeちゃんに推測してもらう。
Raspberry Pi 3B は Bluetooth と Wi-Fi が同じ SDIO バスを共有している。apt upgrade によって Bluetooth 関連パッケージが更新され、リソース割り当てが変わったことで Wi-Fi の SDIO 初期化が失敗するようになったと考えられる。
わかるか、そんなもの!
結局Bluetoothを無効にするしかないっぽいので、そのようにする。いずれ修正されるであろう。。。
/boot/firmware/config.txt の [all] セクションに以下を追加:
sudo nano /boot/firmware/config.txt
[all]
enable_uart=1
dtoverlay=disable-bt # ← これを追加
保存して再起動:
再起動後、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にお世話になりました。直面した課題に適した未知のコマンドや結果の読み方を教えてくれるので、実に助かっています。