Linuxでマウスによるスリープ復帰をさせないようにする
メインのPCとしてLinuxデスクトップ(Fedora Workstation)を普段から使っています。基本的にシャットダウンせず、就寝中も含めスリープで運用しているのですが、そこで地味に面倒な問題が起きています。
スリープ中にマウスに少しでも触れるとスリープから復帰してしまうんです。しかも、ログイン画面ではスリープのショートカットが効かないので、わざわざパスワードを入力する必要があります。
触れるどころか、ちょっとした振動でも復帰してしまうので、就寝しようとしているときに突然ディスプレイが明るくなると電源ぶち抜いたろかという気分になります。
ということで、特定デバイスから復帰しないよう、設定を変更しました。
disable wakeup
まず、マウスのsysfsを探します。
以下のコマンドですべてのUSBデバイスのproduct属性を表示します。これでわからなければmanufacturer属性を調べたりしてください。
grep . /sys/bus/usb/devices/*/product
# product
/sys/bus/usb/devices/1-2/product:USB-C to 3.5mm Headphone Jack Adapter
/sys/bus/usb/devices/1-4/product:USB Receiver
/sys/bus/usb/devices/3-1/product:Keychron Receiver
/sys/bus/usb/devices/3-3/product:USB Audio and HID
# manufacturer
/sys/bus/usb/devices/1-2/manufacturer:Apple, Inc.
/sys/bus/usb/devices/1-4/manufacturer:Logitech
/sys/bus/usb/devices/3-1/manufacturer:Keychron
/sys/bus/usb/devices/3-3/manufacturer:CSCTEK
自分が使っているのは Logitech(日本だとLogicool)のM575なので、/sys/bus/usb/devices/1-4/が目的のデバイスのようです。
スリープ復帰はpower/wakeup属性によって設定されます。
echo disabled | sudo tee /sys/bus/usb/devices/1-4/power/wakeup
catコマンドでdisabledになっていることを確認できたらokです。
cat /sys/bus/usb/devices/1-4/power/wakeup
> disabled
永続化
この時点では再起動すると元に戻ってしまいます。udevルールを変更して再起動しても適用されるようにしましょう。
マウスのベンダーIDとデバイスIDを調べます。
lsusbコマンドを実行すると、接続しているUSBデバイスが表示されます。
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 046d:c52b Logitech, Inc. Unifying Receiver
Bus 001 Device 003: ID 05ac:110a Apple, Inc. USB-C to 3.5mm Headphone Jack Adapter
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 002: ID 3434:d027 Keychron Keychron Receiver
Bus 003 Device 003: ID 0573:1573 Zoran Co. Personal Media Division (Nogatech) USB Audio and HID
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
ID 046d:c52bとあるのでベンダーIDが046d、デバイスIDがc52bです。
このデバイスを接続したときにpower/wakeup属性をdisabledにするよう、独自のudevルールを作成します。
sudo nano /etc/udev/rules.d/50-wake-on-device.rules
ACTION=="add", SUBSYSTEM=="usb", DRIVERS=="usb", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c52b", ATTR{power/wakeup}="disabled"
保存したら再起動して完了です。
ショートカット
最初、この設定をしてもマウスでスリープ復帰していまい悩んでいたのですが、普段Super+Lでスリープしていて、これが実際にはスリープではなく画面ロックだったことが原因でした。
なので、ショートカットを作成して本当のスリープになるようにしました。
GNOMEの設定>キーボード>キーボードショートカット>独自のショートカット
で、コマンドをsystemctl suspendとして好きなキーに割り当てます。
これで、無事にマウスでスリープが解除されなくなりましたとさ。
参考
https://wiki.archlinux.jp/index.php/Udev#USB_デバイスでサスペンドから復帰させる
https://ricrowl.hatenablog.com/entry/2020/05/22/000330