MX LinuxでBluetoothが「No default controller available」になった話:MediaTekカードとカーネル更新の落とし穴

はじめに

メイン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側も正常に動いているとは限らないということを実感しました。

またbluetoothctlNo default controller available と表示された場合でも、単純にBluetoothサービスを再起動すれば直るとは限りません。rfkill でブロックされていない、ファームウェアも存在している、それでも駄目という場合は、カーネルやドライバ側の不具合を疑う必要があります。

Linuxではアップデート後にハードウェア周りの不具合が出ることがありますが、そのときにすぐ再インストールや大掛かりな設定変更をするのではなく、まずはGRUBから一つ前のカーネルで起動してみるのが有効だと分かりました。

今回は古いカーネルである 6.12.86 を保留し、当面はこのカーネルで運用することにしました。今後、新しいカーネルが配信されたら、そのタイミングでBluetoothが正常に戻るかどうかを確認してみようと思います。

Linuxは便利ですが、こういう細かいトラブルもあります。ただ、その原因を一つずつ切り分けていく過程もまた、Linuxを使う面白さなんでしょうね。まあ、仕事で使っているPCでこういうことが起きるとイラッとするでしょうけれど。

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA