最近喜欢上让电脑「睡眠」(suspend to ram)了。本来这个合我心意的睡眠功能在我临时换了个无线鼠标用的时候出了点状况。让电脑进入睡眠,然后开始收拾东西,关闭鼠标电源的时候,电脑被唤醒了。显然我需要找个方法避免鼠标唤醒电脑。我只需要电脑在我可以开启的时候才会从睡眠中恢复。
以我对 Linux 的了解当然无法自己想出什么招数。于是按照 askubuntu 上的这个问答来做,结果很好。下面是简单的记录。
首先要确定唤醒电脑的那些设备在系统中是怎么标识的,特别是那些处于启用状态(enabled)的。使用指令,
$ cat /proc/acpi/wakeup | sort Device S-state Status Sysfs node GLAN S4 *disabled HDAS S4 *disabled pci:0000:00:1f.3 LID S4 *enabled platform:PNP0C0D:00 RP01 S4 *disabled pci:0000:00:1c.0 RP02 S4 *disabled RP04 S4 *disabled RP05 S4 *disabled RP06 S4 *disabled RP07 S4 *disabled RP08 S4 *disabled RP09 S4 *disabled pci:0000:00:1d.0 RP10 S4 *disabled RP11 S4 *disabled RP12 S4 *disabled RP13 S4 *disabled RP14 S4 *disabled RP15 S4 *disabled RP16 S4 *disabled RP17 S4 *disabled RP18 S4 *disabled RP19 S4 *disabled RP20 S4 *disabled RP21 S4 *disabled RP22 S4 *disabled RP23 S4 *disabled RP24 S4 *disabled SLPB S3 *enabled platform:PNP0C0E:00 XDCI S4 *disabled XHC S3 *enabled pci:0000:00:14.0
可以看到很长一个列表。其中 S3 和 S4 对应两种暂停(suspend)的系统电源管理状态,分别为「睡眠」和「休眠」。
上面显示的是 ThinkPad T470s 上的 openSUSE Tumbleweed 系统中的结果。但是我只感兴趣那些处于启用状态的,因为我需要禁止其中对应无线鼠标的那个。所以筛选一下结果,
$ cat /proc/acpi/wakeup | sort | grep 'Status\|enabled' Device S-state Status Sysfs node LID S4 *enabled platform:PNP0C0D:00 SLPB S3 *enabled platform:PNP0C0E:00 XHC S3 *enabled pci:0000:00:14.0
这里 LID 是指笔记本的屏幕,打开屏幕时会唤醒笔记本;SLPB 不知道是什么,估计是电源键或者是键盘上的 Fn 这个特殊键;XHC 就是 USB 3.0 的设备了(USB 2.0 对应的是 EHC)。所以很显然需要将这个改成禁用状态。下面的指令每执行一次就更改一次该设备对应的状态(需要 root 权限),
$ su Password: # echo "XHC" > /proc/acpi/wakeup # cat /proc/acpi/wakeup | sort | grep 'XHC' XHC S3 *disabled pci:0000:00:14.0 # echo "XHC" > /proc/acpi/wakeup # cat /proc/acpi/wakeup | sort | grep 'XHC' XHC S3 *enabled pci:0000:00:14.0
但是这个指令造成的效果在系统重启后失效了,所以需要用别的方法来让系统每次启动后自动执行该指令。可以参考之前修改 ThinkPad TrackPoint 小红点配置的方法创建一个基于 systemd 的系统服务来开机自动执行。
创建一个 bash 脚本文件 /usr/local/bin/wakeup_device_disable_xhc.sh
并修改其内容,
$ sudo touch /usr/local/bin/wakeup_device_disable_xhc.sh $ sudo vim /usr/local/bin/wakeup_device_disable_xhc.sh
文件内容如下,
#!/bin/bash # Disable device on USB to wake up system from suspend echo "XHC" > /proc/acpi/wakeup
然后配置系统服务。创建并编辑文件,
$ sudo touch /etc/systemd/system/wakeup_device_disable_xhc.service $ sudo vim /etc/systemd/system/wakeup_device_disable_xhc.service
文件内容如下,
[Unit] Description=Do not let device on USB wake up system from suspend [Service] Type=oneshot ExecStart=/usr/local/bin/wakeup_device_disable_xhc.sh [Install] WantedBy=multi-user.target
保存文件后启用该服务就可以了,
$ sudo systemctl enable wakeup_device_disable_xhc.service $ sudo systemctl start wakeup_device_disable_xhc.service
运行该服务之后可以再用前面的指令查看 XHC 设备对应的状态,
$ cat /proc/acpi/wakeup | sort | grep 'XHC' XHC S3 *enabled pci:0000:00:14.0
另外多扯一句。ThinkPad T470s(24GB 内存)上的 openSUSE Tumbleweed 系统在睡眠的时候大约一小时耗电 1%。这个还是需要小心的。但是「休眠」(suspend to disk / hibernate)的话就造成不必要的硬盘写入,特别是大内存的情况下,所以应该尽量避免休眠。
更新记录 2017.11.07
修改服务文件安装路径,
/usr/lib/systemd/system/
到,
/etc/systemd/system/
根据 ArchLinux Wiki 上的提示,这才是系统管理员自己安装的 systemd 服务应该的位置。©
本文发表于水景一页。永久链接:<http://cnzhx.net/blog/opensuse-tumbleweed-disable-waking-by-mouse/>。转载请保留此信息及相应链接。
了解了,努力!
引用通告: 在 T470s 上折腾 Linux 滚动发行版 openSUSE Tumbleweed 记录汇总 | 水景一页