当前位置: 首页 > news >正文

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. 错误处理:脚本中要有错误检查

http://www.jsqmd.com/news/165779/

相关文章:

  • 2025年河北公共卫生间隔断安装公司推荐:公共卫生间隔断报价/商场卫生间隔断包工/铝蜂窝卫生间隔断/商场卫生间隔断包料/商场卫生间隔断服务商精选 - 品牌推荐官
  • 自考人必看!9个降AI率工具推荐,高效避坑指南
  • 2025最新淀粉衍生物三剑客推荐 TOP5:预糊化淀粉/黄糊精/白糊精合规厂家清单 - 深度智识库
  • 突发|Meta 官宣引入 Manus:创始人出任副总裁,核心团队整体并入
  • 何为 SRC?挖漏洞为何屡屡受挫?需规避哪些问题?
  • 怎样才能成为一名黑客?新手必掌握的 12 个基础步骤
  • 网络安全快速入门路径:聚焦三个关键动作,实现两个月高效突破
  • 智能装备工厂10个研发人员用SolidWorks如何共享一台服务器算力和资源
  • 寄化妆品到中国香港哪家好——竞速物流,专业邮寄化妆品,敏感货无忧直达 - 深度智识库
  • 社区公告推送小程序,输入公告信息,自动推送给小区用户,支持点赞和评论,解决社区公告传达不及时的问题。
  • 从基础到实践:信息系统安全风险防范的十大常用技术剖析
  • 彻底搞懂大语言模型(LLM)与Transformer架构的原理与应用!
  • “网络安全”到底是做什么的?揭秘主要岗位职责与入门成长路线图
  • 系统性打败碎片化:Linux运维核心技能体系深度梳理
  • 毕业论文 “无痛通关”:从选题到成稿,藏在 paperzz 毕业论文里的 4 步 “躺平式” 写作法
  • 【独家揭秘】最新研究出炉:大模型LLM如何在关键时刻实现深度思考?
  • 驶入黄金赛道:网络安全主要岗位详解及行业前景洞察
  • leetcode 816. Ambiguous Coordinates 模糊坐标
  • 【AI×实时Linux:极速实战宝典】硬件分区 - 使用 NVIDIA MIG (Multi-Instance GPU) 在物理层隔离不同 AI 任务
  • leetcode 817. Linked List Components 链表组件-耗时100%
  • 驾驭无形风险:网络安全前沿趋势分析与企业防御战略指南
  • GESP认证C++编程真题解析 | B4451 [GESP202512 四级] 建造
  • 软/硬中断计数、softnet_stat、socket 队列、吞吐量、CPU 使用率、offload状态
  • 知网AIGC爆红怎么办?2025最新论文降AI全攻略(附免费手改+工具实测)
  • 【AI×实时Linux:极速实战宝典】显存池 - 编写自定义 Allocator 预分配全量显存,杜绝运行时的 cudaMalloc 开销
  • Elastic 即代码:自动化的不只是基础设施
  • 2025年焊管厂家推荐榜:镍基合金/厚壁/不锈钢/特材/大口径/钛合金/复合不锈钢材料/直缝焊管源头厂家精选 - 品牌推荐官
  • 2025年母线槽生产厂家实力推荐:江苏祥丰电器有限公司,专注耐火/密集/高压/铝合金/封闭式母线槽源头厂家精选 - 品牌推荐官
  • 普源数字万用表DM858E接地电阻测量技巧
  • 2025年口碑好的铝合金地垫制造企业推荐,高品质铝合金地垫生产厂家全解析 - 工业品牌热点