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 规则。

相关推荐
2401_831501731 小时前
Linux之Docker虚拟化技术(一)
java·linux·docker
阳光阴郁大boy1 小时前
前端实现Linux查询平台:打造高效运维工作流
linux·运维·服务器
CYRUS_STUDIO2 小时前
使用 readelf 分析 so 文件:ELF 结构解析全攻略
android·linux·逆向
博语小屋3 小时前
回车换行、缓冲区刷新、倒计时小程序
linux
幸运狗头3 小时前
Linux学习-TCP并发服务器构建
linux·服务器·学习
林政硕(Cohen0415)4 小时前
使用docker搭建嵌入式Linux开发环境
linux·docker·sdk·嵌入式linux
The_Second_Coming4 小时前
最小化 CentOS 模板虚拟机安装与配置
linux·运维·服务器·学习·centos·云计算
tan_jianhui5 小时前
在Ubuntu中安装配置MySql Server
linux·ubuntu·adb
问道飞鱼6 小时前
【Linux知识】Linux 设置账号密码永不过期
linux·账号·过期·密码过期