タグ: Bluetooth

  • 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でこういうことが起きるとイラッとするでしょうけれど。