麒麟v10外接键盘功能键异常是因scancode未正确映射为x11 keysym,且系统未区分内外键策略;需通过xinput定位设备、evtest验证输入、setkeycodes临时绑定或udev规则持久化修复,亦可绕过底层用xbindkeys直接绑定x11快捷键。

麒麟V10笔记本连接外接键盘后,部分按键(如F1–F12、PrintScreen、ScrollLock、Insert等)无法触发预期功能,或方向键/数字小键盘行为异常,本质是外接键盘的scancode未被正确映射为X11 keysym,且系统未区分内置与外接设备的键位策略。
确认外接键盘设备ID与事件节点
打开终端,执行命令:xinput list | grep -i "keyboard\|kbd",找到外接键盘名称(如“Logitech USB Keyboard”),记下其ID(例如id=12)。
执行:sudo evtest,按提示选择对应ID的设备节点(通常是/dev/input/eventX),按下几个异常键(如F12、Pause),观察终端是否输出scancode——若无任何输出,说明内核未识别该设备或USB协议握手失败;若有输出但键值明显错乱(如按F1显示KEY_RIGHTCTRL),则问题在后续映射层。
临时修复:用setkeycodes手动绑定scancode
此方法适用于已知外接键盘存在固定scancode偏移的场景(常见于某些国产薄膜键盘或老式PS/2转USB设备)。
执行:sudo dmesg | tail -20 | grep -i "keycode\|scancode",查找类似“atkbd.c: Unknown key pressed (raw set)”的提示,提取括号内的十六进制scancode(如0x70)。
查表确认该scancode应映射的Linux keycode(参考/usr/include/linux/input-event-codes.h),例如0x70对应KEY_F12,则运行:sudo setkeycodes /dev/input/eventX 0x70 69(其中69是KEY_F12的十进制码)。
【必须确保eventX与xinput中设备物理路径一致,否则会改错设备】
该操作重启即失效,仅用于验证是否为映射问题。
持久化修复:通过udev规则自动加载keymap
第一步:创建专用keymap文件。执行:sudo nano /lib/udev/keymaps/logitech-usb-keyboard,写入如下内容(以修复F1–F12错位为例):
0x70 f12
0x69 f1
0x6a f2
0x6b f3
0x6c f4
0x6d f5
0x6e f6
0x6f f7
0x71 f8
0x72 f9
0x73 f10
0x74 f11
第二步:新建udev规则。执行:sudo nano /etc/udev/rules.d/95-logitech-keyboard.rules,填入:
SUBSYSTEM=="input", ATTRS{name}=="Logitech USB Keyboard", RUN+="/lib/udev/keymap $name /lib/udev/keymaps/logitech-usb-keyboard"
第三步:重载udev规则并触发:sudo udevadm control --reload-rules && sudo udevadm trigger --subsystem-match=input
第四步:拔插外接键盘,立即生效。无需重启,也不影响笔记本内置键盘。
绕过映射:直接绑定X11级别快捷键(适用于功能键复用)
若只需让某几个键(如PrintScreen截屏、Fn+F5调亮度)起作用,不追求全键匹配,可跳过底层映射,直接在X11层绑定。
方法一:使用xbindkeys图形配置工具
安装:sudo apt install xbindkeys xbindkeys-config
启动:xbindkeys-config → 点击“New” → 在“Key”栏点击“Get Key”,按下目标键(如PrintScreen)→ 在“Action”栏填入命令(如gnome-screenshot -i)→ 点击“Save & Apply”。
方法二:命令行一键绑定(以ScrollLock触发终端为例)
执行:xbindkey -k,按下ScrollLock,记录显示的keycode(如m:0x0 + c:70);
编辑~/.xbindkeysrc,添加:
"gnome-terminal"
m:0x0 + c:70
保存后运行:killall xbindkeys && xbindkeys。
注意:xbindkeys需随桌面会话自动启动,将xbindkeys &加入~/.profile末尾即可。











