0%

让Linux在一台神舟笔记本上休眠后成功唤醒

涉事笔记本系一台神舟Z7M-CT5NA,发行版为Arch Linux,或许也适用于其他症状相同的机器和/或发行版.

问题

详细症状如下:

  • 能成功休眠;
  • 重启后加载完休眠映像后迅速黑屏,这时reisub无效且硬盘灯不亮;
  • 日志结束在PM: hibernation entry处.

解决方案

一番周折后开始考虑内核问题. 在archlinux_pkg_linux directory listing可以找到linux这个包的所有历史版本. 用二分法可以锁定到是4.16.7版本的某些更新内容导致了唤醒失败,于是找到了这个页面:199747 – resume from hibernate results in kernel panic (bisected).

(报告人表示重启后Caps Lock狂闪,然而神舟的这台笔记本并没有键盘指示灯……)

网页上给出的一种解决方案是把intel_lpss_pci这个模块放在initramfs里面. 在Arch Linux上编辑/etc/mkinitcpio.conf

1
MODULES=(... intel_lpss_pci ...)

然后重新生成initramfs:

1
# mkinitcpio -P

重启后应该就可以正常唤醒了.

Troubleshooting

触摸板

执行上述步骤可以正常唤醒,然而唤醒以后触摸板会死掉.

按照网页上的提示,需要在唤醒后重新加载intel_lpss_pci这个模块。创建/etc/systemd/system/touchpad-after-resume.service并添加以下内容:

1
2
3
4
5
6
7
8
9
10
[Unit]
Description=Reload touchpad
After=sleep.target suspend.target hibernate.target hybrid-sleep.target

[Service]
Type=oneshot
ExecStart=sh -c 'modprobe -r intel_lpss_pci && modprobe intel_lpss_pci'

[Install]
WantedBy=sleep.target suspend.target hibernate.target hybrid-sleep.target

然后启用这个unit.

1
# systemctl enable touchpad-after-resume

现在触摸板可以在唤醒后正常工作了,但是所有设置(滚动、单击、移动速度……)全都会被重置,只有在系统设置里把触摸板设置重新应用一次解决方案在下面:

Update 2020-01-19: 今天发现写在/etc/X11/xorg.conf.d/30-touchpad.conf里的触摸板设置会在唤醒后(实际上应该是X重新检测到触摸板的时候)自动应用,所以只需要把相关设置放在这个文件里即可. 步骤如下:

  1. 执行xinput,找到写有Touchpad之类字眼的那一行,记住id=后的数字;
  2. xinput list-props <id>列出触摸板设置,重点关注与Default不一样的值;
  3. 创建/etc/X11/xorg.conf.d/30-touchpad.conf,写入如下内容:
1
2
3
4
5
Section "InputClass"
Identifier "Touchpad"
Driver "libinput"
...
EndSection

然后参照libinput(4)把触摸板设置翻译成Xorg配置文件的格式,填在…的地方就可以啦.