You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派4特定USB端口udev规则:仅允许存储设备的问题

解决树莓派特定USB端口仅允许存储设备的udev规则问题

问题根源

你当前的拦截规则会匹配到/dev/bus/usb/路径下的USB总线设备,这类设备是存储磁盘/分区的父级设备,阻断它们会直接导致存储设备无法正常识别——父设备被禁用后,子设备也无法工作。

修改后的规则方案

1. 允许存储设备的规则(文件名建议:01-usb-allow-storage.rules,确保优先匹配)

KERNEL=="sd?", ENV{DEVTYPE}=="disk", ATTRS{devpath}=="1.3", SYMLINK+="USBInputDISK", ATTR{authorized}:="1"
KERNEL=="sd??", ENV{DEVTYPE}=="partition", ATTRS{devpath}=="1.3", SYMLINK+="USBInputPARTITION", ATTR{authorized}:="1"

2. 拦截非存储设备的规则(文件名建议:99-usb-block-others.rules)

# 仅针对USB子系统的设备进行处理
SUBSYSTEM=="usb", ATTRS{devpath}=="1.3", GOTO="usb_filter_start"
GOTO="usb_filter_end"

LABEL="usb_filter_start"
# 跳过已关联存储设备的USB设备
PROGRAM="/usr/bin/udevadm info --query=property --name=%k | grep -q 'ID_BUS=usb.*ID_TYPE=disk'", GOTO="usb_filter_end"
# 拦截未通过检测的设备
SYMLINK+="BadUSBInput", ATTR{authorized}:="0"

LABEL="usb_filter_end"

规则说明

  • 利用udev的SUBSYSTEM字段区分设备类型:/dev/bus/usb下的设备属于usb子系统,而存储磁盘/分区属于block子系统,拦截规则只针对usb子系统设备,不会影响块设备的允许规则。
  • 通过PROGRAM调用udevadm查询当前USB设备是否关联了存储类型的属性,避免误拦截存储设备的父级USB设备。
  • 文件名前缀的数字(01、99)用于控制规则执行顺序,确保允许规则先于拦截规则生效。

测试步骤

  1. 将规则文件放置到/etc/udev/rules.d/目录下
  2. 执行命令重新加载规则:
    sudo udevadm control --reload-rules
    
  3. 重新插拔USB设备,使用udevadm monitor查看规则匹配日志,验证效果

内容的提问来源于stack exchange,提问作者Gavroche

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 21:25:23