🤪

Ubuntu 20.04 (Focal) での Bluetoothマウス (ドングル式Bluetoothレシーバー) の使用

2021/03/09に公開

Ubuntu20.04 でBluetoothマウス、生半可な対応では動きません。認識しません。とにかくイライラがものすごいです。 つながった! と思いきや、10秒後に強制的に切断されてしまいます。Stack Overflowなどの投稿内容を参考にアレコレ試しましたが症状が悪化したり、場合によってはドングルを全く認識しなくなってしまいました。

試行錯誤の末、下記の記事を参考にしてようやくBluetoothマウスを正常に動作させることに成功しました。
https://askubuntu.com/questions/1090149/bluetooth-mouse-lags-after-upgrading-to-18-10-cosmic/1090150#1090150

下記のものは役に立ちませんでしたし、
https://askubuntu.com/questions/1235456/issues-with-bluetooth-mouse-in-ubuntu-20-04
下記のものも役に立ちませんでした。
https://askubuntu.com/questions/1231074/ubuntu-20-04-bluetooth-not-working
上記2つはお使いの環境にもよると思いますが症状が悪化することがあります。

下記に私が成功した方法を日本語で要約します。同じように対応に行き詰まってしまってお悩みの方のお役に立てれば嬉しいです。

1. Environtment

  • Ubuntu 20.04 x86_64 デスクトップPC、Bluetoothアダプタ非内蔵
  • Bluetooth Mouse + USBドングル

https://www.amazon.co.jp/gp/product/B0722XWTFR/ref=ppx_yo_dt_b_asin_title_o07_s00?ie=UTF8&psc=1
https://www.amazon.co.jp/gp/product/B017KPZ6LK/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1

2. Procedure

powertop というアプリをインストールして起動します。

$ sudo apt install -y powertop
$ sudo powertop

1

キーボードの Tab を数回押して Tunables に表示を切り替えます。
2

表示されている一覧の中からUSBドングルのデバイスを探します。私の場合は Autosuspend for USB device USB1.1-A [1-11.2] と表記されているものがそのものでした。 Autosuspend と表示のあるものが複数ある場合は、ドングルを抜いてキーボードの R キー を押し、表示内容をリフレッシュしてみたときに表示が消えたものがドングルです。確認が終わったらもう一度ドングルをUSBポートへ挿入しなおしてください。

あらためてキーボードの上下矢印キーで Autosuspend for USB device USB1.1-A [1-11.2] を選び、キーボードの Enter キーを押します。 USB1.1-A の部分はお使いのドングルによって表示が異なります。
3
キーボードの Enter キーを押すと、>> Good と表示されていた部分が切り替わり、 >> Bad という表示に変わります。 Bad はサスペンドが無効の状態を表し、 Good はサスペンドが有効の状態を表します。 今回、BluetoothのUSBドングルの調子が悪かったのは、USBドングルがサスペンド状態へ勝手に移行してしまうことにより、Bluetoothの接続がたびたび切断されてしまうことが原因でした。 ちなみに、Ubuntu18.04 の頃はこのような事象が発生しませんでした。Ubuntu20.04のカーネルの不具合のような気がします。あらためて Bad に切り替わったことを確認してください。また、 Bad へ切り替えた直後にコンソールの上部に表示されるプロンプトをコピーしてどこかにメモしておいてください。後ほどの作業で使用します。

私の環境では下図のように >> echo 'on' > '/sys/bus/usb/devices/1-11.2/power/control'; と表示されました。
4

キーボードの Esc キーを押し、 powertop を終了します。 Esc を押してから終了するまでにかなり時間が掛かりますので気長に待ちましょう。

下記のコマンドを実行し、空のファイルを開きます。

$ sudo nano /usr/bin/disable-bt-mouse-autosuspend

開いた空のファイルに下記を入力して保存し、nano を終了します。 1-11.2 の部分は直前でメモしておいた文字列の中の /power の直前に表示されていた数字の部分に読み替えてください。 私の場合は 1-11.2 でしたが、皆さんの場合は異なる数字の羅列になっていると思います。 ちなみに、nanoの保存は Ctrl + O、 nanoの終了は Ctrl + X です。

#!/bin/sh

# Disable USB auto-suspend for my mouse on startup
sleep 5;
MOUSE="/sys/bus/usb/devices/1-11.2/power/control";
if [ -f "$MOUSE" ]; then
    echo 'on' > $MOUSE;
fi

続いて、作成したスクリプトに実行権限を付与します。下記のコマンドを実行します。

$ sudo chmod u+x /usr/bin/disable-bt-mouse-autosuspend

続いて、systemd へサービスとして登録します。 下記のコマンドを実行し、空のファイルを開きます。

$ sudo nano /etc/systemd/system/disable-bt-mouse-autosuspend.service

下記の文字列を入力し、保存してnanoを終了します。

[Unit]
Description=Disable USB auto-suspend for bluetooth mouse

[Service]
ExecStart=/usr/bin/disable-bt-mouse-autosuspend

[Install]
WantedBy=multi-user.target

続いて、下記のコマンドを実行し、サービスを起動します。

$ sudo systemctl start disable-bt-mouse-autosuspend
$ sudo systemctl enable disable-bt-mouse-autosuspend

続いて、パソコンがサスペンドから復帰したあとでも正常に再接続できるようにするためのスクリプトを作成します。 下記のコマンドを実行し、空のファイルを開きます。

$ sudo nano /lib/systemd/system-sleep/00disable-bt-mouse-autosuspend

下記の内容を入力し、保存してnanoを終了します。

#!/bin/sh

# restart the service after suspend
if [ $1 = post ] && [ $2 = suspend ]
then systemctl start disable-bt-mouse-autosuspend.service
fi

続いて、下記のコマンドを実行してスクリプトの実行権限を付与します。

$ sudo chmod u+x /lib/systemd/system-sleep/00disable-bt-mouse-autosuspend

最後にパソコンを再起動したら手順終わりです。

Discussion