设置:
- Ubuntu 22.04,全新安装。
- 戴尔 G15 5521 笔记本电脑
- 最新固件
- 6.0.8-060008-通用
- Nvidia 525.60.11
- X11 Ubuntu 版本的 Gnome
偶尔(对我来说大概一天一次)某个键会卡住并自动重复。按任何其他键都会停止自动重复。
这发生在默认内核和 6.0.8 上。
在 Windows 11 上不会出现此问题。运行预发布键盘测试(开机时按住 fn 键)时不会出现此问题。
多台 G15 笔记本电脑都出现了这个问题。我有一台用于工作,一台用于个人使用,还有三台用于工作。所有笔记本电脑都出现了相同的随机偶发问题,但频率足以引起投诉...
系统负载过大时,问题并不总是发生。打字速度似乎不会对问题产生任何影响。
当问题发生时,dmesg 没有显示任何与键盘或 USB 相关的内容。
我不想关闭按键重复功能(xset -r
)。
有关输入设备的更多信息:
$ xinput list
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ DELL0B56:00 06CB:CE81 Mouse id=10 [slave pointer (2)]
⎜ ↳ DELL0B56:00 06CB:CE81 Touchpad id=11 [slave pointer (2)]
⎜ ↳ PS/2 Generic Mouse id=17 [slave pointer (2)]
⎜ ↳ Logitech MX Ergo Multi-Device Trackball id=18 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
↳ Video Bus id=6 [slave keyboard (3)]
↳ Video Bus id=7 [slave keyboard (3)]
↳ Power Button id=8 [slave keyboard (3)]
↳ Integrated_Webcam_HD: Integrate id=9 [slave keyboard (3)]
↳ Intel HID 5 button array id=12 [slave keyboard (3)]
↳ Intel HID events id=13 [slave keyboard (3)]
↳ Dell Privacy Driver id=14 [slave keyboard (3)]
↳ Dell WMI hotkeys id=15 [slave keyboard (3)]
↳ AT Translated Set 2 keyboard id=16 [slave keyboard (3)]
$ uname -a
Linux Dell-G15-Special-Edition-5521 6.0.8-060008-generic #202211101901 SMP PREEMPT_DYNAMIC Thu Nov 10 20:44:03 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
我可以尝试什么来缩小发生此问题的范围?
我看过许多不同的帖子和问题,但建议却有限。
编辑 2023 年 9 月 20 日
我们现在有 8 台戴尔 G15,全部都是最新版本。所有电脑都有同样的问题。
运行 Windows 时不会出现该问题。
答案1
编辑 09/02/2024:在等待 Thinkpad 到货时,我已使用 intel_idle.max_cstate=2 内核选项(在 grub 配置中设置)将 C 状态限制为 C2。到目前为止,键盘没有问题...
编辑 18/01/2024:自从我发现按键释放的硬件中断被延迟后,我尝试了以下几种方法:
- 消除中断平衡来自我的环境的服务
- 专用一个核心仅有的键盘中断处理
- 奖励:获得了 BIOS 更新(1.11.0),提升了嵌入式控制器固件版本
不幸的是,这些改变都没有什么作用。
编辑 09/01/2024:我已确认缺少按键释放的硬件中断
Jan 9 13:31:50 atoppi kernel: [ 9452.070032] i8042: [2362855] 1c <- i8042 (interrupt, 0, 1)
Jan 9 13:31:50 atoppi kernel: [ 9452.205121] i8042: [2362889] 9c <- i8042 (interrupt, 0, 1)
Jan 9 13:31:52 atoppi kernel: [ 9453.842970] i8042: [2363298] 1c <- i8042 (interrupt, 0, 1)
Jan 9 13:31:52 atoppi kernel: [ 9453.935991] i8042: [2363322] 9c <- i8042 (interrupt, 0, 1)
Jan 9 13:31:53 atoppi kernel: [ 9454.655751] i8042: [2363502] 1c <- i8042 (interrupt, 0, 1)
here is missing the "9c" (aka ENTER key release)
from this moment ENTER key is stuck
Jan 9 13:32:06 atoppi kernel: [ 9468.085395] i8042: [2366859] e0 <- i8042 (interrupt, 0, 1)
Jan 9 13:32:06 atoppi kernel: [ 9468.085590] i8042: [2366859] 2a <- i8042 (interrupt, 0, 1)
Jan 9 13:32:06 atoppi kernel: [ 9468.085760] i8042: [2366859] e0 <- i8042 (interrupt, 0, 1)
Jan 9 13:32:06 atoppi kernel: [ 9468.085946] i8042: [2366859] 48 <- i8042 (interrupt, 0, 1)
"9c" arrives after pressing other keys
Jan 9 13:32:06 atoppi kernel: [ 9468.098398] i8042: [2366862] 9c <- i8042 (interrupt, 0, 1)
编辑 26/12/2023:我测试了 i8042 驱动程序(处理键盘的 ps/2 接口的驱动程序)的几乎所有参数,但问题仍然存在。此时,要么是 Linux 驱动程序有问题,要么是硬件控制器有问题,我认为后者的可能性更大。固件更新可能可以解决问题,但祝你好运,试着向愚蠢的戴尔支持人员解释这个问题。
我要扔掉这台垃圾笔记本电脑,换一台 ThinkPad,再也不用考虑戴尔了。
编辑 20/12/2023:我在用 evtest 跟踪事件时写了单词“room”。突然,第二个“o”卡在了键盘上,所以我用“a”停止了重复循环。
我发现该问题是由于内核的“KeyRelease”事件延迟造成的
Event: time 1703089559.564161, type 4 (EV_MSC), code 4 (MSC_SCAN), value 13
Event: time 1703089559.564161, type 1 (EV_KEY), code 19 (KEY_R), value 1
Event: time 1703089559.564161, -------------- SYN_REPORT ------------
Event: time 1703089559.692291, type 4 (EV_MSC), code 4 (MSC_SCAN), value 13
Event: time 1703089559.692291, type 1 (EV_KEY), code 19 (KEY_R), value 0
Event: time 1703089559.692291, -------------- SYN_REPORT ------------
Event: time 1703089560.008009, type 4 (EV_MSC), code 4 (MSC_SCAN), value 18
Event: time 1703089560.008009, type 1 (EV_KEY), code 24 (KEY_O), value 1
Event: time 1703089560.008009, -------------- SYN_REPORT ------------
Event: time 1703089560.126559, type 4 (EV_MSC), code 4 (MSC_SCAN), value 18
Event: time 1703089560.126559, type 1 (EV_KEY), code 24 (KEY_O), value 0
Event: time 1703089560.126559, -------------- SYN_REPORT ------------
Event: time 1703089560.618210, type 4 (EV_MSC), code 4 (MSC_SCAN), value 18
Event: time 1703089560.618210, type 1 (EV_KEY), code 24 (KEY_O), value 1
Event: time 1703089560.618210, -------------- SYN_REPORT ------------
Event: time 1703089564.805921, type 4 (EV_MSC), code 4 (MSC_SCAN), value 1e
Event: time 1703089564.805921, type 1 (EV_KEY), code 30 (KEY_A), value 1
Event: time 1703089564.805921, -------------- SYN_REPORT ------------
Event: time 1703089564.818837, type 4 (EV_MSC), code 4 (MSC_SCAN), value 18
Event: time 1703089564.818837, type 1 (EV_KEY), code 24 (KEY_O), value 0
Event: time 1703089564.818837, -------------- SYN_REPORT ------------
Event: time 1703089564.870330, type 4 (EV_MSC), code 4 (MSC_SCAN), value 1e
Event: time 1703089564.870330, type 1 (EV_KEY), code 30 (KEY_A), value 0
Event: time 1703089564.870330, -------------- SYN_REPORT ------------
请注意,仅当 4 秒后按下字母“a”(值 1)时,第二个“o”才会被释放(值 0)。
编辑:不幸的是,即使采取了我下面提出的解决方法,这个问题在很长时间后仍然再次出现 :-(
我切换到 xfce 并将以下内核模块列入黑名单。从那时起,问题仍然存在(已编辑黑名单配置文件在下面/etc/modprobe.d):
blacklist dell_laptop
blacklist dell_wmi
blacklist dell_wmi_sysman
blacklist dell_wmi_ddv
blacklist dell_smbios
blacklist dell_wmi_descriptor
禁用这些模块后我没有遇到任何问题,所有硬件设备都可以工作并且电池与以前相同。
答案2
同样如此,使用 DELL Vostro 15 3510。
您可以通过使用外接 USB 键盘一段时间来确认这不是笔记本电脑键盘的问题。
这似乎是 Wayland 的问题,当我切换到 Xorg 时,这个问题就消失了。只需在登录屏幕中选择“Ubuntu on Xorg”(右下角的小齿轮)。
答案3
我的 Dell Vostro 15 3510 也遇到了同样的问题,我创建了一个解决方法脚本。我注意到,每当我按下 时,它都会在很短的时间内针对同一个键alt+f4
触发大量press
和事件。release
一些操作系统信息:
$ uname -a
Linux pc 6.5.0-14-generic #14-Ubuntu SMP PREEMPT_DYNAMIC Tue Nov 14 14:59:49 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 23.10
Release: 23.10
Codename: mantic
我使用 KDE 和 X11。
我们先来看一下键盘设备id:
$ xinput list
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ DELL0AB2:00 27C6:0D43 Mouse id=8 [slave pointer (2)]
⎜ ↳ DELL0AB2:00 27C6:0D43 Touchpad id=9 [slave pointer (2)]
⎜ ↳ PS/2 Generic Mouse id=15 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
↳ Video Bus id=6 [slave keyboard (3)]
↳ Power Button id=7 [slave keyboard (3)]
↳ Intel HID 5 button array id=10 [slave keyboard (3)]
↳ Intel HID events id=11 [slave keyboard (3)]
↳ AT Translated Set 2 keyboard id=14 [slave keyboard (3)]
在这种情况下14
:
↳ AT Translated Set 2 keyboard id=14 [slave keyboard (3)]
然后我们看看按下的键:
key press 64
key press 70
key release 64
key release 70
key press 70
^[OSkey release 70
key press 70
^[OSkey release 70
key press 70
^[OSkey release 70
key press 70
^[OSkey release 70
key press 70
^[OSkey release 70
key press 70
^[OSkey release 70
key press 70
^[OSkey release 70
key press 70
^[OSkey release 70
key press 70
^[OSkey release 70
key press 70
^[OSkey release 70
key press 70
^[OSkey release 70
key press 70
^[OSkey release 70
key press 70
^[OSkey release 70
key press 70
^[OSkey release 70
key press 70
^[OSkey release 70
key press 70
^[OSkey release 70
key press 70
^[OSkey release 70
key press 70
^[OSkey release 70
key press 70
^[OSkey release 70
key press 70
^[OSkey release 70
key press 70
^[OSkey release 70
key press 70
^[OSkey release 70
key press 70
^[OSkey release 70
key press 70
^[OSkey press 37
key release 70
key press 70
key release 70
key press 70
key release 70
key press 70
key release 70
key press 70
key release 70
key press 70
key release 70
key press 70
key release 70
key press 70
key release 70
key press 70
key release 70
key press 70
key release 70
key press 70
key release 70
key press 70
key release 70
key press 70
key press 54
^C
首先我按下一些随机键,然后我打开一些窗口并用 alt+f4 ( 70
) 关闭它们,然后它开始重复 alt+f4 的按下和释放事件。
因此,我所做的就是检测此行为并禁用并重新启用键盘,这样所有这些事件都会停止。我知道这完全不是一个可接受的解决方案,但我想不出其他任何办法。
首次安装xdotool
:
sudo apt install -y xdotool
然后将其保存在 .sh 文件中,例如script.sh
:
#!/bin/bash
export DISPLAY=":0"
keycode="70"
xinput="/usr/bin/xinput"
xdotool="/usr/bin/xdotool"
keyboard_name='AT Translated Set 2 keyboard'
xinput_keyboard_id=$($xinput list | grep "$keyboard_name" | grep -o 'id=[0-9]\+' | cut -d= -f2 | tr -d "\n")
if [ -z $xinput_keyboard_id ]; then
>&2 echo "Error getting the device xinput id."
exit 1
fi
release_alt_f4_key() {
$xinput disable $xinput_keyboard_id
$xinput enable $xinput_keyboard_id
sleep 0.1
$xdotool keyup $keycode
}
$xinput test $xinput_keyboard_id | while read line; do
line=$(echo $line | tr -d '\r')
if [[ $line =~ "key press $keycode" ]]; then
now=$(date +%s.%N)
if [[ -n "$last_ts" && $(bc <<< "$now - $last_ts < 1") -eq 1 ]] ; then
release_alt_f4_key
fi
last_ts=$now
fi
done
exit 0
请注意,您必须将 更改keyboard_name
为我们之前获得的键盘设备名称xinput list
。
然后使其可执行:
chmod u+x script.sh
然后运行它:
./script.sh
或者您可以在后台运行它:
nohup ./script.sh >/dev/null 2>&1 &
或者您可以安排它在每个操作系统启动时运行crontab -e
:
# m h dom mon dow command
@reboot sleep 10 && /home/user/script.sh
如果您想出更好的解决方案,请告诉我!
答案4
我也遇到这个问题两年了,这很烦人。我到处搜索,有些人似乎指出这是由于触摸板和键盘之间的交互不良造成的。不幸的是,在这台电脑上,触摸板是 i2c,无法禁用。
还有一些方法可以减少问题的发生。降低系统负载会有所帮助,例如,禁用声音守护进程“pipewire”似乎可以减少问题的发生。如果您有外接鼠标,在 Linux 中卸载驱动程序仍然会有所帮助:
rmmod i2c_hid_acpi i2c_hid
将 C 状态限制为 C2 的建议也有帮助,但这些解决方案都不能完全解决问题。
我无法在这台计算机上尝试其他操作系统。