白城市网站建设_网站建设公司_悬停效果_seo优化
2025/12/30 14:33:38 网站建设 项目流程

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询