![为什么我的 HP 笔记本电脑在 Ubuntu 18.04 上“飞行模式”不断切换?](https://linux22.com/image/1003381/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E7%9A%84%20HP%20%E7%AC%94%E8%AE%B0%E6%9C%AC%E7%94%B5%E8%84%91%E5%9C%A8%20Ubuntu%2018.04%20%E4%B8%8A%E2%80%9C%E9%A3%9E%E8%A1%8C%E6%A8%A1%E5%BC%8F%E2%80%9D%E4%B8%8D%E6%96%AD%E5%88%87%E6%8D%A2%EF%BC%9F.png)
我有一台 HP Spectre x360 可转换笔记本电脑,运行的是 Ubuntu 18.04。每次我将屏幕转向一侧或切换到平板模式再转回来时,“飞行模式”就会被激活。事实上,当我启动并登录时,我必须手动关闭“飞行模式”并重新打开 wifi。我不想像这样禁用 gnome rfkill 插件:“gsettings set org.gnome.settings-daemon.plugins.rfkill active false”,因为这样我就不能再使用蓝牙了。此外,出于某种天杀的原因,即使我确实禁用了插件,gnome shell 还是会打开“飞行模式”,这意味着我每次登录时都必须重新打开 wifi。这太烦人了,我真的很喜欢 18.04 的走向,但这严重破坏了整个 gnome shell 体验。
答案1
在 GNOME Shell 中,许多 HP 笔记本电脑在启动时、屏幕向侧面倾斜时或盖子打开/关闭时都会自动激活“飞行模式”。以下是针对运行 Linux 并使用 GNOME Shell 的 HP 笔记本电脑的修复方法。键码 240KEY_UNKNOWN
在 中定义为(一种无操作键)/usr/include/linux/input-event-codes.h
。此外,您的系统日志将不再提示您定义 HP e057 和 e058 代码,这可能会非常烦人。
首先是使用经典的 SysV 初始化脚本进行修复,将其放置在init.d
目录中并进行相应的符号链接(基本上,我们希望它能够在除 halt(0)或 reboot(6)之外的任何运行级别上运行)。
第二个是systemd
更可靠的服务,可能最近有所systemd
改进,它也适用于 Fedora 28 和其他发行版平台。特别是在 Fedora 上,您会发现目录中几乎完全没有脚本/etc/init.d
,只有一份简短的 README 详细说明了从 SysV 到 的过渡systemd
。
第一种方法可以工作,但第二种方法更加“未来友好”,特别是考虑到 Ubuntu 的发展方向,并且工作方式也稍微不那么......烦人。initsystemd
脚本实际上非常方便,并且在 Ubuntu 18.04 中完全实现并经常使用。
旧的 SysV 方法(在终端中输入):
sudo sh -c 'printf "#!/bin/sh\n/usr/bin/setkeycodes e057 240 e058 240\n" > /etc/init.d/hp-keycodes'
sudo chmod +x /etc/init.d/hp-keycodes
sudo ln -s /etc/init.d/hp-keycodes /etc/rc1.d/K01hp-keycodes
sudo ln -s /etc/init.d/hp-keycodes /etc/rc2.d/S01hp-keycodes
sudo ln -s /etc/init.d/hp-keycodes /etc/rc3.d/S01hp-keycodes
sudo ln -s /etc/init.d/hp-keycodes /etc/rc4.d/S01hp-keycodes
sudo ln -s /etc/init.d/hp-keycodes /etc/rc5.d/S01hp-keycodes
sudo reboot
新的推荐systemd
方法(在终端中输入):
sudo nano /etc/systemd/system/hp-keycodes.service
粘贴以下行或将其输入到文件中:
[Unit]
Description=HP setkeycodes fix
[Service]
Type=oneshot
Restart=no
RemainAfterExit=no
ExecStart=/usr/bin/setkeycodes e057 240 e058 240
[Install]
WantedBy=rescue.target
WantedBy=multi-user.target
WantedBy=graphical.target
Ctrl保存并使用+ x,确认文件名y。然后,在终端中输入:
sudo systemctl daemon-reload
sudo systemctl enable --now hp-keycodes.service
就是这样,当您倾斜屏幕或关闭/打开笔记本电脑盖时不再出现令人恼火的奇怪东西!
答案2
我在 HP Spectre x360 上使用 17.10 时遇到了同样的问题。事实上,我遇到了 Nicholas 和 Pierre-Antoine 问题:
- 每次我登录或切换到平板电脑模式时都会激活飞行模式;
- Fn+F12(切换飞行模式键)不再起作用。
为了快速切换 wifi,我制作了一个小脚本:
## Content of ~/scripts/wifi_toggle : ##
#!/bin/bash
str=`export LANGUAGE=en_GB ; nmcli r wifi`
[ "$str" == "enabled" ] && nmcli r wifi off
[ "$str" == "disabled" ] && nmcli r wifi on
我很少使用蓝牙,所以它只能处理 wifi,但您可以轻松地修改它以同时处理蓝牙和 wifi。
所有这些都明显是从 17.04 开始的,在 17.04 中一切都运行完美。我尝试了 18.04 测试版,但情况与 17.10 相同。
Nicholas,Pierre-Antoine,我想就这些问题填写两份错误报告(每个问题一份报告)。你认为我报告完后,你能在这些报告中发表评论吗?这将有助于确认错误状态(受影响的用户不止一个)。
干杯
答案3
非常感谢你!
我可以确认@尼古拉斯的修复也适用于我的华为 Matebook D15(不可转换),它在挂起后似乎失去了所有连接。
检查文件后
/usr/include/linux/input-event-codes.h
我可以确定在我的系统中密钥 240 也被标记为 KEY_UNKNOWN,所以我决定给他的“系统化“解决方案试一试……而且成功了!显然,我更改了新文件的名称以反映我的系统(“huawei-keycodes.service”),并且还更改了文件中服务的描述,但其他一切都只是复制/粘贴工作。再次感谢,我希望我的经验可以帮助其他遇到类似问题的人,他们不一定使用 HP 机器。
编辑:刚刚意识到它只在我主动挂起计算机时才起作用,当计算机在关闭盖子时自动挂起时它不起作用......我还需要做更多的研究......
答案4
作为 Nicholas Stommel 回答的后续,udev 也能够从 hwdb 中为相应的硬件设置键码。事实上,systemd 的 udev hwdb 是导致此故障的罪魁祸首。我有以下代码片段/etc/udev/hwdb.d/70-keyboard.hwdb
:
# systemd's udev hwdb breaks our keyboard tablet mode switcheroo thing. Fix it.
evdev:atkbd:dmi:bvn*:bvr*:bd*:svnHewlett-Packard*:pnHPSpectrex360Convertible*:pvr*
KEYBOARD_KEY_ab=unknown # emitted by brightness keys
KEYBOARD_KEY_d7=f22 # normal mode - turn touchpad on
KEYBOARD_KEY_d8=f23 # tablet mode - turn touchpad off
将这些键设置为 F22 和 F23 将使 GNOME 在从平板电脑模式切换时显示触摸板开/关图标。其ab
定义是每当按下亮度降低/增加键时,都会静音内核警告。
我不知道这里的选择器是否限制太多,但它在我的 2015 款笔记本电脑上运行正常。运行 即可找到选择器中的相关产品名称sudo dmidecode
。