为什么在我的HP笔记本电脑上使用Ubuntu 18.04时,“飞行模式”会不断切换开启?

我有一台HP Spectre x360可转换笔记本电脑,运行的是Ubuntu 18.04。每次我将屏幕旋转或切换到平板模式后,都会自动激活“飞行模式”。实际上,当我启动并登录时,我必须手动关闭“飞行模式”并重新打开无线网络。我不想像这样禁用gnome rfkill插件:'gsettings set org.gnome.settings-daemon.plugins.rfkill active false',因为那样我就无法使用蓝牙了。而且,出于某种令人发指的原因,即使我确实禁用了该插件,gnome shell仍然会自动打开“飞行模式”,这意味着我每次登录时都必须重新打开无线网络。这真的很烦人,我真的很喜欢18.04的发展方向,但这严重影响了整个gnome shell的使用体验。

1问题是在17.10出现的吗?我有同样的笔记本电脑,我在Ubuntu 17.04上也遇到了同样的问题。在17.10中更糟糕的是,“飞行模式/F12”键不再起作用,所以我必须去右上角的菜单再次启用它。你有同样的问题吗? - Pierre-Antoine
据我所知,正确设置启动时的按键代码也可以解决飞行模式F12键无法工作的问题。现在我终于可以愉快地切换飞行模式了,真是太棒了!这个问题只有在我开始使用17.10版本的GNOME Shell后才变得明显,因为我从未使用过GNOME Spin。 - Nicholas Stommel
4个回答

在GNOME Shell中,许多HP笔记本电脑在启动时会自动激活“飞行模式”,当屏幕倾斜、盖子打开/关闭时也会激活。以下是适用于运行Linux并使用GNOME Shell的HP笔记本电脑的修复方法。在`/usr/include/linux/input-event-codes.h`中,键码240被定义为`KEY_UNKNOWN`(一种无操作键)。此外,您的系统日志将不再提示您定义HP e057和e058代码,这可能非常烦人。
首先,我们使用经典的SysV init脚本进行修复,将其放置在`init.d`目录中,并相应地创建符号链接(基本上,我们希望它在除了halt(0)或reboot(6)之外的任何运行级别上运行)。
其次,使用`systemd`服务进行修复更加可靠,也许是由于最近的`systemd`更改而存在,它还适用于Fedora 28和其他发行版平台。特别是在Fedora上,您会发现`/etc/init.d`目录几乎没有脚本,还有一个小的README文件详细说明了从SysV到`systemd`的过渡。
第一种方法可以工作,但第二种方法更加“面向未来”,特别是考虑到Ubuntu的发展方向,而且它的工作方式稍微不那么令人讨厌。实际上,systemd init脚本非常方便,在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+xy。然后,在终端中输入:
sudo systemctl daemon-reload
sudo systemctl enable --now hp-keycodes.service

就是这样,当你倾斜屏幕或关闭/打开笔记本电脑盖子时再也没有烦人的奇怪问题了!


这对我的HP Notebook 15-ac14ne起作用了。 - Tooniis
1这在Ubuntu 17.10上无效。 - nikhilweee
3谢谢。这个方法在我的Spectre x360上起了作用,而其他很多解决方案都没有效果。 - Matt West
1在我的2015年13英寸HP Spectre x360上,登录和屏幕旋转飞行模式都能正常工作。 - wakers01
1非常适用于我的HP Spectre 13-4110nd x360。 - Hugo
由于 e058 似乎是“盖子关闭”事件,我将其设置为 KEY_POWER(116)- 当按下电源键时,笔记本电脑会进入暂停状态,当盖子关闭时也会进入暂停状态。然后,ExecStart 命令将是“/usr/bin/setkeycodes e057 240 e058 116”。KEY_SUSPEND 没有起作用。 - nspo
我尝试过,但对我来说没有起作用。你能帮我解决这个问题吗?https://askubuntu.com/q/1146524 - ARIF MAHMUD RANA
它适用于我的惠普Pavilion Gaming 15-EC-1011NS。我刚刚在“新推荐的Systemd方法”之前尝试了这些步骤。 - Henry Navarro
通过“新推荐的Systemd方法”,按下F12键可启用飞行模式,并显示消息“已启用飞行模式”。再次按下F12键不会禁用飞行模式。相反,我看到与之前相同的消息,“已启用飞行模式”。我需要为ExecStart使用不同的值吗?(这适用于搭载Ubuntu 21.04的HP Spectre x360 Convertible 15-bl1XX)。 - Enterprise
这对我有效。太好了,谢谢!我建议在命令列表中去除前面的“$”符号,这样命令就更容易复制了。 - Jardel Lucca
2由于升级到22.04版本后,不知何故第二种方法对我来说停止工作了。 - 0x539
谢谢!在Linux Mint 21上也适用。 - Wellington1993

我在我的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相比的明显退步,那时一切都运行得非常顺利。我尝试了18.04的测试版,但与17.10的情况相同。
Nicholas,Pierre-Antoine,我想在这些问题上提交两份错误报告(每个问题一个报告)。你们认为在我完成报告后能否在这些报告中添加评论?这将有助于确认错误状态(多个用户受到影响)。
谢谢!

要将错误报告标记为影响某人,他们应该点击位于错误标题下方的“此错误是否影响您?”链接。 - Chai T. Rex
如果您提交了一个错误报告,请在这里贴上链接,以便其他遇到同样问题的人(包括我自己)可以订阅它。 - ec2011
很不幸,就我所知,这实际上是一个惠普可转换笔记本的硬件问题,在大多数机器上可能根本不存在,所以在官方软件包存储库中添加特殊条款或初始化脚本可能并不是一个解决办法。这似乎是一个混合了内核和gnome-shell问题的情况。我可以尝试对gnome-shell提交一个错误报告,但他们刚刚在不久前切换到了那个令人头痛的GitLab系统。通过修订答案(systemd初始化脚本),可以解决飞行模式键的问题。 - Nicholas Stommel
Antoine,我试过了,但对我没有起作用。你能帮我解决这个问题吗?这是链接:https://askubuntu.com/q/1146524 - ARIF MAHMUD RANA
在HP Omen 15上运行得非常顺利 - Sudhanshu

非常感谢你!
我可以确认@Nicholas的修复方法也适用于我的华为Matebook D15(非可转换型),在暂停后似乎失去了所有连接。
检查文件后,
/usr/include/linux/input-event-codes.h 

我发现在我的系统中,键240也被标记为KEY_UNKNOWN,所以我决定尝试他的“Systemd”解决方案... 结果奏效了!显然,我改变了新文件的名称以反映我的系统("huawei-keycodes.service"),并且还在文件中更改了服务的描述,但其他一切都只是复制/粘贴工作。
再次感谢,希望我的经验能帮助其他遇到类似问题的人,不一定是在惠普机器上。
编辑:刚意识到只有在我主动暂停计算机时才有效,当计算机自动在关闭盖子时暂停时它不起作用... 我还需要进行更多的研究...

作为对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找到选择器中相关的产品名称。