修改ACPI事件:更改电源键默认操作

笔记本休眠和systemd

现代操作系统和笔记本有一个非常好的功能:当合上笔记本时自动休眠(suspend),打开时自动恢复到上次工作的状态,大大提高了使用效率。这点在macOS上特别突出,基本上可以保持几周甚至几个月无需重启。

MacBook Pro上实现Fedora和macOS双启动自然也继承了使用MacBook的习惯,特别是解决了suspended后数秒无故wake up问题("ACPI: Waking up from system sleep state S3")之后,使用ACPI电源管理方便了办公室、家庭移动办公。不过,有一点和macOS不同的是,Linux上默认按下电源按钮就会关机,而不是象macOS进入休眠。这个特性让我非常苦恼,往往习惯性一按电源键,导致操作系统shutdown。

其实macOS的设置更人性化,对于现代笔记本操作系统,关机是极少情况下才需要的操作,而休眠并快速唤醒才是最常见的场景。

怎样把电源键的动作修改成休眠(suspend)呢?

systemd处理一些电源相关的ACPI事件,可以通过/etc/systemd/logind.conf或者/etc/systemd/logind.conf.d/*.conf配置。在一些没有独立电源管理的系统,systemd可能取代了acpid服务,来处理ACPI事件:

每一个事件的对应动作可以是以下动作之一:

  • ignore

  • poweroff

  • reboot

  • halt

  • suspend

  • hibernate

  • hybrid-sleep

  • lock

  • kexec

hibernationsuspension 需要相应的配置。如果事件没有配置,则systemd采用默认操作

Event handler

Description

Default action

HandlePowerKey

电源键按下时触发

poweroff

HandleSuspendKey

suspend键按下时触发

suspend

HandleHibernateKey

hibernate键按下时触发

hibernate

HandleLidSwitch

笔记本屏幕合上时触发(除非笔记本安装在dock上)

suspend

HandleLidSwitchDocked

当笔记本插在dock底座上,或者多于一个显示器连接情况下合上笔记本屏幕

ignore

回到上面的问题,修改/etc/systemd/logind.conf配置(默认已经有对应配置,默认设置都是有#注释掉的,所以要设置非默认配置,则取消#注释再修改):

[Login]
#HandlePowerKey=poweroff
HandlePowerKey=suspend

然后重启systemd-logind

systemctl restart systemd-logind

hibernate还需要更多配置(配置磁盘存储内存内容),但是如果在MacBook Pro安装Fedora和macOS双启动,则使用hibernate就具有非常大的优势:只要按一下电源键就可以将当前Linux工作状态保存并关机,再次启动笔记本就可以在两种操作系统之间切换,并且回到Linux桌面时完全恢复原有工作状态,带来了极大的效率提升。

详细的hibernate睡眠设置见通过systemd设置fedora系统hibernate休眠

通过systemd设置禁止合上笔记本屏幕suspend采用了相同的原理,则是针对将笔记本电脑作为开发服务器使用,实现合上屏幕不进入休眠,始终在线运行的设置方法。

参考

Last updated