如何控制udev对输入设备的标签分配?自定义规则修改虚拟设备标签
解决uinput虚拟设备被识别为Tablet而非Mouse的问题
当然可以!udev的规则系统完全允许你覆盖它默认的设备分类逻辑,不管设备支持哪些输入事件类型。下面是具体的实现步骤和细节:
1. 先定位你的虚拟设备的唯一标识
首先你需要找到能精准匹配你的uinput虚拟设备的属性,避免规则影响到其他真实硬件。
- 先启动你用uinput创建的虚拟设备
- 找到对应的input节点,比如
/dev/input/eventX(可以通过ls /dev/input/或者evtest工具查看) - 运行以下命令查看设备的udev属性:
重点关注这些属性:udevadm info -a /dev/input/eventXATTRS{name}:你在uinput代码里设置的设备名称(比如你可以设为"MyCustomVirtualMouse")ATTRS{id/vendor}和ATTRS{id/product}:uinput设备的厂商/产品ID(代码里可以自定义,比如设为0x1234和0x5678)
选择一个或多个组合来确保只匹配你的虚拟设备,比如用设备名+厂商ID的组合,这样最稳妥。
2. 编写自定义udev规则
在/etc/udev/rules.d/目录下创建一个优先级较高的规则文件(文件名以99-开头,确保它在默认规则之后执行),比如99-virtual-mouse-override.rules。
根据你找到的设备属性,写入类似这样的规则:
# 匹配自定义名称的uinput虚拟设备,强制标记为mouse SUBSYSTEM=="input", ATTRS{name}=="MyCustomVirtualMouse", ENV{ID_INPUT_MOUSE}="1", ENV{ID_INPUT_TABLET}="" # 如果用厂商/产品ID匹配,规则可以写成: # SUBSYSTEM=="input", ATTRS{id/vendor}=="1234", ATTRS{id/product}=="5678", ENV{ID_INPUT_MOUSE}="1", ENV{ID_INPUT_TABLET}=""
规则解释:
SUBSYSTEM=="input":限定只匹配input子系统的设备- 后面的
ATTRS{...}是你的设备匹配条件 ENV{ID_INPUT_MOUSE}="1":强制告诉udev这个设备是mouseENV{ID_INPUT_TABLET}="":清空默认的tablet标记,避免冲突
3. 应用规则并验证
- 先重新加载udev规则:
udevadm control --reload-rules - 触发udev重新识别你的设备:
udevadm trigger /dev/input/eventX - 最后验证规则是否生效:
如果输出显示udevadm info /dev/input/eventX | grep -E "ID_INPUT_MOUSE|ID_INPUT_TABLET"ID_INPUT_MOUSE=1且ID_INPUT_TABLET不存在或为空,就说明规则生效了。
额外提示
- 在创建uinput设备时,尽量设置一个唯一的设备名称或自定义的厂商/产品ID,这样规则不会误匹配其他设备
- 如果你的设备同时支持EV_REL和EV_ABS,这个规则依然有效,因为我们直接覆盖了udev的分类标记,而不是修改设备的事件支持
内容的提问来源于stack exchange,提问作者Luca Carlon
相关产品推荐
相关产品推荐

