ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Linux 下 OpenLogi 的 udev 规则与 hidraw/uinput 权限设计详解

2026/8/30 10:42:31 拓冰建站 浏览量
Linux 下 OpenLogi 的 udev 规则与 hidraw/uinput 权限设计详解 Linux 下 OpenLogi 的 udev 规则与 hidraw/uinput 权限设计详解【免费下载链接】OpenLogi⚡️A native, local-first alternative to Logitech Options, written in Rust — remap buttons, DPI, and SmartShift over HID. No account, no telemetry.项目地址: https://gitcode.com/GitHub_Trending/op/OpenLogiOpenLogi 是一款用 Rust 编写的原生、本地优先的罗技设备管理工具,可视为 Logitech Options 的免费替代方案——支持按钮重映射、DPI 调节与 SmartShift,基于 HID 协议,无需账号、无遥测。在 Linux 上,它能否正常工作取决于一个关键前提:当前用户对/dev/hidraw*、/dev/uinput和鼠标事件节点的设备文件权限。本文将完整拆解 OpenLogi 自带的 udev 规则(70-openlogi.rules)的设计思路,帮助新手快速理解每条规则为什么存在、如何安装与验证。OpenLogi 需要哪三类设备访问权限OpenLogi 的后台代理(openlogi-agent)要完成捕获按键 → 发送 HID 命令 → 注入新动作的完整链路,需要三种访问:权限设备节点用途读写/dev/hidraw*通过 HID 协议与 Bolt 接收器或蓝牙直连设备通信(见 transport.rs)写/dev/uinput创建虚拟输入设备,用于按键重映射与动作注入(见 inject/linux.rs)读/dev/input/event*(鼠标)输入钩子(grab)捕获鼠标按键事件(见 hook/linux.rs)传统做法是把用户加入input组或配置 ACL,但 OpenLogi 选择了一条更优雅的路线:利用uaccess标签,只授权给当前活跃会话(Seat)的用户,无需改组、无需 root。逐条解读 70-openlogi.rules 的四组规则整个规则文件不到 40 行,按功能分为四个块,每一块都解决了特定传输方式的兼容问题。1. hidraw 双规则:同时覆盖 USB 与蓝牙SUBSYSTEMhidraw, ATTRS{idVendor}046d, TAGuaccess SUBSYSTEMhidraw, KERNELS*:046D:*, TAGuaccess两条规则匹配的都是罗技(Vendor ID046d),但面向不同总线:第一条通过ATTRS{idVendor}沿 USB sysfs 链向上查找,覆盖USB / Unifying / Bolt 接收器;第二条匹配 HID 内核命名格式bus:VID:PID.iface,专门覆盖蓝牙设备——蓝牙鼠标挂在 uhid 虚拟总线上,sysfs 中根本没有idVendor属性,第一条规则会漏掉它。 注意第二条用大写046D是刻意为之:uhid 内核名中的 VID 字段恒为大写。2. uinput 静态节点:开机即可用KERNELuinput, TAGuaccess, OPTIONSstatic_nodeuinputstatic_nodeuinput让 udev 在开机时即创建/dev/uinput节点,即使还没有插入任何设备。这样 agent 启动时无需额外触发即可打开它,避免设备未连接导致节点不存在的时序问题。3. 鼠标事件节点:只放开鼠标,不放开键盘SUBSYSTEMinput, KERNELevent*, ENV{ID_INPUT_MOUSE}1, ATTRS{idVendor}046d, TAGuaccess为什么 hidraw 之外还要授权event*节点?因为输入钩子是独占 grab/dev/input/event*来捕获按键的。而 hidraw 授权覆盖不到蓝牙鼠标:它的节点挂在/devices/virtual/misc/uhid下,不属于任何 Seat,logind 的默认 uaccess 规则永远不会为它授权,节点会保持root:input 0660。这里的权限设计体现了一个重要的安全边界:ENV{ID_INPUT_MOUSE}1把授权限定为内核判定为鼠标的节点——罗技键盘的按键输入不会变成全会话可读,隐私风险被严格收敛在指针设备范围内。4. 为什么文件名叫 70-udev 按文件名顺序执行规则。该规则依赖60-input-id.rules先运行并设置ID_INPUT_MOUSE环境变量,所以必须以70-开头保证执行顺序——这是命名中的隐藏约定。一键安装 udev 规则并验证仓库自带完整的安装脚本(packaging/linux/install.sh),会复制二进制、规则文件、systemd 用户单元、桌面条目和图标,并自动重载 udev。手动安装只需三步:sudo cp packaging/linux/udev/70-openlogi.rules /etc/udev/rules.d/ sudo udevadm control --reload-rules sudo udevadm trigger验证权限是否生效:test -w /dev/uinput echo uinput OK # 检查 uinput 可写 ls -la /dev/hidraw* # 查看 hidraw 节点 getfacl /dev/input/event* # 查看 event 节点的 ACL安装后无需重启,打开 GUI 的Settings → Permissions页面即可看到实时的Granted/Not granted指示。⚠️设备已经插着?udevadm trigger会重新评估规则,但不会为已打开的节点补发 uaccess ACL。若仍被拒绝,请拔掉接收器(或鼠标)再重插,让 udev 在重连时应用新规则。非 systemd 系统的替代方案SysV init、OpenRC 等没有 logind 的系统,把规则中的TAGuaccess替换为MODE0660, GROUPinput,再将用户加入input组(需重新登录生效):sudo usermod -aG input $USER完整说明见官方文档 docs/INSTALL-linux.md。应用如何探测权限状态OpenLogi 的权限判定逻辑在 openlogi-permissions 中,Linux 探针(linux.rs)非常精巧——没有任何同意弹窗,每次探测就是一次立即关闭的open()调用:Granted:uinput 可写且至少一个罗技 hidraw 可读写;Denied:uinput 不可访问,或存在罗技 hidraw 但打不开;Unknown:uinput 正常但未连接罗技设备。判断是不是罗技的 hidraw时,它读取 sysfs 的uevent文件,解析HID_ID0003:0000046D:...行并按数值比较Vendor ID——这样0000046D和046d两种写法都能命中,规避了字符串大小写陷阱。常见问题排查症状可能原因解决方法agent 日志报 could not install OS mouse hook蓝牙鼠标的 event 节点无 ACL重插设备让 udev 重新授权设备列表为空与 Solaar 等其他罗技管理软件抢 HID 独占访问先退出 Solaar 再启动 OpenLogils /dev/hidraw*无输出hidraw 模块未加载确认内核启用hidraw与uinput模块权限状态一直是 Unknown未连接罗技设备连接 Bolt/Unifying 接收器或蓝牙配对总结OpenLogi 的 Linux 权限设计可以归纳为三个要点:最小授权——只放行罗技设备、且事件节点仅限鼠标,键盘输入绝不暴露;零配置体验——借助uaccess标签,当前 Seat 用户开箱即用,无需 root 或改组;双传输覆盖——每类设备都有 USB/蓝牙两套匹配规则,兼容 Bolt、Unifying 与蓝牙直连三种连接方式。理解这套规则后,你在任何发行版上都能快速为 OpenLogi 配好设备访问,享受本地优先、无遥测的罗技设备管理体验。【免费下载链接】OpenLogi⚡️A native, local-first alternative to Logitech Options, written in Rust — remap buttons, DPI, and SmartShift over HID. No account, no telemetry.项目地址: https://gitcode.com/GitHub_Trending/op/OpenLogi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考