联想一键恢复密钥的新用途

联想一键恢复密钥的新用途

我有一台联想 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文件作为标志和计数器,如所述这里。因此,当您按下该按钮三次时,系统将重新启动。

  1. /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
    
  2. 创建脚本/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并绑定脚本

  1. 创建一个脚本/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
    
  2. 问题是(在这种方法中)我们必须使用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
    
  3. 系统设置键盘快捷方式(标签)→自定义快捷方式(部分)→ 添加新的+

    在此处输入图片描述

    • 在里面自定义快捷方式窗口类型:

    • 姓名reboot

    • 命令sudo /usr/local/bin/my_rbt
    • 点击Apply
  4. 点击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

找到键码后,您需要查找如何将键码映射到特定操作。以下是一些有用的问题:

相关内容