我在 HP Envy 15 上使用 Ubuntu 18.04 LTS 与 Windows 7 双启动。我的笔记本电脑进入睡眠模式(盖子关闭)后,它会打开飞行模式,但关闭它的按钮变灰,并显示“使用硬件开关关闭”,唯一的其他开关是 +,Fn它F12不起作用。它在重启时自行修复,但我想知道是否有办法阻止它。在 Windows 中,这种情况发生在插入电源并使用电池的情况下。睡眠前:
$ sudo rfkill
ID TYPE DEVICE SOFT HARD
0 bluetooth hci0 unblocked unblocked
1 wlan phy0 unblocked unblocked
睡眠后:
$ sudo rfkill
ID TYPE DEVICE SOFT HARD
1 wlan phy0 unblocked blocked
我尝试过通过阻止和解除阻止来做到这一点rfkill
,但是没有用,我发现禁用它的唯一方法是通过重新启动。
答案1
编辑:此解决方案已被我发现的实际根本问题的修复所取代。请忽略以下信息
总结:https://github.com/snyball/hawk。使用此工具将键码 255 重新映射到空字符,问题就解决了。
这里的问题是,无论 Linux 为盖子/平板电脑模式开关使用什么驱动程序,都会错误地将它们解释为生成键码 255(或 247,取决于……东西。我一直不明白为什么有时是其中一个)。键码 255 恰好是 rfkill 键,它将系统置于飞行模式。
我花了太。太。长了。解决这个问题。我尝试过弄乱 DKMS,尝试过使用 Xmodmap(实际上它工作了一段时间,直到我意识到 X11 弄乱了我的触摸板),在后台运行了一个不断运行的程序rfkill unblock all
,我甚至尝试过在内核级别禁用键码。最后什么奏效了?一个叫做 Hawk 的免费开源程序。
霍克(https://github.com/snyball/hawk) 是迄今为止解决此问题的最佳方法,至少在出现故障的内核驱动程序更新之前是这样。它与桌面无关(甚至在控制台模式下也能工作),设计为在启动时运行,与 Xmodmap 不同,它是模块化且可编写脚本的。我所做的是创建一个名为“fixapmode.hwk”的脚本(名称无关紧要),内容如下:
key(255) => insert ""
(如果您复制我的方法,请记住引号之间没有空格)。
然后我将脚本设置为可执行文件,在 Hawck 中启用它,将 Hawck 设置为在启动时运行,它就成功了!唯一挥之不去的问题是,我的笔记本电脑仍然会以飞行模式启动,因为 Hawck 不会在启动时立即启动。我通过使用命令创建一个新的启动程序解决了这个问题rfkill unblock all
。这样,我可以说问题完全解决了。唯一烦人的是,第一次从启动登录时,您会收到来自 Hawck 的通知,告知您它已成功加载了您的脚本。但是,可能有一种方法可以关闭它,它是非常多比其他选择更好。
希望这能有所帮助。干杯!
答案2
睡眠后尝试执行以下命令:
sudo systemctl restart network-manager.service
sudo ifconfig wlx8c882b131d8 up
sudo rfkill unblock all
更改wlx8c882b131d8
为您自己的 WiFi 适配器的名称。如果此方法有效,那么您可以创建一个 systemd 服务,该服务将在您从睡眠模式唤醒后启动,并自动执行上述操作。
此外,在某些情况下,也可以取出/插入电池。
此外,在未屏蔽的设备上启用/禁用 WiFi 的组合键是否有效?如果没有,请找出原因。
而且,正如没有人建议的那样(参考)
gsettings list-recursively | less
您可以通过输入 找到有关飞行模式的条目/rfkill
。复制该行并在新的命令行上使用 gsettings “set” 参数,但将“true”更改为“false”:
gsettings set org.gnome.settings-daemon.plugins.rfkill active false
但是,之前建议的命令也有其缺点。因此,您可以尝试从同一参考资料中获取的下一个建议的解决方案:
我的 HP 250 G5 也遇到了同样的问题。对我来说,这是因为盖子
e058/e057
在关闭/打开时发送扫描代码导致的。由于某种原因,GNOME 决定将其与飞行模式打开相对应。正如 ropid 提到的,您可以通过禁用 GNOME 的 rfkill 插件来修复它,但这也会阻止通过 GNOME 设置启用/禁用蓝牙。
我设法通过映射
e058/e057
到keycode 245
(显示关闭)来解决这个问题在关闭和打开盖子之前使用
{ journalctl -f }
,看看关闭盖子是否模拟任何按键。日记条目还应该告诉您按键的扫描码(e058 & e057
就我而言)然后使用
{ setkeycodes [SCANCODE] [KEYCODE] }
将盖子发送的扫描码映射到所需的键(在我的情况下,我使用了setkeycodes e058 245 e057 245
)。如果您不想将其映射到 DISPLAY OFF,您可以在以下位置找到其他键码列表/usr/include/linux/input-event-codes.h
如果问题已修复,则通过创建并启用 systemd 单元文件使其持久化,
/etc/systemd/system/
我使用的该文件如下所示:[Unit] Description=Fix WiFi off on lid close [Service] ExecStart=/usr/bin/setkeycodes e058 245 e057 245 [Install] WantedBy=multi-user.target
答案3
这是 Linux 内核中 Intel HID 驱动程序的一个错误。修复方法如下:
下载 Linux 内核源代码
在文本编辑器中打开文件 drivers/platform/x86/intel/hid.c
搜索字符串“KEY_RFKILL”。应该会找到如下一行:
{ KE_KEY, 8, { KEY_RFKILL }},
删除字符串“KEY_RFKILL”。该行现在应如下所示:
{ KE_KEY, 8, { } },
编译并安装内核,当您关闭笔记本电脑/将其置于平板电脑模式时,它应该不再打开飞行模式。
干杯!
编辑:由于这是英特尔 HID 实现的问题,这意味着此错误可能不存在于 AMD 型号上。有 AMD 机器的人可以确认这一点吗?