news 2026/1/12 0:49:05

udev规则文件的作用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
udev规则文件的作用

udev 规则文件

1.基本概念

  • udev:Linux 的设备管理器,负责在/dev目录下动态创建设备节点

  • 规则文件:以.rules结尾,位于/etc/udev/rules.d/目录

  • 文件名格式数字-名称.rules,数字决定执行顺序(越小越先执行)

2.常见用途

  • 插入 USB 设备时自动挂载

  • 检测到特定网卡时自动配置

  • 加载特定驱动或运行脚本

  • 修改设备权限(如允许普通用户访问串口)

WiFi 热点规则的示例

示例 1:检测到特定网卡时启动热点

bash

# /etc/udev/rules.d/90-wifi-hotspot.rules ACTION=="add", SUBSYSTEM=="net", KERNEL=="wlan0", RUN+="/usr/bin/systemctl start hostapd"

示例 2:更复杂的规则

bash

# 当 wlan0 网卡被添加,且驱动为特定型号时启动服务 ACTION=="add", SUBSYSTEM=="net", KERNEL=="wlan0", DRIVERS=="rtl8192cu", \ RUN+="/bin/sh -c '/usr/bin/systemctl start hostapd && /usr/bin/systemctl start dnsmasq'" # 当设备移除时停止服务 ACTION=="remove", SUBSYSTEM=="net", KERNEL=="wlan0", \ RUN+="/bin/sh -c '/usr/bin/systemctl stop hostapd && /usr/bin/systemctl stop dnsmasq'"

示例 3:完整的 WiFi 热点自动配置

bash

# /etc/udev/rules.d/90-wifi-hotspot.rules # 当检测到 wlan0 网卡可用时 ACTION=="add", SUBSYSTEM=="net", KERNEL=="wlan0", \ TAG+="systemd", ENV{SYSTEMD_WANTS}="wifi-hotspot.service" # 对应的 systemd 服务文件 # /etc/systemd/system/wifi-hotspot.service [Unit] Description=Start WiFi Hotspot After=network.target Requires=network.target [Service] Type=oneshot ExecStart=/usr/local/bin/setup-wifi-hotspot.sh RemainAfterExit=yes [Install] WantedBy=multi-user.target

规则语法解析

bash

# 基本格式 键=="值", 键=="值", ... RUN+="命令" # 常用键: # ACTION - "add"(添加)、"remove"(移除) # SUBSYSTEM - "net"(网络)、"tty"(串口)、"usb"(USB) # KERNEL - 设备内核名称(如 wlan0, eth0) # ATTR{属性} - 设备属性(如地址、厂商ID) # ENV{变量} - 环境变量

调试和测试 udev 规则

1.重新加载 udev 规则

bash

# 重新加载规则(不重启) sudo udevadm control --reload-rules sudo udevadm trigger # 或重启 udev 服务 sudo systemctl restart systemd-udevd

2.查看设备信息

bash

# 查看 wlan0 的详细信息 udevadm info -a -p /sys/class/net/wlan0 # 查看 USB WiFi 适配器信息 udevadm info -a -p $(udevadm info -q path -n /sys/class/net/wlan0)

3.测试规则(不实际执行)

bash

# 模拟添加 wlan0 设备 sudo udevadm test /sys/class/net/wlan0 # 查看规则匹配情况 sudo udevadm test-builtin net_setup_link /sys/class/net/wlan0

4.监控 udev 事件

bash

# 实时查看设备事件 sudo udevadm monitor --kernel --property --subsystem-match=net # 插入 WiFi 适配器时查看输出 sudo udevadm monitor --kernel --property

常见问题排查

问题 1:规则不执行

bash

# 1. 检查规则文件权限 ls -l /etc/udev/rules.d/90-wifi-hotspot.rules # 2. 检查语法错误 udevadm test /sys/class/net/wlan0 2>&1 | grep -A5 -B5 "error" # 3. 查看系统日志 journalctl -u systemd-udevd -f

问题 2:脚本执行失败

bash

# 1. 确保脚本有执行权限 chmod +x /usr/local/bin/setup-wifi-hotspot.sh # 2. 测试脚本手动运行 sudo /usr/local/bin/setup-wifi-hotspot.sh # 3. 检查脚本环境(udev 运行环境有限) # 在脚本开头添加日志 echo "$(date): Script started" >> /tmp/udev-debug.log

实际应用场景

1.设备权限管理

修改设备文件权限

bash

# /etc/udev/rules.d/10-my-devices.rules # USB设备读写权限 SUBSYSTEM=="usb", ATTR{idVendor}=="1234", ATTR{idProduct}=="5678", MODE="0666" # 串口权限 SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", MODE="0666", GROUP="dialout" # GPIO设备权限 SUBSYSTEM=="gpio*", PROGRAM="/bin/sh -c 'chown -R root:gpio /sys/class/gpio && chmod -R 770 /sys/class/gpio'"

为特定用户授权

bash

# 允许用户"developer"访问所有USB设备 SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", OWNER="developer" # 视频设备权限 SUBSYSTEM=="video4linux", GROUP="video", MODE="0660"

2.设备重命名和符号链接

创建持久化的设备名称

bash

# /etc/udev/rules.d/20-persistent-usb.rules # 根据序列号重命名USB设备 SUBSYSTEM=="tty", ATTRS{serial}=="A1234567", SYMLINK+="ttyMyDevice" # 根据位置重命名(USB端口) SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{devpath}=="1.1", SYMLINK+="ttyUSB_Printer" # 多规则组合 SUBSYSTEM=="block", ATTRS{model}=="My SSD*", SYMLINK+="disk/ssd%n" SUBSYSTEM=="block", KERNEL=="sd[a-z]", ATTRS{removable}=="1", SYMLINK+="usbdisk%n"

网络接口重命名

bash

# /etc/udev/rules.d/70-persistent-net.rules # 根据MAC地址重命名网络接口 SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="00:11:22:33:44:55", NAME="lan0" SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="aa:bb:cc:dd:ee:ff", NAME="wlan0"

3.自动挂载和卸载

USB存储设备自动挂载

bash

# /etc/udev/rules.d/11-usb-auto-mount.rules # USB插入时自动挂载 ACTION=="add", SUBSYSTEM=="block", KERNEL=="sd[b-z][0-9]", RUN+="/usr/bin/mount -t auto /dev/%k /media/usb-%k" # USB拔出时自动卸载 ACTION=="remove", SUBSYSTEM=="block", KERNEL=="sd[b-z][0-9]", RUN+="/usr/bin/umount -l /media/usb-%k" # 更安全的版本(检查文件系统类型) ACTION=="add", SUBSYSTEM=="block", KERNEL=="sd[a-z][0-9]", ENV{ID_FS_TYPE}=="vfat|ntfs|ext4", RUN+="/usr/bin/systemd-mount /dev/%k"

特定设备的特殊挂载点

bash

# 根据供应商/产品ID挂载到特定目录 SUBSYSTEM=="block", ATTRS{idVendor}=="abcd", ATTRS{idProduct}=="1234", ENV{ID_FS_UUID}=="A1B2C3D4", RUN+="/bin/mkdir -p /media/backup && /bin/mount /dev/%k /media/backup"

4.设备加载特定驱动

强制使用特定驱动

bash

# /etc/udev/rules.d/50-driver-override.rules # WiFi网卡强制使用特定驱动 SUBSYSTEM=="net", ACTION=="add", ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="8179", RUN+="/sbin/modprobe -b rtl8192cu" # USB转串口设备 SUBSYSTEM=="usb", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", RUN+="/sbin/modprobe ftdi_sio" # 摄像头设备 SUBSYSTEM=="video4linux", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="0825", RUN+="/sbin/modprobe uvcvideo"

阻止自动加载驱动

bash

# 阻止特定设备加载驱动 SUBSYSTEM=="usb", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="5678", ATTR{authorized}="0"

5.环境变量设置

为设备设置环境变量

bash

# /etc/udev/rules.d/90-env-vars.rules # 设置设备特定的环境变量 SUBSYSTEM=="usb", ATTRS{idVendor}=="abcd", ENV{MY_USB_DEVICE}="1" SUBSYSTEM=="tty", KERNEL=="ttyUSB0", ENV{SERIAL_PORT}="/dev/ttyUSB0" # 在应用中可以使用这些变量 ACTION=="add", SUBSYSTEM=="usb", ENV{ID_VENDOR_ID}=="1234", ENV{MYAPP_DEVICE_ADDED}="1"

6.设备状态监控和通知

设备事件通知

bash

# /etc/udev/rules.d/99-notify.rules # USB设备插入时发送通知 ACTION=="add", SUBSYSTEM=="usb", RUN+="/usr/bin/wall 'USB device inserted'" # 发送桌面通知 ACTION=="add", SUBSYSTEM=="usb", ENV{DISPLAY}=":0", ENV{XAUTHORITY}="/home/user/.Xauthority", RUN+="/usr/bin/notify-send 'USB Device' 'New device connected'" # 播放声音 ACTION=="add", SUBSYSTEM=="usb", RUN+="/usr/bin/aplay /usr/share/sounds/usb-insert.wav"

7.Zynq 平台专用规则

PL(可编程逻辑)设备管理

bash

# /etc/udev/rules.d/99-zynq.rules # FPGA bitstream 加载后的设备处理 SUBSYSTEM=="uio", ACTION=="add", KERNEL=="uio[0-9]*", MODE="0666" # AXI GPIO 设备权限 SUBSYSTEM=="gpio", KERNEL=="gpiochip*", PROGRAM="/bin/sh -c 'echo 0 > /sys/class/gpio/export && chmod 666 /sys/class/gpio/gpio0/value'" # DMA 设备配置 SUBSYSTEM=="dma", KERNEL=="xdma[0-9]*", MODE="0666", GROUP="video"

共享内存设备

bash

# 为共享内存设备设置权限 SUBSYSTEM=="misc", KERNEL=="u-dma-buf", MODE="0666"

8.高级匹配规则

使用 PROGRAM 测试

bash

# 执行外部程序并基于输出做决策 SUBSYSTEM=="usb", PROGRAM="/usr/bin/test_usb_type %p", RESULT=="storage", SYMLINK+="usbstorage" # 检查设备属性并设置标签 SUBSYSTEM=="block", PROGRAM="/usr/bin/blkid -o value -s LABEL %N", RESULT!="", SYMLINK+="disk/by-label-%c"

属性继承和父设备匹配

bash

# 匹配父设备的属性 SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", GOTO="ftdi_rules" # 使用 KERNELS(向上匹配) KERNELS=="1-1.2", SUBSYSTEM=="tty", SYMLINK+="ttyUSB_HubPort2" # 设备路径匹配 DEVPATH=="/devices/pci0000:00/0000:00:14.0/usb1/1-1", ACTION=="add", RUN+="/bin/echo 'Device at root hub port 1' > /tmp/udev.log"

9.系统配置调整

电源管理设置

bash

# /etc/udev/rules.d/80-power.rules # 禁用USB自动挂起 SUBSYSTEM=="usb", ATTR{power/control}="on" ACTION=="add", SUBSYSTEM=="usb", TEST=="power/control", ATTR{power/control}="auto" # 设置USB自动挂起超时 SUBSYSTEM=="usb", ATTR{power/autosuspend_delay_ms}="2000"

性能优化

bash

# 设置磁盘调度器 SUBSYSTEM=="block", KERNEL=="sd[a-z]", ACTION=="add", RUN+="/bin/echo deadline > /sys/block/%k/queue/scheduler" # SSD优化 SUBSYSTEM=="block", ATTRS{removable}=="0", ATTRS{queue/rotational}=="0", RUN+="/bin/echo 0 > /sys/block/%k/queue/rotational"

10.安全和限制规则

设备访问限制

bash

# 只允许特定设备 SUBSYSTEM=="usb", ENV{ID_VENDOR_ID}!="1234", ENV{ID_MODEL_ID}!="5678", ATTR{authorized}="0" # 限制特定USB设备 SUBSYSTEM=="usb", ATTRS{idVendor}=="abcd", ATTRS{idProduct}=="1234", ATTR{authorized}="0"

审计和日志

bash

# 记录所有USB设备连接 SUBSYSTEM=="usb", ACTION=="add", RUN+="/bin/logger -t udev 'USB device added: %E{ID_VENDOR} %E{ID_MODEL}'" # 记录设备移除 SUBSYSTEM=="usb", ACTION=="remove", RUN+="/bin/logger -t udev 'USB device removed'"

11.实用工具集成

自动备份

bash

# USB存储插入时自动备份 ACTION=="add", SUBSYSTEM=="block", KERNEL=="sd[b-z][0-9]", ENV{ID_FS_TYPE}=="ext4|vfat", RUN+="/usr/local/bin/auto_backup.sh %k" # auto_backup.sh 内容: #!/bin/bash DEVICE="$1" MOUNT_POINT="/media/backup_$(date +%Y%m%d_%H%M%S)" mkdir -p "$MOUNT_POINT" mount "/dev/$DEVICE" "$MOUNT_POINT" rsync -av /home/important_data/ "$MOUNT_POINT/backup/" umount "$MOUNT_POINT"

设备初始化

bash

# 设备首次使用时初始化 ACTION=="add", SUBSYSTEM=="block", KERNEL=="sd[b-z]", PROGRAM="/usr/bin/test -f /var/lib/first_use_%k", RESULT=="1", RUN+="/usr/local/bin/initialize_device.sh %k"

12.调试和测试规则

调试规则

bash

# 临时添加调试规则 SUBSYSTEM=="usb", ACTION=="add", RUN+="/bin/sh -c 'echo UDEV: %k added at $(date) >> /tmp/udev_debug.log'" SUBSYSTEM=="usb", ACTION=="remove", RUN+="/bin/sh -c 'echo UDEV: %k removed at $(date) >> /tmp/udev_debug.log'" # 记录完整设备信息 ACTION=="add|remove", RUN+="/bin/sh -c 'udevadm info -a -p %p >> /tmp/udev_full_info.log'"

13.实用脚本模板

udev 规则生成脚本

bash

#!/bin/bash # generate-udev-rules.sh VENDOR_ID="$1" PRODUCT_ID="$2" DEVICE_NAME="$3" cat > /etc/udev/rules.d/99-${DEVICE_NAME}.rules << EOF # Rules for ${DEVICE_NAME} SUBSYSTEM=="tty", ATTRS{idVendor}=="${VENDOR_ID}", ATTRS{idProduct}=="${PRODUCT_ID}", SYMLINK+="tty${DEVICE_NAME}" SUBSYSTEM=="tty", ATTRS{idVendor}=="${VENDOR_ID}", ATTRS{idProduct}=="${PRODUCT_ID}", MODE="0666" SUBSYSTEM=="usb", ATTRS{idVendor}=="${VENDOR_ID}", ATTRS{idProduct}=="${PRODUCT_ID}", ENV{ID_MM_DEVICE_IGNORE}="1" EOF echo "Rules created for ${DEVICE_NAME}"

14.规则调试命令

bash

# 查看设备信息 udevadm info -a -p $(udevadm info -q path -n /dev/ttyUSB0) # 测试规则匹配 udevadm test $(udevadm info -q path -n /dev/ttyUSB0) # 监控udev事件 udevadm monitor --property --subsystem-match=usb # 触发设备事件 udevadm trigger -v --type=subsystems --subsystem-match=usb

15.最佳实践建议

  1. 规则命名:使用数字前缀控制顺序(01-,50-,99-)

  2. 注释说明:每条规则添加注释

  3. 测试规则:先用udevadm test测试

  4. 避免冲突:检查现有规则避免重复

  5. 日志记录:复杂规则添加日志输出

  6. 错误处理:脚本中要有错误检查

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/7 19:06:12

基于 51 单片机温度控制电机搅拌系统设计

一、系统整体设计方案 本系统以 STC89C52RC 单片机为控制核心&#xff0c;聚焦化工实验、食品加工、溶液制备等场景的恒温搅拌需求&#xff0c;可实现温度实时采集&#xff08;0-100℃&#xff09;、目标温度设定、加热 / 制冷控制、电机搅拌启停与转速调节&#xff08;3 挡可调…

作者头像 李华
网站建设 2026/1/4 17:51:38

基于单片机温湿度阳光 CO 瓦斯气压光照环境监测系统设计

一、系统整体设计方案 本系统以 STM32F103C8T6 单片机为控制核心&#xff0c;聚焦工业车间、家庭厨房、地下实验室等多场景的全面环境监测需求&#xff0c;可实现温湿度、阳光强度、CO 浓度、瓦斯浓度、大气压力、光照强度 6 项参数同步采集、实时显示、异常报警及数据存储功能…

作者头像 李华
网站建设 2025/12/31 17:41:44

各省市GDP最低城市,其中有你的城市吗?

一张地图&#xff0c;直观揭示了我国区域经济的另一个剖面&#xff1a;在省域内部&#xff0c;发展同样存在不均衡。这些“省内经济洼地”的规模与成因各异&#xff0c;共同构成了中国经济的基底图谱。 数据显示&#xff0c;各省最低城市的经济体量差距巨大。 江苏的“末位”…

作者头像 李华
网站建设 2025/12/30 14:25:59

Paperzz 毕业论文:把 “毕业劫” 拆成 “四步走” 的无痛毕业指南

Paperzz-AI官网免费论文查重复率AIGC检测/开题报告/文献综述/论文初稿 paperzz - 毕业论文-AIGC论文检测-AI智能降重-ai智能写作https://www.paperzz.cc/dissertation “开题被打回 3 次&#xff0c;文献格式改到眼瞎&#xff0c;数据跑不出结果只能熬夜凑字数”—— 这届毕业…

作者头像 李华
网站建设 2025/12/30 14:22:11

自考必备!8个AI论文工具助你轻松搞定格式规范!

自考必备&#xff01;8个AI论文工具助你轻松搞定格式规范&#xff01; 自考路上的得力助手&#xff1a;AI 工具如何助你轻松应对论文挑战 在自考过程中&#xff0c;论文写作往往是许多考生面临的最大难题之一。无论是格式规范、内容逻辑&#xff0c;还是语言表达&#xff0c;都…

作者头像 李华
网站建设 2026/1/11 23:32:53

学云计算需要用什么配置的电脑?

学习云计算时&#xff0c;电脑是我们必不可少的工具之一&#xff0c;但并非所有的电脑都可以满足专业学习和实践操作的需要&#xff0c;所以选择电脑也需要多方面考虑&#xff0c;那么学云计算需要用什么配置的电脑?请看下文。1、处理器云计算涉及虚拟机的运行、编程开发和数据…

作者头像 李华