休眠后触摸板不工作

pan*_*ita 4 arch-linux shell-script hibernate touchpad systemd

我使用的是最新的 Arch/Antergos Linux。

从休眠状态恢复后,我的触摸板停止工作。我似乎受到了这个错误的影响,我需要sudo rmmod i2c_hid; modprobe i2c_hid在每次恢复后输入以使触摸板恢复工作状态。

我试图通过添加脚本这一进程的自动化fix-touchpad.sh,以/usr/lib/systemd/system-sleep使得它在恢复时从休眠状态运行:

#!/bin/sh
if [ $1 = post ]
then
    rmmod i2c_hid
    modprobe i2c_hid
fi
Run Code Online (Sandbox Code Playgroud)

该脚本在启动时执行,我在测试echo "something" > log.log之前和之后if以及就在fi. 然而,它并没有让我的触摸板恢复原状。

我还在sh fix-touchpad.sh post恢复后成功测试了脚本,瞧,我的触摸板再次唤醒。

为什么脚本在作为恢复程序的一部分运行时不修复触摸板?

有没有其他方法可以修复我的触摸板?

小智 5

我不确定为什么,但问题是在从 hibernation 返回时尝试删除和添加模块

解决方案1

我遇到了和你一样的问题,fix-touchpad.sh直到我尝试在休眠之前删除模块并在之后重新添加它,你的脚本才起作用。

基于Fedora 论坛的这个答案,它可能是这样的:

$ cat /usr/lib/systemd/system-sleep/fix-touchpad.sh
#!/bin/bash
[ "$1" = "pre" ] && modprobe -r i2c_hid
[ "$1" = "post" ] && modprobe i2c_hid
exit 0
Run Code Online (Sandbox Code Playgroud)

解决方案2

我还找到了另一种在 hibernate/resume 上执行代码的方法,它也只在 hibernation 之前删除模块时才有效。正如 Arch 的 Wiki Power management#Sleep hooks 中所述,您可以创建一个由 sleep 服务触发的 systemd 服务。

根据维基说明,我想出了以下内容:

$ cat /etc/systemd/system/root-resume.service
[Unit]
Description=(un)load module i2c_hid when going to/from sleep
Before=sleep.target
StopWhenUnneeded=yes

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=modprobe -r i2c_hid
ExecStop=modprobe i2c_hid

[Install]
WantedBy=sleep.target
Run Code Online (Sandbox Code Playgroud)

该服务应启用systemd enable root-resume。注意 ExecStart 会在 之前执行sleep.target,ExecStop 会在恢复时执行。

解决方案3

systemd-suspend-modulesAUR查看包裹。它基本上定义了一个服务,该服务为用户配置文件中列出的每个模块执行解决方案 1。它可能更适合其他模块,因为它“递归卸载给定的模块和所有依赖它的模块”(https://github.com/parkouss/systemd-suspend-modules/blob/master/suspend-modules#L19) .