涉事笔记本系一台神舟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 | [Unit] |
然后启用这个unit.
1 | systemctl enable touchpad-after-resume |
现在触摸板可以在唤醒后正常工作了,但是所有设置(滚动、单击、移动速度……)全都会被重置,只有在系统设置里把触摸板设置重新应用一次解决方案在下面:
Update 2020-01-19: 今天发现写在/etc/X11/xorg.conf.d/30-touchpad.conf
里的触摸板设置会在唤醒后(实际上应该是X重新检测到触摸板的时候)自动应用,所以只需要把相关设置放在这个文件里即可. 步骤如下:
- 执行
xinput
,找到写有Touchpad之类字眼的那一行,记住id=后的数字; - 用
xinput list-props <id>
列出触摸板设置,重点关注与Default不一样的值; - 创建
/etc/X11/xorg.conf.d/30-touchpad.conf
,写入如下内容:
1 | Section "InputClass" |
然后参照libinput(4)
把触摸板设置翻译成Xorg配置文件的格式,填在…的地方就可以啦.