国产UOS故障修复实践报告:USB 数字小键盘干扰主键盘 Num Lock 问题的排查与修复

📅 发布时间:2026/10/8 22:06:03
国产UOS故障修复实践报告:USB 数字小键盘干扰主键盘 Num Lock 问题的排查与修复
实践报告USB 数字小键盘干扰主键盘 Num Lock 问题的排查与修复项目内容报告日期2026-10-07操作系统UOS统信桌面操作系统Deepin 系systemd/udev主机H3C 台式机Zhaoxin 芯片组主键盘Telink 无线接收器迷你键盘数字小键盘Homertech USB KeyboardUSB ID276d:ffe2HID 设备问题类型外设固件行为异常导致的跨设备状态干扰修复方式udev hwdb 按设备键位重映射内核态零后台进程a idsec1/a一、问题现象用户在迷你无线键盘之外另接了一个独立的 USB 数字小键盘出现两个诡异现象主键盘 Num Lock 自动跳掉闲置一段时间后回来打字主键盘的 Num Lock 状态经常被翻转到关闭输入法跟着跳每次小键盘触发 Num Lock 翻转的同时输入法从中文状态变成英文状态。初步假设曾考虑两个键盘冲突USB 分线器供电/带宽问题并询问过换两个独立 USB 接口能否改善。a idsec2/a二、排查过程2.1 排除 USB 省电autosuspend检查所有 USB 设备的电源策略小键盘与主键盘的power/control均已是on排除 USB 自动休眠断电导致的状态丢失。2.2 evtest 抓包锁定元凶用sudo evtest监听小键盘事件设备发现关键证据每按一个数字键固件都会自动在前后各包裹一次 Num Lock 切换——先开 Num Lock → 发数字键 → 再关 Num Lock小键盘上的 Num Lock 指示灯随每次按键闪烁。2.3 根因确认Linux/Windows 中 Num Lock 是系统级共享状态任何键盘上的 Num Lock 键都会翻转全局状态所有键盘的指示灯与输入解释同步变化。小键盘固件为保证任何状态下都输出数字自作主张地替系统切换 Num Lock用完又把系统状态留在关闭——主键盘的 Num Lock 因此被反复翻掉而 Num Lock 属于 X11 修饰键Mod2输入法框架fcitx监听该事件后把中文踢回英文产生连锁症状。结论不是硬件冲突不是分线器问题换 USB 接口无意义根因是小键盘固件乱动共享状态。2.4 方案选择与实施卡点确定方案用 udev hwdb 对该设备做驱动级键位重映射——屏蔽 Num Lock 键 把数字键重映射为不依赖 Num Lock 的主键区键码见 附录 A-1。实施中连续踩坑卡点现象真相坑 1大小写依内核 modalias大写v276DpFFE2改规则后仍不生效内核 modalias 与实际查询串不是一回事见坑 3坑 2无 MODALIAS 属性udevadm info发现设备上根本没有 MODALIAS 属性新版 udev 不再依赖内核 modalias坑 3UOS 魔改规则60-evdev.rules使用hwdb --subsysteminput --lookup-prefixevdev:新式写法udev用设备属性自己拼查询串ID_VENDOR_ID276d、ID_MODEL_IDffe2小写全程与内核 modalias 无关解法同一份键位规则写三组匹配模式小写 ID / 大写 ID / 设备名做地毯覆盖总有一款命中设备名模式evdev:name:Homertech USB Keyboard:*经由60-evdev.rules第 3、4 条规则匹配最不依赖 ID 格式诊断命令见 附录 A-3。a idsec3/a三、解决方案4.1 规则语义KEYBOARD_KEY_70053unknown扫描码70053USB HID Num Lock映射为KEY_UNKNOWN按键成为空包弹系统 Num Lock 与输入法都不再受影响KEYBOARD_KEY_70059~70062数字键 1~0 重映射为主键区键码从此输出数字不再依赖 Num Lock 状态顺手废掉方向键模式KEYBOARD_KEY_70063dot小数点重映射为普通句点。完整规则文件与部署命令见 附录 A-1、附录 A-2。生效顺序不可乱改文件 →systemd-hwdb update→ 拔插设备或重启。4.2 回滚方法删除/etc/udev/hwdb.d/99-numpad.hwdb后重新update并拔插设备即可恢复原状。a idsec4/a四、验证结果修复后 evtest 事件样本对比见 附录 A-4。验证结论按小键盘数字键输出KEY_5/KEY_7等主键区键码不再是KEY_KP5/KEY_KP7数字键前后不再包裹KEY_NUMLOCK事件LED_NUML不再闪烁按小键盘自身的 Num Lock 键只产生被忽略的KEY_UNKNOWN系统 Num Lock 纹丝不动主键盘闲置后 Num Lock 不再丢失中文输入法不再被踢成英文。a idsec5/a五、经验与教训共享状态是跨设备干扰的根源Num Lock、Caps Lock、输入法开关这类全局状态任何一个设备都能翻动排查冲突先想共享。先探测机制再动手修改本轮最大的弯路是凭标准做法推断规则写法大小写。应先跑systemd-hwdb query、udevadm test、读发行版规则文件原文确认查询串的真实构成后再写规则。发行版差异要核实UOS 的60-evdev.rules采用新式hwdb --subsystem --lookup-prefix写法查询串由 udev 属性合成小写与上游文档示例不同。evtest 是输入类问题的终极工具所有判断都建立在事件层证据上避免盲目猜测。hwdb 规则生效三件套缺一不可改文件、systemd-hwdb update、设备重新接入拔插/重启。a idapp/a附录正文中所有超过 5 行的代码与日志均收录于此。每个附录条目均标注对应正文位置正文相应处亦有跳转链接双向索引。a idapp-a1/a附录 A-1 hwdb 规则完整配置对应正文 §3.1文件路径/etc/udev/hwdb.d/99-numpad.hwdbevdev:input:b*v276dpffe2* KEYBOARD_KEY_70053unknown KEYBOARD_KEY_700591 KEYBOARD_KEY_7005a2 KEYBOARD_KEY_7005b3 KEYBOARD_KEY_7005c4 KEYBOARD_KEY_7005d5 KEYBOARD_KEY_7005e6 KEYBOARD_KEY_7005f7 KEYBOARD_KEY_700608 KEYBOARD_KEY_700619 KEYBOARD_KEY_700620 KEYBOARD_KEY_70063dot evdev:input:b*v276DPFFE2* KEYBOARD_KEY_70053unknown KEYBOARD_KEY_700591 KEYBOARD_KEY_7005a2 KEYBOARD_KEY_7005b3 KEYBOARD_KEY_7005c4 KEYBOARD_KEY_7005d5 KEYBOARD_KEY_7005e6 KEYBOARD_KEY_7005f7 KEYBOARD_KEY_700608 KEYBOARD_KEY_700619 KEYBOARD_KEY_700620 KEYBOARD_KEY_70063dot evdev:name:Homertech USB Keyboard:* KEYBOARD_KEY_70053unknown KEYBOARD_KEY_700591 KEYBOARD_KEY_7005a2 KEYBOARD_KEY_7005b3 KEYBOARD_KEY_7005c4 KEYBOARD_KEY_7005d5 KEYBOARD_KEY_7005e6 KEYBOARD_KEY_7005f7 KEYBOARD_KEY_700608 KEYBOARD_KEY_700619 KEYBOARD_KEY_700620 KEYBOARD_KEY_70063dot↑ 返回 §3.1a idapp-a2/a附录 A-2 规则部署与生效命令对应正文 §3.1sudo tee /etc/udev/hwdb.d/99-numpad.hwdb /dev/null EOF 此处为附录 A-1 的文件全文略 EOF sudo systemd-hwdb update sudo udevadm trigger --sysname-matchevent13 --actionadd udevadm info /dev/input/event13 | grep KEYBOARD_KEY说明event13需替换为实际的事件设备编号用sudo evtest列表确认Homertech USB Keyboard本体最后一条命令输出KEYBOARD_KEY_*属性即为规则套上。↑ 返回 §3.1a idapp-a3/a附录 A-3 关键诊断命令集对应正文 §2、§4# 查看输入设备 modalias注意UOS 的 hwdb 查询并不使用它 cat /sys/class/input/eventX/device/modalias ​ # 查询 hwdb 数据库是否收录规则新老两种查询形式 sudo systemd-hwdb query evdev:$(cat /sys/class/input/eventX/device/modalias) sudo systemd-hwdb query evdev:input:b0003v276dpffe2 ​ # 确认规则已编译进数据库 sudo strings /etc/udev/hwdb.bin | grep -i 276d ​ # 模拟 udev 规则处理全过程观察 hwdb 匹配行为 sudo udevadm test /sys/class/input/eventX 21 | tail -50 ​ # 查看发行版实际的 evdev 规则确认查询串构成方式 cat /usr/lib/udev/rules.d/60-evdev.rules ​ # 监听设备原始输入事件终极取证工具 sudo evtest /dev/input/eventX↑ 返回 §2.4a idapp-a4/a附录 A-4 修复前后事件样本对比对应正文 §4修复前——按数字键 1前后被固件包裹 Num Lock 切换Event: ... MSC_SCAN, value 70053 Event: ... code 69 (KEY_NUMLOCK), value 1 ← 固件自动开 Num Lock Event: ... LED_NUML, value 1 Event: ... code 69 (KEY_NUMLOCK), value 0 Event: ... code 79 (KEY_KP1), value 1 ← 数字键依赖 Num Lock 状态 Event: ... code 79 (KEY_KP1), value 0 Event: ... code 69 (KEY_NUMLOCK), value 1 ← 固件再关 Num Lock Event: ... code 69 (KEY_NUMLOCK), value 0 Event: ... LED_NUML, value 0 ← 系统状态被留在关闭修复后——按小键盘 Num Lock 键及固件自动补发全部成为空包弹Event: ... MSC_SCAN, value 70053 Event: ... code 240 (KEY_UNKNOWN), value 1 ← 被 hwdb 重映射为无意义键码 Event: ... code 240 (KEY_UNKNOWN), value 0 无 LED_NUML 事件无系统状态变化修复后——按数字键 5干净的主键区键码Event: ... MSC_SCAN, value 7005d Event: ... code 6 (KEY_5), value 1 ← 主键区键码与 Num Lock 无关 Event: ... code 6 (KEY_5), value 0↑ 返回 §4