树莓派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)用于控制规则执行顺序,确保允许规则先于拦截规则生效。
测试步骤
- 将规则文件放置到
/etc/udev/rules.d/目录下 - 执行命令重新加载规则:
sudo udevadm control --reload-rules - 重新插拔USB设备,使用
udevadm monitor查看规则匹配日志,验证效果
内容的提问来源于stack exchange,提问作者Gavroche
相关产品推荐
相关产品推荐

