这是一个完整的 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 今日练习
- 用
udevadm info
查看不同设备(USB、NVMe、网络卡)的属性。 - 运行
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 今日练习
- 写一个规则让 USB 插入时自动生成
/dev/myusb
链接。 - 写一个规则让
/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 今日练习
- 写规则让某个 MAC 地址的网卡固定为
net0
。 - 写规则让插入 USB 自动触发 systemd service。
- 用
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 规则。