はじめに
メインPC(MKM21/C)のMX Linuxをアップデートして再起動したところ、Bluetoothが使えなくなりました。
使用しているのは、かつて故障した別PCから移植したMediaTek製のWi-Fi/Bluetoothカードです。
不思議なことに、同じカードのWi-Fiは問題なく使えます。
しかしBluetoothだけが認識されず、bluetoothctl コマンドを打つと、No default controller available と表示されました。
使用環境
OS:MX Linux
カーネル:6.12.88+deb13-amd64 で問題発生
最終的に正常動作したカーネル:6.12.86+deb13-amd64
無線カード:MediaTek製MT7921K Wi-Fi/Bluetoothカード(M.2 2230)
症状:Wi-Fiは使えるがBluetoothだけ使えない
症状:Wi-Fiは使えるのにBluetoothだけ使えない
まず、MXLinuxのアップデートを入れた後、再起動を促されたので実行すると、Bluetooth機器が繋がらなくなりました。サービスが起動していないのかと思い、メニューから起動しても表示は変わらず、色々調べながら各種コマンドを打ち込んでいくことになりました。
試行錯誤したけど駄目だった対応
・rfkillでBluetoothがブロックされていないか確認
$ rfkill list all
0: hci0: Bluetooth
Soft blocked: no
Hard blocked: no
1: phy0: Wireless LAN
Soft blocked: no
Hard blocked: no
・Bluetoothサービスを再起動
Bluetoothサービスを再起動してみます。
sudo systemctl status bluetooth
sudo systemctl restart bluetooth
sudo systemctl enable bluetooth
これでも状況は変わりません。
・Bluetooth関連パッケージを入れ直す
sudo apt update
sudo apt install –reinstall bluez blueman
apt search firmware-mediatek
apt search firmware-misc-nonfree
sudo reboot
結局これも解決には至りませんでした。
・カーネルモジュールを読み直す
sudo modprobe -r btusb
sudo modprobe btusb
bluetoothctl
ここまで打つと、入力画面になるので、
power on
agent on
default-agent
scan on
を一つずつ打っていきますが、No default controller available と出ました。どうやら、「これはBluetoothデバイス自体がOSから見えていません。つまり、Bluetooth関係のサービスの問題ではなく、btusb・ファームウェア・USB認識・BIOS/UEFI側の問題の可能性が高い」ということらしい。
・電源完全オフを試す
MediaTekや一部の内蔵Bluetoothでは、再起動だけでは復旧せず、Bluetooth側のUSBデバイスが変な状態で残ることがあるらしいので、シャットダウン後に電源ケーブルを抜いて1分くらい待ってから、再びケーブルをつないで起動します。
しかし、これでも駄目でした。
解決:カーネル6.12.86で起動すると復旧
起動時のGRUBで、
Advanced options for MX Linux
から一つ前のカーネル(6.12.86)で起動してみると、何事もなくBluetooth機器が繋がって使用できました。
再起動が必要なアップデートの直後に使えなくなったのですから、最新のカーネルが問題なのは当たり前ですよね。ここまで来てようやく理解したのですが。
当面の対処:古いカーネルを使い続ける
ということで、再起動時にも古い方のカーネルで自動起動出来るようにします。
・GRUB設定を変更して古い方で自動起動させる
sudo nano /etc/default/grub
で開いたファイルを、
GRUB_DEFAULT=0
から
GRUB_DEFAULT=saved
に変更して、さらに
GRUB_SAVEDEFAULT=true
を追加して保存します。
sudo update-grub
GRUBを更新して、再起動時に6.12.86を選べば、その後はそのカーネルが自動起動します。
・古いカーネルを保留する
あと、今後のアップデート後に古いカーネルを誤って削除しないように、今の6.12.86を保留するようにします。
まず現状の確認です。
$ dpkg –list | grep 6.12.86
ii linux-headers-6.12.86+deb13-amd64 6.12.86-1 amd64 Header files for Linux 6.12.86+deb13-amd64
ii linux-headers-6.12.86+deb13-common 6.12.86-1 all Common header files for Linux 6.12.86+deb13
ii linux-image-6.12.86+deb13-amd64 6.12.86-1 amd64 Linux 6.12 for 64-bit PCs (signed)
ii linux-kbuild-6.12.86+deb13 6.12.86-1 amd64 Kbuild infrastructure for Linux 6.12.86+deb13
以上のように表示されたので、以下のコマンドを打ちます。
sudo apt-mark hold linux-image-6.12.86+deb13-amd64
sudo apt-mark hold linux-headers-6.12.86+deb13-amd64
sudo apt-mark hold linux-headers-6.12.86+deb13-common
sudo apt-mark hold linux-kbuild-6.12.86+deb13
そうすると、以下のように表示されて完了です。
linux-image-6.12.86+deb13-amd64 は保留に設定されました。
linux-headers-6.12.86+deb13-amd64 は保留に設定されました。
linux-headers-6.12.86+deb13-common は保留に設定されました。
linux-kbuild-6.12.86+deb13 は保留に設定されました。
将来、Bluetooth問題が直った新カーネルへ移行して保留を解除したい場合は、以下です。
sudo apt-mark unhold linux-image-6.12.86+deb13-amd64
sudo apt-mark unhold linux-headers-6.12.86+deb13-amd64
sudo apt-mark unhold linux-headers-6.12.86+deb13-common
sudo apt-mark unhold linux-kbuild-6.12.86+deb13
原因はカーネル6.12.88とMediaTek Bluetoothの相性問題と思われる
結局の所、Bluetoothが問題なく動作していたときのカーネルに戻せば復旧しました。逆に言うと、6.12.88のカーネルでは、私の環境のBluetoothは動作しないことが確定しました。
更に次のカーネルのアップデートが下りてくるまでは、この古い方のカーネルを使い続けるしかありません。
Linuxトラブル時の教訓
今回分かったこと
– Wi-Fiが使えていても、Bluetooth側だけ使えなくなることがある
– Wi-FiとBluetoothは同じカードでもLinux上では別デバイスとして扱われる
– bluetoothctlのNo default controller availableは、サービスだけの問題とは限らない
– rfkillでブロックされていないなら、ドライバやカーネル側を疑う
– アップデート後の不具合は、一つ前のカーネルで起動すると切り分けやすい
Linuxに慣れた方なら当たり前のことなんでしょうけれど、この辺まだまだ勉強不足ですね。
まとめ
今回は、MX Linuxのアップデート後にBluetoothだけが使えなくなり、最終的には一つ前のカーネルである 6.12.86で起動することで復旧しました。
最初はBluetoothサービスや rfkill、ファームウェア、カーネルモジュールの問題を疑って色々と試しましたが、結果的には、不具合が起きる直前のアップデートで入れた 6.12.88カーネルと、私の環境で使っているMediaTek MT7921KのBluetooth機能との相性問題のようでした。
今回特に勉強になったのは、Wi-FiとBluetoothが同じM.2カードに載っていても、Linux上では別々のデバイスとして扱われるという点です。Wi-Fiが普通に使えているからといって、Bluetooth側も正常に動いているとは限らないということを実感しました。
またbluetoothctl で No default controller available と表示された場合でも、単純にBluetoothサービスを再起動すれば直るとは限りません。rfkill でブロックされていない、ファームウェアも存在している、それでも駄目という場合は、カーネルやドライバ側の不具合を疑う必要があります。
Linuxではアップデート後にハードウェア周りの不具合が出ることがありますが、そのときにすぐ再インストールや大掛かりな設定変更をするのではなく、まずはGRUBから一つ前のカーネルで起動してみるのが有効だと分かりました。
今回は古いカーネルである 6.12.86 を保留し、当面はこのカーネルで運用することにしました。今後、新しいカーネルが配信されたら、そのタイミングでBluetoothが正常に戻るかどうかを確認してみようと思います。
Linuxは便利ですが、こういう細かいトラブルもあります。ただ、その原因を一つずつ切り分けていく過程もまた、Linuxを使う面白さなんでしょうね。まあ、仕事で使っているPCでこういうことが起きるとイラッとするでしょうけれど。
コメントを残す