udev 从入门到精通,3天学习计划

这是一个完整的 3天学习教程 ,包括:讲解 → 实践 → 练习 → 常见问题 FAQ。

目标是让你 3 天内从 入门 → 熟悉规则 → 能编写自定义 udev 规则并调试


🗓️ Linux udev 三天学习教程


📌 Day 1: udev 基础概念与工具使用

🎯 学习目标

  • 理解 udev 在 Linux 系统中的作用
  • 学会查看设备信息
  • 掌握基础 udevadm 命令

1.1 什么是 udev

  • udev 是 Linux 的设备管理器

  • 它在 内核检测到新设备时(如 USB 插入、磁盘挂载、网卡加载)动态创建设备文件(/dev/xxx)

  • udev 规则(rules)决定设备文件的:

    • 命名方式
    • 权限(chmod)
    • 所属用户/组
    • 是否执行额外脚本

1.2 基础工具

  • udevadm info -- 获取设备信息
  • udevadm monitor -- 实时监听 udev 事件
  • udevadm trigger -- 手动触发事件
  • udevadm control -- 控制守护进程

1.3 实践

例1:查看一个 USB 设备的属性
css 复制代码
udevadm info --query=all --name=/dev/sdb

输出会包含:

  • ID_MODEL=SanDisk_Ultra
  • ID_SERIAL=xxxx
  • DEVPATH=/devices/.../usb1/1-2/...
例2:实时监听

插入一个 U 盘,运行:

css 复制代码
udevadm monitor --environment --udev

会看到 ACTION=add 事件,以及设备属性。


1.4 今日练习

  1. udevadm info 查看不同设备(USB、NVMe、网络卡)的属性。
  2. 运行 udevadm monitor,插拔 USB,看事件输出。

1.5 FAQ

  • Q: 为什么 /dev/sdb 有时变成 /dev/sdc
    A: 内核分配设备名是动态的,顺序不同会导致变化 → 用 udev 自定义固定命名。
  • Q: udevadm monitor 看不到事件?
    A: 确保是 --udev 模式,不要只写 --kernel


📌 Day 2: 编写 udev 规则

🎯 学习目标

  • 掌握 udev 规则语法
  • 学会固定设备命名
  • 能设置权限和执行脚本

2.1 规则文件位置

  • /etc/udev/rules.d/ → 本地自定义规则
  • /usr/lib/udev/rules.d/ → 系统规则(不要改)

规则文件名格式:

复制代码
NN-name.rules

其中 NN 为数字,越小优先级越高。


2.2 udev 规则语法

复制代码
匹配条件 , 匹配条件 , ... , 操作
常用匹配条件
  • KERNEL=="sdb*" → 按内核设备名匹配
  • ATTR{serial}=="123456" → 按属性匹配
  • SUBSYSTEM=="usb" → 匹配子系统
  • ENV{ID_MODEL}=="Ultra" → 匹配环境变量
常用操作
  • NAME="mydisk%n" → 重命名设备
  • SYMLINK+="usbdrive" → 创建符号链接
  • MODE="0660" → 设置权限
  • GROUP="users" → 设置组
  • RUN+="/path/to/script.sh" → 插入时执行脚本

2.3 实践

例1:为 USB 固定名字

创建文件 /etc/udev/rules.d/99-usb.rules

ini 复制代码
SUBSYSTEM=="block", ATTRS{serial}=="1234567890", SYMLINK+="usbdata"

重载:

sql 复制代码
udevadm control --reload-rules
udevadm trigger

现在 /dev/usbdata 永远指向这块 U 盘。

例2:自动执行脚本
ini 复制代码
ACTION=="add", KERNEL=="sdb*", RUN+="/usr/local/bin/mount_usb.sh"

2.4 今日练习

  1. 写一个规则让 USB 插入时自动生成 /dev/myusb 链接。
  2. 写一个规则让 /dev/input/event* 的权限为 0666。

2.5 FAQ

  • Q: 改了规则为什么没生效?
    A: 必须 udevadm control --reload-rules && udevadm trigger
  • Q: RUN+= 的脚本不执行?
    A: 确保脚本有执行权限,且不能有交互操作(如 read)。


📌 Day 3: 高级应用与调试

🎯 学习目标

  • 掌握复杂规则写法
  • 学会调试 udev
  • 能结合 systemd 使用

3.1 调试 udev

  • 查看日志:

    journalctl -u systemd-udevd -f

  • 测试规则匹配:

bash 复制代码
udevadm test /sys/class/block/sdb

3.2 高级用法

按多个条件匹配
ini 复制代码
SUBSYSTEM=="block", ENV{ID_MODEL}=="Ultra", ATTR{size}=="12345678", SYMLINK+="backupdisk"
按 net 设备改名
ini 复制代码
SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="00:11:22:33:44:55", NAME="eth0"
与 systemd 联动
ini 复制代码
ACTION=="add", KERNEL=="sdb*", TAG+="systemd", ENV{SYSTEMD_WANTS}="usb-backup.service"

这会在插入 U 盘时触发 systemd 启动 usb-backup.service


3.3 今日练习

  1. 写规则让某个 MAC 地址的网卡固定为 net0
  2. 写规则让插入 USB 自动触发 systemd service。
  3. udevadm test 调试规则生效情况。

3.4 FAQ

  • Q: 为什么网卡改名不生效?
    A: 新内核使用 predictable network names,需要覆盖默认规则。
  • Q: systemd service 不触发?
    A: 确保 TAG+="systemd"ENV{SYSTEMD_WANTS} 正确。

✅ 总结

  • Day 1: 熟悉工具、理解事件
  • Day 2: 学会写规则(重命名、权限、执行脚本)
  • Day 3: 进阶(调试、systemd 联动、复杂匹配)

练习后,你就能在 SLES/RHEL/Ubuntu 上编写和调试自定义 udev 规则。

相关推荐
Shingmc31 小时前
【Linux】线程互斥与同步
linux
Vect__8 小时前
深刻理解进程、线程、程序
linux
末日汐9 小时前
传输层协议UDP
linux·网络·udp
zzzsde11 小时前
【Linux】库的制作和使用(3)ELF&&动态链接
linux·运维·服务器
CQU_JIAKE11 小时前
4.3【A]
linux·运维·服务器
qing2222222212 小时前
Linux中修改mysql数据表
linux·运维·mysql
Alvin千里无风12 小时前
在 Ubuntu 上从源码安装 Nanobot:轻量级 AI 助手完整指南
linux·人工智能·ubuntu
杨云龙UP12 小时前
Oracle 中 NOMOUNT、MOUNT、OPEN 怎么理解? 在不同场景下如何操作?_20260402
linux·运维·数据库·oracle
Amctwd12 小时前
【Linux】OpenCode 安装教程
linux·运维·服务器
wwj888wwj13 小时前
Docker基础(复习)
java·linux·运维·docker