我有一台联想 G570 笔记本电脑,电源按钮旁边有一个小键,叫做一键恢复,自从使用 Linux 后,它就变得毫无用处了。
有没有办法将此键设为重置按钮?或者在 Grub 中添加一个条目以使其加载恢复选项?
我在这里看到过类似的帖子,但我没有 Windows 或双启动,我的磁盘是一个安装了 Ubuntu Gnome 的单磁盘分区,我甚至没有 SWAP 空间。
答案1
我不知道如何在 GRUB 中使用此按钮,但至少有两种方法可以使其在 Ubuntu 中可用。例如,如果您想将重启命令绑定到该按钮,您可以:(1) 创建acpi 事件或 (2) 创建自定义快捷方式。
创建acpi event
并绑定重启命令
首先,您需要使用acpi_listen
并捕获按下按钮时的事件。只需执行命令acpi_listen
并按下按钮即可:
$ acpi_listen
button/prog1 PROG1 00000080 00000000 K
- 上面的例子
button/prog1 PROG1 00000080 00000000 K
是我按下讨论的按钮时系统上发生的事件。
然后你应该创建一个文件来处理这个事件。该文件必须位于目录中/etc/acpi/events/
。例如,将其命名为reboot
。的内容/etc/acpi/events/reboot
应该类似于:
# /etc/acpi/events/reboot
# This will reboot the system
event=button/prog1 PROG1 00000080 00000000 K
action=systemctl reboot
保存文件并重新启动 acpi 守护程序:
sudo systemctl restart acpid.service
在我看来这是最简单的方法。当用户未登录时,该方法也应该有效。以下是一些参考资料,您可以在其中找到更多信息和示例:
创建acpi event
并绑定脚本
我们可以添加保险,以防您意外按下按钮。在这里我们将创建一个脚本,它将使用tmp
文件作为标志和计数器,如所述这里。因此,当您按下该按钮三次时,系统将重新启动。
/etc/acpi/events/reboot
按照如下方式修改:# /etc/acpi/events/reboot # This will reboot the system event=button/prog1 PROG1 00000080 00000000 K action=/etc/acpi/reboot.sh
重新启动 acpi 守护进程:
sudo systemctl restart acpid.service
创建脚本
/etc/acpi/reboot.sh
并将以下几行作为其内容:#!/bin/bash FLAG_FILE="/tmp/sysyem_reboot_flag" # If the file exists and it is older than 30 seconds, then reset the counter # Else If the file doesn't exist or its 'value' is less than 2, then increment # Else (when the file exists, its value is equal or greater than 2, and its age is less than 30 seconds) reboot the system if [ -f "${FLAG_FILE}" ] && [[ $(find "${FLAG_FILE}" -newermt '-30 sec') == '' ]]; then echo '1' > "$FLAG_FILE" elif [ ! -f "${FLAG_FILE}" ] || (( $(cat "$FLAG_FILE") < 2 )); then touch "$FLAG_FILE" NEW_VALUE=$(( $(cat "$FLAG_FILE") + 1)) && echo "$NEW_VALUE" > "$FLAG_FILE" else systemctl reboot fi
使其可执行:
sudo chmod +x /etc/acpi/reboot.sh
现在,systemctl reboot
当您在 30 秒内按下按钮三次时,命令就会执行。
创建custom shortcut
并绑定脚本
创建一个脚本
/usr/local/bin/my_rbt
(可以随时命名和定位)并使其可执行。以下是执行此操作的单个命令行:$ echo -e '#!/bin/sh\nsudo systemctl reboot' | sudo tee /usr/local/bin/my_rbt && sudo chmod +x /usr/local/bin/my_rbt #!/bin/sh systemctl reboot
问题是(在这种方法中)我们必须使用
sudo
来执行脚本,并且应该允许用户在没有密码的情况下执行此操作 - 这里提供了有关此步骤的更多详细信息:如何在没有密码的情况下运行特定的 sudo 命令?因此我们必须创建一个位于的文件/etc/sudoers.d/
,例如名为my_rbt
。为此,我们应该使用以下命令visudo -f
:sudo visudo -f /etc/sudoers.d/my_rbt
该文件的内容应为:
ALL ALL=NOPASSWD: /usr/local/bin/my_rbt
去系统设置→键盘→快捷方式(标签)→自定义快捷方式(部分)→ 添加新的+。
在里面自定义快捷方式窗口类型:
姓名:
reboot
- 命令:
sudo /usr/local/bin/my_rbt
- 点击Apply
点击
Disabled
右栏的并按下讨论的按钮。
就是这样。
答案2
看来,对于联想笔记本电脑(至少是我的 G575),OneKey Recovery 键是另一个键。
使用该xev
命令,您可以找出扫描码。xev
将打开一个带有黑色方块的窗口,将鼠标移到其中,然后按 OKR 键。
KeyPress event, serial 51, synthetic NO, window 0x1600001,
root 0x497, subw 0x1600002, time 1092364, (50,41), root:(52,479),
state 0x0, keycode 156 (keysym 0x1008ff41, XF86Launch1), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
KeyRelease event, serial 51, synthetic NO, window 0x1600001,
root 0x497, subw 0x1600002, time 1092364, (50,41), root:(52,479),
state 0x0, keycode 156 (keysym 0x1008ff41, XF86Launch1), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
您可以看到密钥代码为keycode
156
。
找到键码后,您需要查找如何将键码映射到特定操作。以下是一些有用的问题: